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

对话框与窗口

开发平台:

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 "GuiCheckBox.h"
  24. #ifdef _DEBUG
  25. #define new DEBUG_NEW
  26. #undef THIS_FILE
  27. static char THIS_FILE[] = __FILE__;
  28. #endif
  29. /////////////////////////////////////////////////////////////////////////////
  30. // CGuiCheckBox
  31. CGuiCheckBox::CGuiCheckBox()
  32. {
  33. m_bCheckBtn = FALSE;
  34. m_bPressBtn = FALSE;
  35. m_bOldTemp  = FALSE;
  36. m_clrHigh   = ::GetSysColor(COLOR_HIGHLIGHT);
  37. m_clrCheck  = RGB(0, 170, 170);
  38. m_bSelected = FALSE;
  39. }
  40. CGuiCheckBox::~CGuiCheckBox()
  41. {
  42. }
  43. BEGIN_MESSAGE_MAP(CGuiCheckBox, CButton)
  44. //{{AFX_MSG_MAP(CGuiCheckBox)
  45. ON_WM_ERASEBKGND()
  46. ON_WM_CREATE()
  47. ON_WM_LBUTTONDOWN()
  48. ON_WM_LBUTTONUP()
  49. ON_WM_TIMER()
  50. ON_WM_MOUSEMOVE()
  51. //}}AFX_MSG_MAP
  52. END_MESSAGE_MAP()
  53. /////////////////////////////////////////////////////////////////////////////
  54. // CGuiCheckBox message handlers
  55. void CGuiCheckBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
  56. {
  57. CDC *pDC         = CDC::FromHandle(lpDrawItemStruct->hDC);
  58. CRect m_rcClient(lpDrawItemStruct->rcItem);
  59. UINT m_State     = lpDrawItemStruct->itemState;
  60. CBrush cb;
  61. CRect m_rcTemp(m_rcClient);
  62. CPoint pt;
  63. CSize  m_Csize;
  64. CString m_szCaption;
  65. COLORREF m_Over = RGB(255, 193, 111);
  66. CPen cpOver(PS_SOLID, 1, RGB(255, 193, 111));
  67. int iMode      = pDC->SetBkMode(TRANSPARENT);
  68. int iExtile    = GetButtonStyle(); // obtenemos orientaci髇 del texto
  69. CRect m_rcText(m_rcClient);
  70. GetWindowText(m_szCaption);
  71. if (m_szCaption.GetLength() > 1)
  72. m_Csize= pDC->GetTextExtent(m_szCaption);
  73. // de acuerdo a la alineaci髇 del texto prepare la ubicaci髇
  74. // del texto para Drawtex y DrawState
  75. if (m_rcClient.Height() > 13)
  76. {
  77. int Dif = m_rcClient.Height() - 13;
  78. Dif /= 2;
  79. m_rcTemp.top = Dif;
  80. m_rcTemp.bottom = m_rcTemp.top + 13;
  81. }
  82. if (iExtile & BS_LEFTTEXT)
  83. {
  84. m_rcTemp.left= m_rcTemp.right - 13;
  85. pt = CPoint(m_rcTemp.left, m_rcTemp.top + 1);
  86. }
  87. else
  88. {
  89. m_rcTemp.right= m_rcTemp.left + 13;
  90. pt = CPoint(m_rcTemp.right + 2, m_rcTemp.top + 1);
  91. m_rcText.left = m_rcTemp.right + 1;
  92. }
  93. // draw frame of checkbox
  94. pDC->Draw3dRect(m_rcTemp, m_clrHigh, m_clrHigh);
  95. m_rcTemp.DeflateRect(1, 1);
  96. DrawOrange(pDC, m_rcTemp);
  97. m_rcTemp.DeflateRect(1, 1);
  98. if (lpDrawItemStruct->itemState & ODS_DISABLED)
  99. pDC->DrawState(pt, m_Csize, m_szCaption, DSS_DISABLED, TRUE, 0, (HBRUSH)NULL);
  100. else 
  101. {
  102. pDC->DrawText(m_szCaption, m_rcText, DT_SINGLELINE | DT_LEFT | DT_VCENTER);    
  103. if (lpDrawItemStruct->itemState & ODS_SELECTED)
  104. {
  105. if (m_bOldTemp == TRUE)
  106. DrawCheck(pDC, m_rcTemp);
  107. }
  108. else
  109. {
  110. if (m_bCheckBtn == TRUE && m_bPressBtn == FALSE)
  111. DrawCheck(pDC, m_rcTemp);
  112. else
  113. {
  114. if (m_bOldTemp == TRUE && m_bPressBtn == TRUE)
  115. DrawCheck(pDC, m_rcTemp);
  116. }
  117. }
  118. }
  119. }
  120. void CGuiCheckBox::DrawCheck(CDC* pDC, CRect m_rcTemp)
  121. {
  122. int iMediaAltura = (m_rcTemp.Height()/2) - 2;
  123. int iMedioBox= m_rcTemp.Width()/2;
  124. CPen cp(PS_SOLID, 1, m_clrCheck);
  125. CPen *pOld = pDC->SelectObject(&cp);
  126. pDC->MoveTo(m_rcTemp.left + 1, m_rcTemp.top + iMediaAltura + 3);
  127. pDC->LineTo(m_rcTemp.left + 3, m_rcTemp.bottom - 2);
  128. pDC->MoveTo(m_rcTemp.left + 3, m_rcTemp.bottom - 2);
  129. pDC->LineTo(m_rcTemp.right - 1, m_rcTemp.top + 2);
  130. pDC->MoveTo(m_rcTemp.left + 1, m_rcTemp.top + iMediaAltura + 2);
  131. pDC->LineTo(m_rcTemp.left + 3, m_rcTemp.bottom - 3);
  132. pDC->MoveTo(m_rcTemp.left + 3, m_rcTemp.bottom - 3);
  133. pDC->LineTo(m_rcTemp.right - 1, m_rcTemp.top + 1);
  134. pDC->MoveTo(m_rcTemp.left + 1, m_rcTemp.top + iMediaAltura + 1);
  135. pDC->LineTo(m_rcTemp.left + 3, m_rcTemp.bottom - 4);
  136. pDC->MoveTo(m_rcTemp.left + 3, m_rcTemp.bottom - 4);
  137. pDC->LineTo(m_rcTemp.right - 1, m_rcTemp.top);
  138. pDC->SelectObject(pOld);
  139. }
  140. BOOL CGuiCheckBox::PreTranslateMessage(MSG* pMsg)
  141. {
  142. return CButton::PreTranslateMessage(pMsg);
  143. }
  144. void CGuiCheckBox::PreSubclassWindow()
  145. {
  146. ModifyStyle(0, BS_OWNERDRAW);
  147. CButton::PreSubclassWindow();
  148. }
  149. BOOL CGuiCheckBox::OnEraseBkgnd(CDC* pDC) 
  150. {
  151. // TODO: Add your message handler code here and/or call default
  152. return FALSE;
  153. }
  154. int CGuiCheckBox::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  155. {
  156. if (CButton::OnCreate(lpCreateStruct) == -1)
  157. return -1;
  158. // TODO: Add your specialized creation code here
  159. return 0;
  160. }
  161. void CGuiCheckBox::OnLButtonDown(UINT nFlags, CPoint point) 
  162. {
  163. // TODO: Add your message handler code here and/or call default
  164. CButton::OnLButtonDown(nFlags, point);
  165. m_bPressBtn = TRUE;
  166. m_bOldTemp = m_bCheckBtn;
  167. Invalidate();
  168. UpdateWindow();
  169. KillTimer(1);
  170. SetTimer(1, 10, NULL);
  171. }
  172. void CGuiCheckBox::OnLButtonUp(UINT nFlags, CPoint point) 
  173. {
  174. // TODO: Add your message handler code here and/or call default
  175. CButton::OnLButtonUp(nFlags, point);
  176. CRect m_rect;
  177. GetClientRect(&m_rect);
  178. if (m_rect.PtInRect(point))
  179. {
  180. if (m_bCheckBtn == TRUE)
  181. m_bCheckBtn = FALSE;
  182. else 
  183. m_bCheckBtn = TRUE;
  184. m_bOldTemp = m_bCheckBtn;
  185. m_bPressBtn = FALSE;
  186. m_bSelected =FALSE;
  187. KillTimer(1);
  188. SetTimer(1, 100, NULL);
  189. Invalidate();
  190. UpdateWindow();
  191. }
  192. }
  193. void CGuiCheckBox::OnTimer(UINT nIDEvent) 
  194. {
  195. // TODO: Add your message handler code here and/or call default
  196. CRect m_rect;
  197. GetClientRect(&m_rect);
  198. CPoint pt(GetMessagePos());
  199. ScreenToClient(&pt);
  200. if (!m_rect.PtInRect(pt))
  201. {
  202. m_bPressBtn = TRUE;
  203. m_bSelected = FALSE;
  204. Invalidate();
  205. UpdateWindow();
  206. KillTimer(1);
  207. }
  208. CButton::OnTimer(nIDEvent);
  209. }
  210. void CGuiCheckBox::OnMouseMove(UINT nFlags, CPoint point) 
  211. {
  212. // TODO: Add your message handler code here and/or call default
  213. CRect m_rect;
  214. GetClientRect(&m_rect);
  215. if (m_bSelected == TRUE)
  216. return;
  217. if (m_rect.PtInRect(point))
  218. {
  219. m_bSelected =TRUE;
  220. Invalidate();
  221. UpdateWindow();
  222. SetTimer(1, 100, NULL);
  223. }
  224. CButton::OnMouseMove(nFlags, point);
  225. }
  226. void CGuiCheckBox::DrawOrange(CDC* pDC, CRect m_rcTemp)
  227. {
  228. if (m_bSelected== TRUE)
  229. {
  230. for (int i = 0; i < 2; i++)
  231. {
  232. COLORREF m_Over = RGB(255, 193+ (i + 10), 111+ (i + 10));
  233. pDC->Draw3dRect(m_rcTemp, m_Over, m_Over);
  234. m_rcTemp.DeflateRect(1, 1);
  235. }
  236. m_rcTemp.InflateRect(2, 2);
  237. pDC->SetPixel(m_rcTemp.left + 1, m_rcTemp.top + 2,::GetSysColor(COLOR_3DHIGHLIGHT));
  238. pDC->SetPixel(m_rcTemp.left + 1, m_rcTemp.top + 3, RGB(255, 220, 185));
  239. pDC->SetPixel(m_rcTemp.left + 1, m_rcTemp.top + 4, RGB(255, 220, 185));
  240. pDC->SetPixel(m_rcTemp.left + 1, m_rcTemp.top + 5, RGB(255, 220, 185));
  241. pDC->SetPixel(m_rcTemp.left + 1, m_rcTemp.top + 6, RGB(255, 220, 185));
  242. pDC->SetPixel(m_rcTemp.left + 2, m_rcTemp.top, RGB(255, 220, 185));
  243. pDC->SetPixel(m_rcTemp.left + 3, m_rcTemp.top, RGB(255, 220, 185));
  244. pDC->SetPixel(m_rcTemp.left + 4, m_rcTemp.top, RGB(255, 220, 185));
  245. pDC->SetPixel(m_rcTemp.left + 5, m_rcTemp.top, RGB(255, 220, 185));
  246. pDC->SetPixel(m_rcTemp.left, m_rcTemp.top, RGB(254, 225, 158));
  247. pDC->SetPixel(m_rcTemp.left, m_rcTemp.top + 1, RGB(255, 255, 255));
  248. pDC->SetPixel(m_rcTemp.left, m_rcTemp.top + 2, RGB(255, 243, 217));
  249. pDC->SetPixel(m_rcTemp.left, m_rcTemp.top + 3, RGB(255, 243, 217));
  250. pDC->SetPixel(m_rcTemp.left, m_rcTemp.top + 4, RGB(255, 243, 217));
  251. pDC->SetPixel(m_rcTemp.left, m_rcTemp.top + 5, RGB(255, 243, 217));
  252. pDC->SetPixel(m_rcTemp.left, m_rcTemp.top + 6, RGB(255, 243, 217));
  253. pDC->SetPixel(m_rcTemp.left, m_rcTemp.top + 7, RGB(255, 243, 217));
  254. pDC->SetPixel(m_rcTemp.left, m_rcTemp.top + 8, RGB(255, 243, 217));
  255. pDC->SetPixel(m_rcTemp.left, m_rcTemp.top + 9, RGB(255, 243, 217));
  256. pDC->SetPixel(m_rcTemp.left, m_rcTemp.top, RGB(254, 255, 255));
  257. pDC->SetPixel(m_rcTemp.left + 1, m_rcTemp.top, RGB(255, 243, 217));
  258. pDC->SetPixel(m_rcTemp.left + 2, m_rcTemp.top, RGB(255, 243, 217));
  259. pDC->SetPixel(m_rcTemp.left + 3, m_rcTemp.top, RGB(255, 243, 217));
  260. pDC->SetPixel(m_rcTemp.left + 4, m_rcTemp.top, RGB(255, 243, 217));
  261. pDC->SetPixel(m_rcTemp.left + 5, m_rcTemp.top, RGB(255, 243, 217));
  262. pDC->SetPixel(m_rcTemp.left + 6, m_rcTemp.top, RGB(255, 243, 217));
  263. pDC->SetPixel(m_rcTemp.left + 7, m_rcTemp.top, RGB(255, 243, 217));
  264. pDC->SetPixel(m_rcTemp.left, m_rcTemp.top + 1, RGB(254, 255, 255));
  265. pDC->SetPixel(m_rcTemp.left + 1, m_rcTemp.top + 1, RGB(254, 220, 139));
  266. pDC->SetPixel(m_rcTemp.left + 2, m_rcTemp.top + 1, RGB(254, 220, 139));
  267. pDC->SetPixel(m_rcTemp.left + 3, m_rcTemp.top + 1, RGB(254, 220, 139));
  268. pDC->SetPixel(m_rcTemp.left + 4, m_rcTemp.top + 1, RGB(254, 220, 139));
  269. pDC->SetPixel(m_rcTemp.left + 5, m_rcTemp.top + 1, RGB(254, 220, 139));
  270. pDC->SetPixel(m_rcTemp.left + 6, m_rcTemp.top + 1, RGB(254, 220, 139));
  271. pDC->SetPixel(m_rcTemp.left + 7, m_rcTemp.top + 1, RGB(254, 220, 139));
  272. }
  273. else
  274. CBrush cbSelec;
  275. cbSelec.CreateSysColorBrush(COLOR_3DHILIGHT);
  276. pDC->FillRect(m_rcTemp, &cbSelec);
  277. }
  278. }