HotEdit.cpp
上传用户:ybbdhb
上传日期:2007-01-02
资源大小:31k
文件大小:5k
源码类别:

编辑框

开发平台:

Visual C++

  1. // HotEdit.cpp : implementation file
  2. //
  3. // If you need any help with this edit control, email me: alan@benchmarx.co.uk
  4. #include "stdafx.h"
  5. #include "HotEdit.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CHotEdit
  13. CHotEdit::CHotEdit()
  14. {
  15. m_clr3DFace = GetSysColor(COLOR_3DFACE);
  16. m_clr3DLight = GetSysColor(COLOR_3DLIGHT);
  17. m_clr3DHilight = GetSysColor(COLOR_3DHILIGHT);
  18. m_clr3DShadow = GetSysColor(COLOR_3DSHADOW);
  19. m_clr3DDkShadow = GetSysColor(COLOR_3DDKSHADOW);
  20. m_fGotFocus = false;
  21. m_fTimerSet = false;
  22. }
  23. CHotEdit::~CHotEdit()
  24. {
  25. }
  26. BEGIN_MESSAGE_MAP(CHotEdit, CEdit)
  27. //{{AFX_MSG_MAP(CHotEdit)
  28. ON_WM_PAINT()
  29. ON_WM_SETFOCUS()
  30. ON_WM_KILLFOCUS()
  31. ON_WM_MOUSEMOVE()
  32. ON_WM_TIMER()
  33. ON_WM_NCMOUSEMOVE()
  34. ON_WM_SYSCOLORCHANGE()
  35. //}}AFX_MSG_MAP
  36. END_MESSAGE_MAP()
  37. /////////////////////////////////////////////////////////////////////////////
  38. // CHotEdit message handlers
  39. void CHotEdit::OnPaint() 
  40. {
  41. // call the default message handler to repaint the text etc.
  42. Default();
  43. // now redraw the border
  44. if (m_fGotFocus) {
  45. DrawBorder();
  46. } else {
  47. DrawBorder(false);
  48. }
  49. }
  50. void CHotEdit::OnSetFocus(CWnd* pOldWnd) 
  51. {
  52. CEdit::OnSetFocus(pOldWnd);
  53. // set internal flag and redraw border
  54. m_fGotFocus = true;
  55. DrawBorder();
  56. }
  57. void CHotEdit::OnKillFocus(CWnd* pNewWnd) 
  58. {
  59. CEdit::OnKillFocus(pNewWnd);
  60. // set internal flag and redraw border
  61. m_fGotFocus = false;
  62. DrawBorder(false);
  63. }
  64. void CHotEdit::OnMouseMove(UINT nFlags, CPoint point) 
  65. {
  66. // no point setting the timer if we already have focus, the border will be drawn all the time if
  67. // we have focus
  68. if (!m_fGotFocus) {
  69. // if the timer isn't already set, set it.
  70. if (!m_fTimerSet) {
  71. DrawBorder();
  72. SetTimer(1, 10, NULL);
  73. m_fTimerSet = true;
  74. }
  75. }
  76. CEdit::OnMouseMove(nFlags, point);
  77. }
  78. // The timer is used to periodically check whether the mouse cursor is within
  79. // this control. Once it isn't, the timer is killed
  80. void CHotEdit::OnTimer(UINT nIDEvent) 
  81. {
  82. POINT pt;
  83. GetCursorPos(&pt);
  84. CRect rcItem;
  85. GetWindowRect(&rcItem);
  86. // if the mouse cursor within the control?
  87. if(!rcItem.PtInRect(pt)) {
  88. KillTimer(1);
  89. m_fTimerSet = false;
  90. if (!m_fGotFocus) {
  91. DrawBorder(false);
  92. }
  93. return;
  94. }
  95. CEdit::OnTimer(nIDEvent);
  96. }
  97. // Scroll bars are actually in the non-client area of the window
  98. // so we want to check for movement here too
  99. void CHotEdit::OnNcMouseMove(UINT nHitTest, CPoint point) 
  100. {
  101. if (!m_fTimerSet) {
  102. DrawBorder();
  103. SetTimer(1, 10, NULL);
  104. m_fTimerSet = true;
  105. }
  106. CEdit::OnNcMouseMove(nHitTest, point);
  107. }
  108. // When the user has changed the system colours we want to
  109. // update the member variables accordingly
  110. void CHotEdit::OnSysColorChange() 
  111. {
  112. CEdit::OnSysColorChange();
  113. m_clr3DFace = GetSysColor(COLOR_3DFACE);
  114. m_clr3DLight = GetSysColor(COLOR_3DLIGHT);
  115. m_clr3DHilight = GetSysColor(COLOR_3DHILIGHT);
  116. m_clr3DShadow = GetSysColor(COLOR_3DSHADOW);
  117. m_clr3DDkShadow = GetSysColor(COLOR_3DDKSHADOW);
  118. }
  119. // This is the guts of this control. It draws the border of the control
  120. // as flat when the control is not active. When the control becomes active
  121. // the border is drawn according to the styles applied to it
  122. // If the control is disabled, the border is drawn irrespective of whether
  123. // the control is hot or not.
  124. void CHotEdit::DrawBorder(bool fHot)
  125. {
  126. CRect rcItem;
  127. DWORD dwExStyle = GetExStyle();
  128. CDC* pDC = GetDC();
  129. COLORREF clrBlack;
  130. int nBorderWidth = 0;
  131. int nLoop;
  132. GetWindowRect(&rcItem);
  133. ScreenToClient(&rcItem);
  134. clrBlack = RGB(0, 0, 0);
  135. if (!IsWindowEnabled()) {
  136. fHot = true;
  137. }
  138. if (dwExStyle & WS_EX_DLGMODALFRAME) {
  139. nBorderWidth += 3;
  140. }
  141. if (dwExStyle & WS_EX_CLIENTEDGE) {
  142. nBorderWidth += 2;
  143. }
  144. if (dwExStyle & WS_EX_STATICEDGE && !(dwExStyle & WS_EX_DLGMODALFRAME)) {
  145. nBorderWidth ++;
  146. }
  147. // blank the border
  148. for (nLoop = 0; nLoop < nBorderWidth; nLoop++) {
  149. pDC->Draw3dRect(rcItem, m_clr3DFace, m_clr3DFace);
  150. rcItem.DeflateRect(1, 1);
  151. }
  152. rcItem.InflateRect(1, 1);
  153. if (fHot) {
  154. if (dwExStyle & WS_EX_CLIENTEDGE) {
  155. pDC->Draw3dRect(rcItem, m_clr3DDkShadow, m_clr3DLight);
  156. rcItem.InflateRect(1, 1);
  157. pDC->Draw3dRect(rcItem, m_clr3DShadow, m_clr3DHilight);
  158. rcItem.InflateRect(1, 1);
  159. }
  160. if (dwExStyle & WS_EX_STATICEDGE && !(dwExStyle & WS_EX_DLGMODALFRAME)) {
  161. pDC->Draw3dRect(rcItem, m_clr3DShadow, m_clr3DHilight);
  162. rcItem.InflateRect(1, 1);
  163. }
  164. if (dwExStyle & WS_EX_DLGMODALFRAME) {
  165. pDC->Draw3dRect(rcItem, m_clr3DFace, m_clr3DFace);
  166. rcItem.InflateRect(1, 1);
  167. pDC->Draw3dRect(rcItem, m_clr3DHilight, m_clr3DShadow);
  168. rcItem.InflateRect(1, 1);
  169. pDC->Draw3dRect(rcItem, m_clr3DLight, m_clr3DDkShadow);
  170. }
  171. }
  172. ReleaseDC(pDC);
  173. }