GuiSliderCtrl.cpp
上传用户:zhanglf88
上传日期:2013-11-19
资源大小:6036k
文件大小:12k
源码类别:

金融证券系统

开发平台:

Visual C++

  1. //-----------------------------------------------------------------------//
  2. // This is a part of the GuiLib MFC Extention.  //
  3. // Autor  :  Francisco Campos  //
  4. // (C) 2002 Francisco Campos <www.beyondata.com> All rights reserved     //
  5. // This code is provided "as is", with absolutely no warranty expressed  //
  6. // or implied. Any use is at your own risk.  //
  7. // You must obtain the author's consent before you can include this code //
  8. // in a software library.  //
  9. // If the source code in  this file is used in any application  //
  10. // then acknowledgement must be made to the author of this program  //
  11. // fcampos@tutopia.com  //
  12. //-----------------------------------------------------------------------//
  13. #include "stdafx.h"
  14. #include "GuiSliderCtrl.h"
  15. #ifdef _DEBUG
  16. #define new DEBUG_NEW
  17. #undef THIS_FILE
  18. static char THIS_FILE[] = __FILE__;
  19. #endif
  20. /////////////////////////////////////////////////////////////////////////////
  21. // CGuiSliderCtrl
  22. /*
  23. typedef struct tagNMCUSTOMDRAWINFO
  24. {
  25. NMHDR hdr;
  26. DWORD dwDrawStage;
  27. HDC hdc;
  28. RECT rc;
  29. DWORD dwItemSpec;  // this is control specific, but it's how to specify an item.  valid only with CDDS_ITEM bit set
  30. UINT  uItemState;
  31. LPARAM lItemlParam;
  32. } NMCUSTOMDRAW, FAR * LPNMCUSTOMDRAW;
  33. */
  34. CGuiSliderCtrl::CGuiSliderCtrl()
  35. {
  36. bSelected=FALSE;
  37. m_clrGreen=RGB(0,198,0);  //verder
  38. m_clrOrange=RGB(255,193,111); //no tan naranja
  39. m_Press=FALSE;
  40. }
  41. CGuiSliderCtrl::~CGuiSliderCtrl()
  42. {
  43. }
  44. BEGIN_MESSAGE_MAP(CGuiSliderCtrl, CSliderCtrl)
  45. //{{AFX_MSG_MAP(CGuiSliderCtrl)
  46. ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomdraw)
  47. ON_WM_MOUSEMOVE()
  48. ON_WM_TIMER()
  49. ON_WM_LBUTTONDOWN()
  50. ON_WM_LBUTTONUP()
  51. //}}AFX_MSG_MAP
  52. END_MESSAGE_MAP()
  53. /////////////////////////////////////////////////////////////////////////////
  54. // CGuiSliderCtrl message handlers
  55. void CGuiSliderCtrl::OnCustomdraw(NMHDR* pNMHDR, LRESULT* pResult) 
  56. {
  57. LPNMCUSTOMDRAW lpcd = (LPNMCUSTOMDRAW)pNMHDR;
  58. CDC* pDC=CDC::FromHandle(lpcd->hdc);
  59. CRect rcClient=lpcd->rc;
  60. UINT dwItemSpec=lpcd->dwItemSpec;
  61. DWORD dwDrawStage=lpcd->dwDrawStage;
  62. UINT    uItemState=lpcd->uItemState;
  63. //bSelected= uItemState & CDIS_FOCUS ? TRUE:FALSE;
  64. //------------------------------------------------
  65. //aun no se puede pintar el control
  66. //------------------------------------------------
  67. if (dwDrawStage == CDDS_PREPAINT)
  68. {
  69. *pResult = CDRF_NOTIFYITEMDRAW;         
  70. return;
  71. }
  72. //-----------------------------------------------
  73. //intentelo ahora
  74. //-----------------------------------------------
  75. if (dwDrawStage == CDDS_ITEMPREPAINT)
  76. {
  77. if (dwItemSpec == TBCD_TICS)
  78. {
  79. *pResult = CDRF_DODEFAULT;
  80. return;
  81. }
  82. else if (dwItemSpec ==  TBCD_THUMB)
  83. {
  84. *pResult = CDRF_SKIPDEFAULT;
  85. if (rcClient.Height() > rcClient.Width())
  86. DrawVThumb(pDC, rcClient);
  87. else
  88. DrawHThumb(pDC, rcClient);
  89. return;
  90. }
  91. else if (dwItemSpec == TBCD_CHANNEL)
  92. {
  93. *pResult = CDRF_SKIPDEFAULT;
  94. pDC->Draw3dRect(&rcClient,m_dl.GetRGBPressBXP(),::GetSysColor(COLOR_BTNHIGHLIGHT));
  95. return;
  96. }
  97. }
  98. }
  99. void CGuiSliderCtrl::DrawHThumb(CDC* pDC,CRect rcClient)
  100. {
  101. //------------------------------------------
  102. //prefiero todo a pulso
  103. //------------------------------------------
  104. CPen cpGreen(PS_SOLID,1,m_clrGreen);
  105. CPen cpOrange(PS_SOLID,1,m_clrOrange);
  106. CPen cp(PS_SOLID,1,m_dl.GetRGBPressBXP());
  107. CPen cpFondo(PS_SOLID,1,m_dl.GetRGBFondoXP());
  108. CPen cpSombra(PS_SOLID,1,RGB(225,225,225));
  109. CPen cpSombraDark(PS_SOLID,1,RGB(200,200,200));
  110. CPen* pOld;
  111. CBrush cb;
  112. //se pinta arriba y luego por la derecha
  113. //vertice left,top
  114. pOld=pDC->SelectObject(&cp);
  115. int nMedio=rcClient.Width()-7;
  116. //------------------------------------------
  117. //pintar el fondo estilo  xp
  118. //------------------------------------------
  119. rcClient.bottom--;
  120. CRect m_rectTemp=rcClient;
  121. m_rectTemp.right-=5;
  122. cb.CreateSolidBrush(m_dl.GetRGBColorXP());
  123. pDC->FillRect(&m_rectTemp,&cb);
  124. //*************************************************
  125. // -
  126. pDC->MoveTo(rcClient.left+1,rcClient.top);
  127. pDC->LineTo(rcClient.left+nMedio,rcClient.top);
  128. // |
  129. pDC->MoveTo(rcClient.left,rcClient.top+1);
  130. pDC->LineTo(rcClient.left,rcClient.bottom);
  131. // -
  132. pDC->MoveTo(rcClient.left+1,rcClient.bottom);
  133. pDC->LineTo(rcClient.left+nMedio,rcClient.bottom);
  134. //Algo de sombra
  135. pDC->SelectObject(&cpSombraDark);
  136. pDC->MoveTo(rcClient.left+1,rcClient.top+1);
  137. pDC->LineTo(rcClient.left+nMedio,rcClient.top+1);
  138. pDC->SelectObject(&cpSombra);
  139. pDC->MoveTo(rcClient.left+1,rcClient.top+2);
  140. pDC->LineTo(rcClient.left+nMedio,rcClient.top+2);
  141. pDC->MoveTo(rcClient.left+1,rcClient.bottom-1);
  142. pDC->LineTo(rcClient.left+nMedio,rcClient.bottom-1);
  143. //-----------------------------------------------------------
  144. //se pinta los colores de acuerdo al la seleccion del boton
  145. //naranja si se selecciona y verde normal, en la parte superior
  146. //-----------------------------------------------------------
  147. rcClient.DeflateRect(1,1);
  148. pDC->SelectObject(bSelected!=TRUE?&cpGreen:&cpOrange);
  149. for (int i=0; i<3;i++)
  150. {
  151. pDC->MoveTo(rcClient.left+i,rcClient.top);
  152. pDC->LineTo(rcClient.left+i,rcClient.bottom+1);
  153. }
  154. rcClient.InflateRect(1,1);
  155. pDC->SelectObject(&cp);
  156. //-------------------------------------------------------------
  157. //se pinta la punta
  158. //-------------------------------------------------------------
  159. for (int y =0; y<5;y++)
  160. {
  161. pDC->SetPixel(rcClient.left+nMedio+y,rcClient.top+y,m_dl.GetRGBPressBXP());
  162. pDC->SetPixel(rcClient.left+nMedio+y,rcClient.bottom-y,m_dl.GetRGBPressBXP());
  163. }
  164. pDC->SetPixel(rcClient.left+nMedio+y,rcClient.bottom-y,m_dl.GetRGBPressBXP());
  165. //pDC->SetPixel(rcClient.right-y,rcClient.top+nMedio+y,m_dl.GetRGBPressBXP());
  166. //********************************************************
  167. //-----------------------------------------------------------
  168. //se pinta los colores de acuerdo al la seleccion del boton
  169. //naranja si se selecciona y verde normal
  170. //-----------------------------------------------------------
  171. pDC->SelectObject(bSelected!=TRUE?&cpGreen:&cpOrange);
  172. for (y =0; y<5;y++)
  173. {
  174. pDC->SetPixel(rcClient.left+nMedio+y,(rcClient.top+y)+1,
  175. bSelected!=TRUE?m_clrGreen:m_clrOrange);
  176. pDC->SetPixel((rcClient.left+nMedio+y),(rcClient.bottom-y)-1,
  177. bSelected!=TRUE?m_clrGreen:m_clrOrange);
  178. }
  179. //-----------------------------------------------------------
  180. //se pinta sombra a la punta para dar un aspecto mas grueso 
  181. //al boton
  182. //-----------------------------------------------------------
  183. pDC->SelectObject(bSelected!=TRUE?&cpGreen:&cpOrange);
  184. for (y =0; y<4;y++)
  185. {
  186. pDC->SetPixel(rcClient.left+nMedio+y,(rcClient.top+y)+2,
  187. RGB(225,225,225));
  188. pDC->SetPixel(rcClient.left+nMedio+y,(rcClient.bottom-y)-2,
  189. RGB(200,200,200));
  190. }
  191. pDC->SelectObject(pOld);
  192. }
  193. void CGuiSliderCtrl::DrawVThumb(CDC* pDC,CRect rcClient)
  194. {
  195. //------------------------------------------
  196. //prefiero todo a pulso
  197. //------------------------------------------
  198. CPen cpGreen(PS_SOLID,1,m_clrGreen);
  199. CPen cpOrange(PS_SOLID,1,m_clrOrange);
  200. CPen cp(PS_SOLID,1,m_dl.GetRGBPressBXP());
  201. CPen cpFondo(PS_SOLID,1,m_dl.GetRGBFondoXP());
  202. CPen cpSombra(PS_SOLID,1,RGB(225,225,225));
  203. CPen cpSombraDark(PS_SOLID,1,RGB(200,200,200));
  204. CPen* pOld;
  205. CBrush cb;
  206. //se pinta arriba y luego por la derecha
  207. //vertice left,top
  208. pOld=pDC->SelectObject(&cp);
  209. int nMedio=rcClient.Height()-7;
  210. //------------------------------------------
  211. //pintar el fondo estilo  xp
  212. //------------------------------------------
  213. rcClient.right-=1;
  214. rcClient.bottom++;
  215. CRect m_rectTemp=rcClient;
  216. m_rectTemp.bottom-=5;
  217. m_rectTemp.DeflateRect(1,1);
  218. cb.CreateSolidBrush(m_dl.GetRGBColorXP());
  219. pDC->FillRect(&m_rectTemp,&cb);
  220. //*************************************************
  221. // -
  222. pDC->MoveTo(rcClient.left+1,rcClient.top);
  223. pDC->LineTo(rcClient.right,rcClient.top);
  224. // |
  225. pDC->MoveTo(rcClient.left,rcClient.top+1);
  226. pDC->LineTo(rcClient.left,rcClient.top+nMedio);
  227. // |
  228. pDC->MoveTo(rcClient.right,rcClient.top+1);
  229. pDC->LineTo(rcClient.right,rcClient.top+nMedio);
  230. //Algo de sombra
  231. pDC->SelectObject(&cpSombraDark);
  232. pDC->MoveTo(rcClient.right-1,rcClient.top+1);
  233. pDC->LineTo(rcClient.right-1,rcClient.top+nMedio+2);
  234. pDC->SelectObject(&cpSombra);
  235. pDC->MoveTo(rcClient.right-2,rcClient.top+1);
  236. pDC->LineTo(rcClient.right-2,rcClient.top+nMedio+2);
  237. pDC->MoveTo(rcClient.left+1,rcClient.top+1);
  238. pDC->LineTo(rcClient.left+1,rcClient.top+nMedio);
  239. //-----------------------------------------------------------
  240. //se pinta los colores de acuerdo al la seleccion del boton
  241. //naranja si se selecciona y verde normal, en la parte superior
  242. //-----------------------------------------------------------
  243. rcClient.DeflateRect(1,1);
  244. pDC->SelectObject(bSelected!=TRUE?&cpGreen:&cpOrange);
  245. for (int i=0; i<3;i++)
  246. {
  247. pDC->MoveTo(rcClient.left,rcClient.top+i);
  248. pDC->LineTo(rcClient.right+1,rcClient.top+i);
  249. }
  250. rcClient.InflateRect(1,1);
  251. pDC->SelectObject(&cp);
  252. //-------------------------------------------------------------
  253. //se pinta la punta
  254. //-------------------------------------------------------------
  255. for (int y =0; y<5;y++)
  256. {
  257. pDC->SetPixel(rcClient.left+y,rcClient.top+nMedio+y,m_dl.GetRGBPressBXP());
  258. pDC->SetPixel(rcClient.right-y,rcClient.top+nMedio+y,m_dl.GetRGBPressBXP());
  259. }
  260. pDC->SetPixel(rcClient.right-y,rcClient.top+nMedio+y,m_dl.GetRGBPressBXP());
  261. //********************************************************
  262. //-----------------------------------------------------------
  263. //se pinta los colores de acuerdo al la seleccion del boton
  264. //naranja si se selecciona y verde normal
  265. //-----------------------------------------------------------
  266. pDC->SelectObject(bSelected!=TRUE?&cpGreen:&cpOrange);
  267. for (y =0; y<5;y++)
  268. {
  269. pDC->SetPixel((rcClient.left+y)+1,rcClient.top+nMedio+y,
  270. bSelected!=TRUE?m_clrGreen:m_clrOrange);
  271. pDC->SetPixel((rcClient.right-y)-1,(rcClient.top+nMedio+y),
  272. bSelected!=TRUE?m_clrGreen:m_clrOrange);
  273. }
  274. //-----------------------------------------------------------
  275. //se pinta sombra a la punta para dar un aspecto mas grueso 
  276. //al boton
  277. //-----------------------------------------------------------
  278. pDC->SelectObject(bSelected!=TRUE?&cpGreen:&cpOrange);
  279. for (y =0; y<4;y++)
  280. {
  281. pDC->SetPixel((rcClient.left+y)+2,rcClient.top+nMedio+y,
  282. RGB(225,225,225));
  283. pDC->SetPixel((rcClient.right-y)-2,rcClient.top+nMedio+y,
  284. RGB(200,200,200));
  285. }
  286. pDC->SelectObject(pOld);
  287. //uff!!!, que rutina tan aburridora de hacer!!!! 
  288. }
  289. void CGuiSliderCtrl::OnMouseMove(UINT nFlags, CPoint point) 
  290. {
  291. // TODO: Add your message handler code here and/or call default
  292. if (bSelected==TRUE)
  293. return;
  294. CRect rc;
  295. GetClientRect(&rc);
  296. if (rc.PtInRect(point))
  297. {
  298. bSelected=TRUE;
  299. Invalidate();
  300. UpdateWindow();
  301. SetTimer(1,100,NULL);
  302. }
  303. CSliderCtrl::OnMouseMove(nFlags, point);
  304. }
  305. void CGuiSliderCtrl::OnTimer(UINT nIDEvent) 
  306. {
  307. // TODO: Add your message handler code here and/or call default
  308. CRect m_rect;
  309. CPoint pt(GetMessagePos());
  310. ScreenToClient(&pt);
  311. GetClientRect(m_rect);
  312. if (!m_rect.PtInRect(pt))
  313. {
  314. bSelected=FALSE;
  315. Invalidate();
  316. UpdateWindow();
  317. KillTimer(1);
  318. }
  319. CSliderCtrl::OnTimer(nIDEvent);
  320. }
  321. void CGuiSliderCtrl::OnLButtonDown(UINT nFlags, CPoint point) 
  322. {
  323. // TODO: Add your message handler code here and/or call default
  324. if (bSelected==FALSE)
  325. {
  326. bSelected=TRUE;
  327. Invalidate();
  328. UpdateWindow();
  329. }
  330. CSliderCtrl::OnLButtonDown(nFlags, point);
  331. }
  332. void CGuiSliderCtrl::OnLButtonUp(UINT nFlags, CPoint point) 
  333. {
  334. // TODO: Add your message handler code here and/or call default
  335. bSelected=FALSE;
  336. Invalidate();
  337. UpdateWindow();
  338. KillTimer(1);
  339. CSliderCtrl::OnLButtonUp(nFlags, point);
  340. }