GuiSliderCtrl.cpp
上传用户:wlkj888
上传日期:2022-08-01
资源大小:806k
文件大小:12k
源码类别:

对话框与窗口

开发平台:

Visual C++

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