SwitcherButton.cpp
上传用户:sdpcwz
上传日期:2009-12-14
资源大小:1237k
文件大小:7k
源码类别:

书籍源码

开发平台:

Visual C++

  1. // SwitcherButton.cpp
  2. //
  3. // Programmed by: JIMMY BRUSH (Kathy007@email.msn.com)
  4. // 
  5. // Legal:
  6. //
  7. // THIS CODE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND.
  8. // You may use and distribute this code provided that you do not
  9. // remove this title header and that you do not charge money for
  10. // it. If you want to update the code, feel free to do so, as long
  11. // as you *mark your changes* in code AND in the revision log below
  12. // (and send it to me ;)
  13. //
  14. //
  15. //
  16. // Version: 1.0 revision 1
  17. //
  18. // Revision Log:
  19. //
  20. // SUN MAR 14 1999 - JIMMY BRUSH -  Finished Writing version 1.0
  21. // MON MAR 15 1999 - JIMMY BRUSH -  Fixed RemoveButton to correctly decrement selected button
  22. // Added CMemDC by Keith Rule
  23. // Fixed up Animation a bit
  24. //
  25. //
  26. //
  27. // In the next version  Wish List:
  28. //
  29. // 1. Tool Tips in CSwitcherButton
  30. // 2. Support for more buttons than can display (with the up/down button at the right)
  31. #include "stdafx.h"
  32. #include "SwitcherWnd.h"
  33. #include "SwitcherButton.h"
  34. #include <winuser.h>
  35. #ifdef _DEBUG
  36. #define new DEBUG_NEW
  37. #undef THIS_FILE
  38. static char THIS_FILE[] = __FILE__;
  39. #endif
  40. /////////////////////////////////////////////////////////////////////////////
  41. // CSwitcherButton
  42. CSwitcherButton::CSwitcherButton()
  43. {
  44. m_nState = SWITCHBUTTON_UP;
  45. HasCapture = false;
  46. m_iIcon = NULL;
  47. m_iID = -1;
  48. // Win95/98 balks at creating & deleting the font in OnPaint
  49. // so put it here
  50. m_fNormal.CreateFont(10,0,0,0,FW_NORMAL,0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_QUALITY|FF_DONTCARE,"MS Sans Serif");
  51. m_fBold.CreateFont(10,0,0,0,FW_BOLD,0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_QUALITY|FF_DONTCARE,"MS Sans Serif");
  52. }
  53. CSwitcherButton::~CSwitcherButton()
  54. {
  55. m_fNormal.DeleteObject();
  56. m_fBold.DeleteObject();
  57. }
  58. BEGIN_MESSAGE_MAP(CSwitcherButton, CWnd)
  59. //{{AFX_MSG_MAP(CSwitcherButton)
  60. ON_WM_PAINT()
  61. ON_WM_LBUTTONDOWN()
  62. ON_WM_LBUTTONUP()
  63. ON_WM_MOUSEMOVE()
  64. //}}AFX_MSG_MAP
  65. END_MESSAGE_MAP()
  66. /////////////////////////////////////////////////////////////////////////////
  67. // CSwitcherButton message handlers
  68. void CSwitcherButton::OnPaint() 
  69. {
  70. CPaintDC paintdc(this); // device context for painting
  71. CRect rect;
  72. GetClientRect(&rect);
  73. CMemDC dc(&paintdc, &rect);
  74. // center the icon
  75. int icontop = (rect.Height() / 2) - (16 / 2);
  76. CString text;
  77. GetWindowText(text);
  78. dc.SetBkMode(TRANSPARENT);
  79. dc.SetTextColor(::GetSysColor(COLOR_BTNTEXT));
  80. CBrush brush;
  81. if (m_nState == SWITCHBUTTON_UP)
  82. {
  83. brush.CreateSolidBrush(::GetSysColor(COLOR_3DFACE));
  84. dc.FillRect(&rect, &brush);
  85. dc.Draw3dRect(&rect, ::GetSysColor(COLOR_3DHIGHLIGHT), ::GetSysColor(COLOR_3DDKSHADOW));
  86. rect.DeflateRect(1, 1);
  87. dc.Draw3dRect(&rect, ::GetSysColor(COLOR_3DLIGHT), ::GetSysColor(COLOR_3DSHADOW));
  88. }
  89. else if (m_nState == SWITCHBUTTON_DOWN)
  90. {
  91. brush.CreateSolidBrush(::GetSysColor(COLOR_3DFACE));
  92. dc.FillRect(&rect, &brush);
  93. dc.Draw3dRect(&rect, ::GetSysColor(COLOR_3DDKSHADOW), ::GetSysColor(COLOR_3DHIGHLIGHT));
  94. rect.DeflateRect(1,1);
  95. dc.Draw3dRect(&rect, ::GetSysColor(COLOR_3DSHADOW), ::GetSysColor(COLOR_3DLIGHT));
  96. // make it look pressed
  97. rect.top += 1;
  98. icontop += 1;
  99. }
  100. else if (m_nState == SWITCHBUTTON_SELECTED)
  101. {
  102. brush.CreateSolidBrush(::GetSysColor(COLOR_3DLIGHT));
  103. dc.FillRect(&rect, &brush);
  104. dc.Draw3dRect(&rect, ::GetSysColor(COLOR_3DDKSHADOW), ::GetSysColor(COLOR_3DHIGHLIGHT));
  105. rect.DeflateRect(1,1);
  106. dc.Draw3dRect(&rect, ::GetSysColor(COLOR_3DSHADOW), ::GetSysColor(COLOR_3DLIGHT));
  107. // make it look pressed
  108. rect.top+= 1;
  109. icontop += 1;
  110. }
  111. // dont even bother if no text
  112. if (text.IsEmpty() == FALSE)
  113. {
  114. // dont want text near the border
  115. rect.DeflateRect(2,2);
  116. // MS BUG: DT_VCENTER dont work! (or im doing something wrong)
  117. // so must Vertical Center it ourself
  118. CSize size;
  119. GetTextExtentPoint32(dc.GetSafeHdc(), text, text.GetLength(), &size);
  120. rect.top += (rect.Height() / 2) - (size.cy / 2) + 1;
  121. rect.left += 20;
  122. if (m_nState == SWITCHBUTTON_SELECTED)
  123. dc.SelectObject(&m_fBold);
  124. else
  125. dc.SelectObject(&m_fNormal);
  126. dc.DrawText(text, &rect, DT_END_ELLIPSIS|DT_VCENTER);
  127. }
  128. if (m_iIcon != NULL)
  129. ::DrawIconEx(dc.GetSafeHdc(), 4, icontop, m_iIcon, 16, 16, 0, (HBRUSH)brush, DI_NORMAL);
  130. brush.DeleteObject();
  131. }
  132. void CSwitcherButton::OnLButtonDown(UINT nFlags, CPoint point) 
  133. {
  134. CWnd::OnLButtonDown(nFlags, point);
  135. if (m_nState != SWITCHBUTTON_SELECTED)
  136. {
  137. SetCapture();
  138. m_nState = SWITCHBUTTON_DOWN;
  139. HasCapture = true;
  140. Invalidate();
  141. }
  142. }
  143. void CSwitcherButton::OnLButtonUp(UINT nFlags, CPoint point) 
  144. {
  145. CWnd::OnLButtonUp(nFlags, point);
  146. bool change = true;
  147. if (m_nState == SWITCHBUTTON_DOWN)
  148. {
  149. m_nState = SWITCHBUTTON_SELECTED;
  150. ::SendMessage(m_wndParent->GetSafeHwnd(), SWM_SELCHANGE, (WPARAM)this, 0);
  151. }
  152. else
  153. {
  154. if (m_nState == SWITCHBUTTON_UP)
  155. change = false;
  156. if (m_nState == SWITCHBUTTON_SELECTED)
  157. ::SendMessage(m_wndParent->GetSafeHwnd(), SWM_UNSELECT, (WPARAM)this, 0);
  158. m_nState = SWITCHBUTTON_UP;
  159. }
  160. ReleaseCapture();
  161. HasCapture = false;
  162. if (change)
  163. Invalidate();
  164. }
  165. void CSwitcherButton::OnMouseMove(UINT nFlags, CPoint point) 
  166. {
  167. CWnd::OnMouseMove(nFlags, point);
  168. if (HasCapture)
  169. {
  170. RECT rect;
  171. GetClientRect(&rect);
  172. if (point.x > rect.right || point.x < rect.left || point.y < rect.top || point.y > rect.bottom)
  173. {
  174. if (m_nState != SWITCHBUTTON_UP)
  175. {
  176. m_nState = SWITCHBUTTON_UP;
  177. Invalidate();
  178. }
  179. }
  180. else
  181. {
  182. if (m_nState != SWITCHBUTTON_DOWN)
  183. {
  184. m_nState = SWITCHBUTTON_DOWN;
  185. Invalidate();
  186. }
  187. }
  188. }
  189. }
  190. BOOL CSwitcherButton::DoCreate(CWnd *parent, int x, int y, int cx, int cy, CString text)
  191. {
  192. m_wndParent = parent;
  193. WNDCLASS myclass;
  194. myclass.style = CS_HREDRAW|CS_VREDRAW|CS_PARENTDC;
  195. myclass.lpfnWndProc = AfxWndProc;
  196. myclass.cbClsExtra = 0;
  197. myclass.cbWndExtra = 0;
  198. myclass.hInstance = AfxGetInstanceHandle();
  199. myclass.hIcon = NULL;
  200. myclass.hCursor = LoadCursor(NULL, IDC_ARROW);
  201. myclass.hbrBackground = NULL;
  202. myclass.lpszMenuName = NULL;
  203. myclass.lpszClassName = "SwitcherButtonClass";
  204. AfxRegisterClass(&myclass);
  205. return Create("SwitcherButtonClass", text, WS_CHILD|WS_VISIBLE, CRect(x,y,cx+x,cy+y), parent, 0);
  206. }
  207. void CSwitcherButton::SetText(CString text)
  208. {
  209. SetWindowText(text);
  210. Invalidate();
  211. return;
  212. }
  213. void CSwitcherButton::ReplaceIcon(HICON icon)
  214. {
  215. m_iIcon = icon;
  216. Invalidate();
  217. }
  218. void CSwitcherButton::Refresh()
  219. {
  220. Invalidate();
  221. }
  222. void CSwitcherButton::Select()
  223. {
  224. if (HasCapture)
  225. {
  226. ReleaseCapture();
  227. HasCapture = false;
  228. }
  229. m_nState = SWITCHBUTTON_SELECTED;
  230. Invalidate();
  231. }
  232. void CSwitcherButton::Unselect()
  233. {
  234. if (HasCapture)
  235. {
  236. ReleaseCapture();
  237. HasCapture = false;
  238. }
  239. m_nState = SWITCHBUTTON_UP;
  240. Invalidate();
  241. }