HotComboBox.cpp
上传用户:zhu7604851
上传日期:2007-01-01
资源大小:34k
文件大小:5k
源码类别:

组合框控件

开发平台:

Visual C++

  1. // HotComboBox.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "HotComboBox.h"
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #undef THIS_FILE
  8. static char THIS_FILE[] = __FILE__;
  9. #endif
  10. /////////////////////////////////////////////////////////////////////////////
  11. // CHotComboBox
  12. CHotComboBox::CHotComboBox()
  13. {
  14. m_clr3DFace = GetSysColor(COLOR_3DFACE);
  15. m_clr3DLight = GetSysColor(COLOR_3DLIGHT);
  16. m_clr3DHilight = GetSysColor(COLOR_3DHILIGHT);
  17. m_clr3DShadow = GetSysColor(COLOR_3DSHADOW);
  18. m_clr3DDkShadow = GetSysColor(COLOR_3DDKSHADOW);
  19. m_fGotFocus = false;
  20. m_fTimerSet = false;
  21. }
  22. CHotComboBox::~CHotComboBox()
  23. {
  24. }
  25. BEGIN_MESSAGE_MAP(CHotComboBox, CComboBox)
  26. //{{AFX_MSG_MAP(CHotComboBox)
  27. ON_WM_PAINT()
  28. ON_WM_SETFOCUS()
  29. ON_WM_KILLFOCUS()
  30. ON_WM_MOUSEMOVE()
  31. ON_WM_TIMER()
  32. ON_WM_NCMOUSEMOVE()
  33. ON_WM_SYSCOLORCHANGE()
  34. ON_CONTROL_REFLECT(CBN_SETFOCUS, OnSetfocus)
  35. ON_CONTROL_REFLECT(CBN_KILLFOCUS, OnKillfocus)
  36. //}}AFX_MSG_MAP
  37. END_MESSAGE_MAP()
  38. /////////////////////////////////////////////////////////////////////////////
  39. // CHotComboBox message handlers
  40. void CHotComboBox::OnPaint() 
  41. {
  42. Default();
  43. if (m_fGotFocus) {
  44. DrawBorder();
  45. } else {
  46. DrawBorder(false);
  47. }
  48. }
  49. void CHotComboBox::OnSetFocus(CWnd* pOldWnd) 
  50. {
  51. CComboBox::OnSetFocus(pOldWnd);
  52. m_fGotFocus = true;
  53. DrawBorder();
  54. }
  55. void CHotComboBox::OnKillFocus(CWnd* pNewWnd) 
  56. {
  57. CComboBox::OnKillFocus(pNewWnd);
  58. m_fGotFocus = false;
  59. DrawBorder(false);
  60. }
  61. void CHotComboBox::OnMouseMove(UINT nFlags, CPoint point) 
  62. {
  63. if (!m_fGotFocus) {
  64. if (!m_fTimerSet) {
  65. DrawBorder();
  66. SetTimer(1, 10, NULL);
  67. m_fTimerSet = true;
  68. }
  69. }
  70. CComboBox::OnMouseMove(nFlags, point);
  71. }
  72. void CHotComboBox::OnTimer(UINT nIDEvent) 
  73. {
  74. POINT pt;
  75. GetCursorPos(&pt);
  76. CRect rcItem;
  77. GetWindowRect(&rcItem);
  78. if(!rcItem.PtInRect(pt)) {
  79. KillTimer(1);
  80. m_fTimerSet = false;
  81. if (!m_fGotFocus) {
  82. DrawBorder(false);
  83. }
  84. return;
  85. }
  86. CComboBox::OnTimer(nIDEvent);
  87. }
  88. void CHotComboBox::OnNcMouseMove(UINT nHitTest, CPoint point) 
  89. {
  90. if (!m_fGotFocus) {
  91. if (!m_fTimerSet) {
  92. DrawBorder();
  93. SetTimer(1, 10, NULL);
  94. m_fTimerSet = true;
  95. }
  96. }
  97. CComboBox::OnNcMouseMove(nHitTest, point);
  98. }
  99. void CHotComboBox::OnSysColorChange() 
  100. {
  101. CComboBox::OnSysColorChange();
  102. m_clr3DFace = GetSysColor(COLOR_3DFACE);
  103. m_clr3DLight = GetSysColor(COLOR_3DLIGHT);
  104. m_clr3DHilight = GetSysColor(COLOR_3DHILIGHT);
  105. m_clr3DShadow = GetSysColor(COLOR_3DSHADOW);
  106. m_clr3DDkShadow = GetSysColor(COLOR_3DDKSHADOW);
  107. }
  108. void CHotComboBox::OnSetfocus() 
  109. {
  110. m_fGotFocus = true;
  111. DrawBorder();
  112. }
  113. void CHotComboBox::OnKillfocus() 
  114. {
  115. m_fGotFocus = false;
  116. DrawBorder(false);
  117. }
  118. void CHotComboBox::DrawBorder(bool fHot)
  119. {
  120. CDC *pDC = GetDC();
  121. CRect rcItem;
  122. DWORD dwExStyle = GetExStyle();
  123. GetWindowRect(&rcItem);
  124. ScreenToClient(&rcItem);
  125. if (!IsWindowEnabled()) {
  126. fHot = true;
  127. }
  128. // make sure that rcItem start at the smallest point
  129. if (dwExStyle & (WS_EX_STATICEDGE | WS_EX_DLGMODALFRAME)) {
  130. if (dwExStyle & WS_EX_STATICEDGE) {
  131. rcItem.DeflateRect(1, 1, 0, 0);
  132. }
  133. if (dwExStyle & WS_EX_DLGMODALFRAME) {
  134. rcItem.DeflateRect(1, 1, 0, 0);
  135. }
  136. rcItem.DeflateRect(1, 1, 0, 0);
  137. } else {
  138. rcItem.DeflateRect(1, 1);
  139. }
  140. if (fHot) {
  141. pDC->Draw3dRect(rcItem, m_clr3DDkShadow, m_clr3DLight);
  142. rcItem.InflateRect(1, 1);
  143. pDC->Draw3dRect(rcItem, m_clr3DShadow, m_clr3DHilight);
  144. if (dwExStyle & WS_EX_DLGMODALFRAME) {
  145. pDC->Draw3dRect(rcItem, m_clr3DShadow, m_clr3DFace);
  146. rcItem.InflateRect(1, 1, 0, 0);
  147. if (dwExStyle & WS_EX_STATICEDGE) {
  148. rcItem.DeflateRect(0, 0, 2, 2);
  149. } else {
  150. rcItem.DeflateRect(0, 0, 1, 1);
  151. }
  152. pDC->Draw3dRect(rcItem, m_clr3DDkShadow, m_clr3DDkShadow);
  153. }
  154. if (dwExStyle & WS_EX_STATICEDGE) {
  155. if (dwExStyle & WS_EX_DLGMODALFRAME) {
  156. rcItem.InflateRect(1, 1);
  157. } else {
  158. rcItem.InflateRect(1, 1, 0, 0);
  159. }
  160. pDC->Draw3dRect(rcItem, m_clr3DShadow, m_clr3DHilight);
  161. }
  162. } else {
  163. pDC->Draw3dRect(rcItem, m_clr3DFace, m_clr3DFace);
  164. rcItem.InflateRect(1, 1);
  165. pDC->Draw3dRect(rcItem, m_clr3DFace, m_clr3DFace);
  166. if (dwExStyle & WS_EX_DLGMODALFRAME) {
  167. rcItem.InflateRect(1, 1, 0, 0);
  168. if (dwExStyle & WS_EX_STATICEDGE) {
  169. rcItem.InflateRect(0, 0, 1, 1);
  170. pDC->Draw3dRect(rcItem, m_clr3DFace, m_clr3DFace);
  171. rcItem.DeflateRect(0, 0, 3, 3);
  172. } else {
  173. rcItem.DeflateRect(0, 0, 1, 1);
  174. }
  175. pDC->Draw3dRect(rcItem, m_clr3DFace, m_clr3DFace);
  176. }
  177. if (dwExStyle & WS_EX_STATICEDGE) {
  178. if (dwExStyle & WS_EX_DLGMODALFRAME) {
  179. rcItem.InflateRect(1, 1);
  180. } else {
  181. rcItem.InflateRect(1, 1, 0, 0);
  182. }
  183. pDC->Draw3dRect(rcItem, m_clr3DFace, m_clr3DFace);
  184. }
  185. }
  186. ReleaseDC(pDC);
  187. }