OAMFLATBUTTON.CPP
上传用户:shgx688
上传日期:2009-12-27
资源大小:855k
文件大小:5k
源码类别:

SNMP编程

开发平台:

MultiPlatform

  1. // OAMFlatButton.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "OAMFlatButton.h"
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #undef THIS_FILE
  8. static char THIS_FILE[] = __FILE__;
  9. #endif
  10. /////////////////////////////////////////////////////////////////////////////
  11. // COAMFlatButton
  12. COAMFlatButton::COAMFlatButton()
  13. {
  14. m_nState = 0;
  15. m_bLBtnDown = FALSE;
  16. m_bFlatLook = TRUE;
  17. m_bPainted = FALSE;
  18. m_clrHilite = ::GetSysColor(COLOR_BTNHIGHLIGHT);
  19. m_clrShadow = ::GetSysColor(COLOR_BTNSHADOW);
  20. m_clrDkShad = ::GetSysColor(COLOR_3DDKSHADOW);
  21. m_clrNormal = ::GetSysColor(COLOR_BTNFACE);
  22. m_clrTextGy = ::GetSysColor(COLOR_GRAYTEXT);
  23. m_clrTextNm = ::GetSysColor(COLOR_BTNTEXT);
  24. }
  25. COAMFlatButton::~COAMFlatButton()
  26. {
  27. }
  28. BEGIN_MESSAGE_MAP(COAMFlatButton, CButton)
  29. //{{AFX_MSG_MAP(COAMFlatButton)
  30. ON_WM_MOUSEMOVE()
  31. ON_WM_LBUTTONDOWN()
  32. ON_WM_LBUTTONUP()
  33. ON_WM_TIMER()
  34. ON_WM_SYSCOLORCHANGE()
  35. //}}AFX_MSG_MAP
  36. END_MESSAGE_MAP()
  37. /////////////////////////////////////////////////////////////////////////////
  38. // COAMFlatButton message handlers
  39. void COAMFlatButton::OnMouseMove(UINT nFlags, CPoint point) 
  40. {
  41. if (m_bFlatLook) {
  42. SetTimer(1, 10, NULL);
  43. OnTimer(1);
  44. }
  45. CButton::OnMouseMove(nFlags, point);
  46. }
  47. void COAMFlatButton::OnLButtonDown(UINT nFlags, CPoint point) 
  48. {
  49. m_bLBtnDown = TRUE;
  50. CButton::OnLButtonDown(nFlags, point);
  51. }
  52. void COAMFlatButton::OnLButtonUp(UINT nFlags, CPoint point) 
  53. {
  54. m_bLBtnDown = FALSE;
  55. CButton::OnLButtonUp(nFlags, point);
  56. }
  57. void COAMFlatButton::OnTimer(UINT nIDEvent) 
  58. {
  59. CRect rcItem;
  60. GetWindowRect(rcItem);
  61. CPoint ptCursor;
  62. GetCursorPos(&ptCursor);
  63. if ((m_bLBtnDown==TRUE) || (!rcItem.PtInRect(ptCursor)))
  64. {
  65. KillTimer (1);
  66. if (m_bPainted == TRUE) {
  67. InvalidateRect (NULL);
  68. }
  69. m_bPainted = FALSE;
  70. return;
  71. }
  72. // On mouse over, show raised button.
  73. else if(m_bFlatLook)
  74. {
  75. // Get the device context for the client area.
  76. CDC *pDC = GetDC();
  77. if (m_bPainted == FALSE)
  78. {
  79. // repaint client area.
  80. GetClientRect(rcItem);
  81. pDC->FillSolidRect(rcItem, m_clrNormal);
  82. DrawIcon(pDC);
  83. // draw the button rect.
  84. pDC->Draw3dRect(rcItem, m_clrHilite, m_clrShadow);
  85. m_bPainted = TRUE;
  86. }
  87. ReleaseDC (pDC);
  88. }
  89. CButton::OnTimer(nIDEvent);
  90. }
  91. void COAMFlatButton::OnSysColorChange() 
  92. {
  93. CButton::OnSysColorChange();
  94. m_clrHilite = ::GetSysColor(COLOR_BTNHIGHLIGHT);
  95. m_clrShadow = ::GetSysColor(COLOR_BTNSHADOW);
  96. m_clrDkShad = ::GetSysColor(COLOR_3DDKSHADOW);
  97. m_clrNormal = ::GetSysColor(COLOR_BTNFACE);
  98. m_clrTextGy = ::GetSysColor(COLOR_GRAYTEXT);
  99. m_clrTextNm = ::GetSysColor(COLOR_BTNTEXT);
  100. }
  101. void COAMFlatButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
  102. {
  103. // ASSERT(lpDrawItemStruct != NULL);
  104. CDC* pDC = GetDC();
  105. // Get the button state.
  106. m_nState = lpDrawItemStruct->itemState;
  107. // Copy the rect, and fill the background.
  108. m_rcItem.CopyRect(&lpDrawItemStruct->rcItem);
  109. pDC->FillSolidRect(m_rcItem, m_clrNormal);
  110. if(m_bFlatLook)
  111. {
  112. // Draw button pressed.
  113. if ((m_nState & ODS_SELECTED)) {
  114. pDC->Draw3dRect (m_rcItem, m_clrShadow, m_clrHilite);
  115. }
  116. // Draw button flat.
  117. else {
  118. pDC->Draw3dRect (m_rcItem, m_clrNormal, m_clrNormal);
  119. }
  120. }
  121. else
  122. {
  123. CRect rcItem(m_rcItem);
  124. rcItem.DeflateRect(1,1);
  125. // Draw button pressed.
  126. if ((m_nState & ODS_SELECTED)) {
  127. pDC->Draw3dRect (m_rcItem, m_clrDkShad, m_clrHilite);
  128. pDC->Draw3dRect (rcItem, m_clrShadow, m_clrNormal);
  129. }
  130. // Draw button raised.
  131. else {
  132. pDC->Draw3dRect (m_rcItem, m_clrHilite, m_clrDkShad);
  133. pDC->Draw3dRect (rcItem, m_clrNormal, m_clrShadow);
  134. }
  135. }
  136. // Save the item state, set background to transparent.
  137. pDC->SetBkMode( TRANSPARENT );
  138. DrawIcon(pDC);
  139. ReleaseDC (pDC);
  140. }
  141. void COAMFlatButton::DrawIcon(CDC *pDC)
  142. {
  143. // if an icon is associated with button, draw it.
  144. HICON hIcon = GetIcon();
  145. HBITMAP hBitmap = GetBitmap();
  146. if (hIcon)
  147. {
  148. CRect rcWnd;
  149. GetWindowRect(&rcWnd);
  150. int left   = (rcWnd.Width()-m_sizeIcon.cx)/2;
  151. int right  = left+m_sizeIcon.cx;
  152. int top    = (rcWnd.Height()-m_sizeIcon.cy)/2;
  153. int bottom = top+m_sizeIcon.cy;
  154. m_rcItem.CopyRect(CRect(left,top,right,bottom));
  155. if ((m_nState & ODS_SELECTED)) {
  156. m_rcItem.OffsetRect(1,1);
  157. }
  158. DrawIconEx(
  159. pDC->GetSafeHdc(),
  160. m_rcItem.left,
  161. m_rcItem.top,
  162. hIcon,
  163. m_rcItem.Width(),
  164. m_rcItem.Height(),
  165. NULL,
  166. (HBRUSH)NULL,
  167. DI_NORMAL); 
  168. }
  169. else if (hBitmap)
  170. {
  171. // not implemented.
  172. }
  173. else
  174. {
  175. if (m_nState & ODS_DISABLED)
  176. pDC->SetTextColor(m_clrTextGy);
  177. else
  178. pDC->SetTextColor(m_clrTextNm);
  179. CFont newFont, *oldFont;
  180. NONCLIENTMETRICS ncm;
  181. ncm.cbSize = sizeof(NONCLIENTMETRICS);
  182. VERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS,
  183. sizeof(NONCLIENTMETRICS), &ncm, 0));
  184. newFont.CreateFontIndirect(&ncm.lfMessageFont);
  185. oldFont = pDC->SelectObject(&newFont);
  186. CString strText;
  187. GetWindowText(strText);
  188. pDC->DrawText(strText, m_rcItem, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
  189. pDC->SelectObject(oldFont);
  190. }
  191. }
  192. void COAMFlatButton::SetIcon(HICON hIcon, CSize size)
  193. {
  194.     m_sizeIcon = size;
  195.     ::DestroyIcon( CButton::SetIcon(hIcon) );
  196. }