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

金融证券系统

开发平台:

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