LinkButton.cpp
上传用户:chrisyuan
上传日期:2022-06-18
资源大小:59k
文件大小:5k
源码类别:

按钮控件

开发平台:

Visual C++

  1. // LinkButton.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "LinkBtn.h"
  5. #include "LinkButton.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CLinkButton
  13. CLinkButton::CLinkButton()
  14. {
  15. bHighlight = bLBtnDown = false;
  16. hHand = AfxGetApp()->LoadCursor(IDC_HANDCUR);
  17. }
  18. CLinkButton::~CLinkButton()
  19. {
  20. if (fUnderline.GetSafeHandle()) fUnderline.DeleteObject();
  21. }
  22. BEGIN_MESSAGE_MAP(CLinkButton, CButton)
  23. //{{AFX_MSG_MAP(CLinkButton)
  24. ON_WM_MOUSEMOVE()
  25. ON_WM_SETCURSOR()
  26. ON_WM_TIMER()
  27. ON_WM_CREATE()
  28. ON_WM_LBUTTONUP()
  29. ON_WM_LBUTTONDOWN()
  30. ON_WM_ERASEBKGND()
  31. //}}AFX_MSG_MAP
  32. END_MESSAGE_MAP()
  33. /////////////////////////////////////////////////////////////////////////////
  34. // CLinkButton message handlers
  35. void CLinkButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
  36. {
  37. // 获取一个CDC指针
  38. CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
  39. //定义按钮区域并初始化
  40. CRect rect(lpDrawItemStruct->rcItem);
  41. //设置背景模式
  42. COLORREF oc = pDC->GetTextColor();
  43. int iObk = pDC->SetBkMode(TRANSPARENT);
  44. //初始化按钮状态
  45. UINT state = lpDrawItemStruct->itemState;
  46. CFont * pOldFont = NULL;
  47. int iYOffset = 0, iXOffset = 0;
  48. CString strText;
  49. GetWindowText(strText);
  50. rect.top  += iYOffset;
  51. rect.left += iXOffset;
  52. if (state & ODS_DISABLED)
  53. {
  54. //按钮置灰(DISABLED)
  55. CBrush grayBrush;
  56. grayBrush.CreateSolidBrush (GetSysColor (COLOR_GRAYTEXT));
  57. CSize sz = pDC->GetTextExtent(strText);
  58. int x = rect.left + (rect.Width() - sz.cx)/2;
  59. int y = rect.top + (rect.Height() - sz.cy)/2;
  60. rect.top  += 2;
  61. rect.left += 2;
  62. pDC->SetTextColor(GetSysColor(COLOR_3DHIGHLIGHT));
  63. pDC->DrawText(strText, rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
  64. rect.top  -= 2;
  65. rect.left -= 2;
  66. pDC->SetTextColor(GetSysColor(COLOR_GRAYTEXT));
  67. pDC->DrawText(strText, rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
  68. }
  69. else
  70. {
  71. if (bHighlight)//光标在按钮上
  72. {
  73. if (state & ODS_SELECTED)
  74. {
  75. //按下按钮
  76. pDC->Draw3dRect(rect,GetSysColor(COLOR_3DSHADOW), GetSysColor(COLOR_3DHILIGHT));
  77. }
  78. else
  79. {
  80. //未按下按钮
  81. pDC->Draw3dRect(rect,GetSysColor(COLOR_3DHILIGHT),GetSysColor(COLOR_3DSHADOW));
  82. }
  83. //字体颜色
  84. pDC->SetTextColor(RGB(0,0,255));
  85. //加下画线(也可以用其他字体)
  86. if (fUnderline.GetSafeHandle() == NULL)
  87. {
  88. CFont * pFont = GetFont();
  89. ASSERT(pFont);
  90. LOGFONT lf;
  91. pFont->GetLogFont(&lf);
  92. lf.lfUnderline = TRUE;
  93. fUnderline.CreateFontIndirect(&lf);
  94. }
  95. pOldFont = pDC->SelectObject(&fUnderline);
  96. }
  97. else pDC->SetTextColor(GetSysColor(COLOR_BTNTEXT));
  98. pDC->DrawText(strText, rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
  99. if (pOldFont) pDC->SelectObject(pOldFont);
  100. }
  101. }
  102. void CLinkButton::OnMouseMove(UINT nFlags, CPoint point) 
  103. {
  104. //设置一个定时器
  105. SetTimer(1,10,NULL);
  106. CButton::OnMouseMove(nFlags, point);
  107. }
  108. BOOL CLinkButton::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
  109. {
  110. if (bHighlight) 
  111. {
  112. ::SetCursor(hHand);
  113. return true;
  114. }
  115. return CButton::OnSetCursor(pWnd, nHitTest, message);
  116. }
  117. void CLinkButton::OnTimer(UINT nIDEvent) 
  118. {
  119. static bool pPainted = false;
  120. POINT pt;
  121. GetCursorPos(&pt);
  122. CRect rect;
  123. GetWindowRect (rect);
  124. if (bLBtnDown)
  125. {
  126. KillTimer (1);
  127. if (pPainted) InvalidateRect (NULL);
  128. pPainted = FALSE;
  129. return;
  130. }
  131. if (!rect.PtInRect (pt))
  132. {
  133. bHighlight = false;
  134. KillTimer (1);
  135. if (pPainted)
  136. InvalidateRect(NULL);
  137. pPainted = false;
  138. return;
  139. }
  140. else
  141. {
  142. bHighlight = true;
  143. if (!pPainted)
  144. {
  145. pPainted = true;
  146. InvalidateRect(NULL);
  147. }
  148. }
  149. CButton::OnTimer(nIDEvent);
  150. }
  151. int CLinkButton::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  152. {
  153. if (CButton::OnCreate(lpCreateStruct) == -1)
  154. return -1;
  155. CFont * pFont = GetFont();
  156. ASSERT(pFont);
  157. LOGFONT lf;
  158. pFont->GetLogFont(&lf);
  159. lf.lfUnderline = TRUE;
  160. fUnderline.CreateFontIndirect(&lf);
  161. return 0;
  162. }
  163. void CLinkButton::OnLButtonUp(UINT nFlags, CPoint point) 
  164. {
  165. bLBtnDown = false;
  166. if (bHighlight)
  167. {
  168. bHighlight = false;
  169. InvalidateRect(NULL);
  170. }
  171. CButton::OnLButtonUp(nFlags, point);
  172. }
  173. void CLinkButton::OnLButtonDown(UINT nFlags, CPoint point) 
  174. {
  175. bLBtnDown = true;
  176. CButton::OnLButtonDown(nFlags, point);
  177. }
  178. BOOL CLinkButton::OnEraseBkgnd(CDC* pDC) 
  179. {
  180. COLORREF cr = GetSysColor(COLOR_3DFACE);
  181. int r = GetRValue(cr);
  182. int g = GetGValue(cr);
  183. int b = GetBValue(cr);
  184. if (r > 1) r -= 2;
  185. if (g > 1) g -= 2;
  186. if (r < 3 && g < 3 && b < 253) b += 2;
  187. COLORREF cr1 = RGB(r,g,b);
  188. CRect rc;
  189. GetClientRect(rc);
  190. pDC->FillSolidRect(rc, cr1);
  191. return CButton::OnEraseBkgnd(pDC);
  192. }