GuiToolButton.cpp
上传用户:zhanglf88
上传日期:2013-11-19
资源大小:6036k
文件大小:7k
源码类别:

金融证券系统

开发平台:

Visual C++

  1. //-----------------------------------------------------------------------//
  2. // This is a part of the GuiLib MFC Extention.  //
  3. // Autor  :  Francisco Campos  //
  4. // (C) 2002 Francisco Campos <www.beyondata.com> All rights reserved     //
  5. // This code is provided "as is", with absolutely no warranty expressed  //
  6. // or implied. Any use is at your own risk.  //
  7. // You must obtain the author's consent before you can include this code //
  8. // in a software library.  //
  9. // If the source code in  this file is used in any application  //
  10. // then acknowledgement must be made to the author of this program  //
  11. // fcampos@tutopia.com  //
  12. //-----------------------------------------------------------------------//
  13. #include "stdafx.h"
  14. #include "GuiLib.h"
  15. #include "GuiToolButton.h"
  16. #include "GuiDrawLayer.h"
  17. // CGuiToolButton
  18. #define UPDATEWIN  Invalidate();
  19.    UpdateWindow();  
  20. IMPLEMENT_DYNAMIC(CGuiToolButton, CButton)
  21. CGuiToolButton::CGuiToolButton()
  22. {
  23. m_bMouserOver=FALSE;
  24. m_SizeImage=CSize(0,0);
  25. m_SizeText=CSize(0,0);
  26. m_clColor=GuiDrawLayer::GetRGBColorXP();
  27. m_bShowDark=TRUE;
  28. m_ScrollButton=FALSE;
  29. m_clrFont=RGB(0,0,0);
  30. }
  31. CGuiToolButton::~CGuiToolButton()
  32. {
  33. }
  34. BEGIN_MESSAGE_MAP(CGuiToolButton, CButton)
  35. ON_WM_ERASEBKGND()
  36. ON_WM_LBUTTONUP()
  37. ON_WM_LBUTTONDOWN()
  38. ON_WM_MOUSEMOVE()
  39. ON_WM_TIMER()
  40. END_MESSAGE_MAP()
  41. // CGuiToolButton message handlers
  42. void CGuiToolButton::SetFontColor(COLORREF clrFont)
  43. {
  44. m_clrFont=clrFont;
  45. }
  46. void CGuiToolButton::ShowDark(BOOL bShow)
  47. {
  48. m_bShowDark=bShow;
  49. }
  50. void CGuiToolButton::OnSysColorChange( )
  51. {
  52. m_clColor=GuiDrawLayer::GetRGBColorXP();
  53. CButton::OnSysColorChange( );
  54. }
  55. void CGuiToolButton::PreSubclassWindow() 
  56. {
  57. ModifyStyle(0,BS_OWNERDRAW);
  58. CButton::PreSubclassWindow();
  59. }
  60. void CGuiToolButton::SetScrollButton(BOOL bScroll)
  61. {
  62. m_ScrollButton=bScroll;
  63. }
  64. void CGuiToolButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
  65. {
  66. CDC*  pdc= CDC::FromHandle(lpDrawItemStruct->hDC);
  67. CRect rc=lpDrawItemStruct->rcItem;
  68. UINT  uState=lpDrawItemStruct->itemState;
  69. CBrush cb;
  70. if( uState & ODS_SELECTED) //the button is pressed
  71. cb.CreateSolidBrush(GuiDrawLayer::GetRGBPressBXP());
  72. else
  73. if (m_bMouserOver)
  74. cb.CreateSolidBrush(GuiDrawLayer::GetRGBFondoXP());
  75. else
  76. cb.CreateSolidBrush(m_clColor);
  77. if (( uState == ODS_SELECTED) || m_bMouserOver )
  78. {
  79. pdc->Draw3dRect(rc,GuiDrawLayer::GetRGBCaptionXP(),GuiDrawLayer::GetRGBCaptionXP());
  80. rc.DeflateRect(1,1);
  81. }
  82. else if(m_ScrollButton)
  83. {
  84. pdc->Draw3dRect(rc,GuiDrawLayer::GetRGBColorShadow(),GuiDrawLayer::GetRGBColorShadow());
  85. rc.DeflateRect(1,1);
  86. }
  87. pdc->FillRect(rc,&cb);
  88. int calculodify;
  89. calculodify=rc.Height()-(m_SizeImage.cy);
  90. calculodify/=2;
  91. int nHeigh=calculodify+(m_bShowDark?1:0);
  92. int nWidth=m_ScrollButton?rc.Width()/2 :2;
  93. CPoint m_point=CPoint(nWidth,nHeigh);
  94. if (m_SizeImage.cx > 2)
  95. {
  96. if(m_bMouserOver == 1 && !(uState & ODS_DISABLED) && !(uState & ODS_SELECTED) && m_bShowDark)
  97. {
  98. CPoint p(m_point.x+1,m_point.y+1);
  99. pdc->DrawState(p,m_SizeImage,m_Icon,DSS_MONO,CBrush (GuiDrawLayer::GetRGBColorShadow()));
  100. m_point.x-=1; m_point.y-=1;
  101. }
  102. pdc->DrawState (m_point, m_SizeImage,m_Icon,
  103. (uState==ODS_DISABLED?DSS_DISABLED:DSS_NORMAL),(CBrush*)NULL);
  104. }
  105. if (m_SizeText.cx > 2)
  106. {
  107. int nMode = pdc->SetBkMode(TRANSPARENT);
  108. CRect rectletra=rc;
  109. int nt=m_ScrollButton?0:8;
  110. rectletra.left+=m_SizeImage.cx+nt;
  111. CPoint pt=CSize(rectletra.top,rectletra.left);
  112. if (uState & ODS_DISABLED)
  113. pdc->DrawState(pt, m_SizeText, m_szText, DSS_DISABLED, TRUE, 0, (CBrush*)NULL);
  114. else
  115. {
  116. if(m_bMouserOver != 1) 
  117. pdc->SetTextColor(m_clrFont);
  118. pdc->DrawText(m_szText,rectletra,DT_SINGLELINE|DT_LEFT|DT_VCENTER);
  119. }
  120. pdc->SetBkMode(nMode);
  121. }
  122. // TODO:  Add your code to draw the specified item
  123. }
  124. void CGuiToolButton::SetColor(COLORREF clColor)
  125. {
  126. m_clColor=clColor;
  127. }
  128. BOOL CGuiToolButton::OnEraseBkgnd(CDC* pDC)
  129. {
  130. return TRUE;
  131. }
  132. void CGuiToolButton::OnLButtonUp(UINT nFlags, CPoint point)
  133. {
  134. // TODO: Add your message handler code here and/or call default
  135. CButton::OnLButtonUp(nFlags, point);
  136. }
  137. void CGuiToolButton::OnLButtonDown(UINT nFlags, CPoint point)
  138. {
  139. // TODO: Add your message handler code here and/or call default
  140. CButton::OnLButtonDown(nFlags, point);
  141. }
  142. void CGuiToolButton::OnMouseMove(UINT nFlags, CPoint point)
  143. {
  144. // TODO: Add your message handler code here and/or call default
  145. if (m_bMouserOver) return;
  146. CRect rc;
  147. GetClientRect(rc);
  148. if (rc.PtInRect(point))
  149. {
  150. m_bMouserOver=TRUE;
  151. SetTimer(1,50,0);
  152. UPDATEWIN 
  153. }
  154. CButton::OnMouseMove(nFlags, point);
  155. }
  156. void CGuiToolButton::OnTimer(UINT nIDEvent)
  157. {
  158. // TODO: Add your message handler code here and/or call default
  159. if (!m_bMouserOver) return;
  160. CRect rc;
  161. CPoint pt(GetMessagePos());
  162. ScreenToClient(&pt);
  163. GetClientRect(rc);
  164. if (!rc.PtInRect(pt))
  165. {
  166. m_bMouserOver=FALSE;
  167. KillTimer(1);
  168. UPDATEWIN 
  169. }
  170. CButton::OnTimer(nIDEvent);
  171. }
  172. BOOL CGuiToolButton::PreTranslateMessage(MSG* pMsg)
  173. {
  174. // TODO: Add your specialized code here and/or call the base class
  175. if (pMsg->message == WM_MOUSEMOVE)
  176. if (m_toolTip.GetSafeHwnd())
  177. m_toolTip.RelayEvent(pMsg);
  178. return CButton::PreTranslateMessage(pMsg);
  179. }
  180. void CGuiToolButton::SetToolTip(LPCTSTR lpMsg)
  181. {
  182. if (GetSafeHwnd ()== NULL) return;
  183. if (lpMsg != NULL)
  184. {
  185. if (m_toolTip.GetSafeHwnd () == NULL) 
  186. {
  187. m_toolTip.Create(this,TTS_ALWAYSTIP);
  188. m_toolTip.Activate(TRUE);
  189. m_toolTip.AddTool(this,lpMsg);
  190. }
  191. else
  192. {
  193. m_toolTip.UpdateTipText(lpMsg,this);
  194. }
  195. }
  196. else
  197. {
  198. if (m_toolTip.GetSafeHwnd () == NULL) 
  199. {
  200. m_toolTip.Create(this,TTS_ALWAYSTIP);
  201. m_toolTip.AddTool(this,lpMsg);
  202. }
  203. else
  204. m_toolTip.UpdateTipText(lpMsg,this);
  205. m_toolTip.Activate(FALSE);
  206. }
  207. }
  208. CSize CGuiToolButton::GetSizeButton()
  209. {
  210. m_ReposWindow=FALSE;
  211. RecalSize();
  212. m_ReposWindow=TRUE;
  213. return m_szButton;
  214. }
  215. void CGuiToolButton::RecalSize()
  216. {
  217. CRect m_rect;
  218. int m_High=0;
  219. if (GetSafeHwnd() == NULL) return;
  220. CClientDC dc(this);
  221. GetClientRect(&m_rect);
  222. CSize SizeCad=CSize(0,0);
  223. m_High=max(m_SizeImage.cy,m_SizeText.cy);
  224. m_High=max(m_High,m_rect.Height());
  225. m_szButton= CSize(m_SizeText.cx+m_SizeImage.cx+7,m_High);
  226. if (m_ReposWindow==TRUE)
  227. SetWindowPos (NULL, -1,-1, m_szButton.cx, m_High,
  228. SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
  229. }
  230. void CGuiToolButton::SetCaption(CString szCaption)
  231. {
  232. m_szText=szCaption;
  233. CClientDC dc(this);
  234. m_SizeText= dc.GetTextExtent(m_szText,m_szText.GetLength());
  235. m_SizeText.cx-=7;
  236. }
  237. void CGuiToolButton::SethIcon(HICON hIcon)
  238. {
  239. m_Icon=hIcon;
  240. ICONINFO bm;
  241. ZeroMemory(&bm, sizeof(ICONINFO));
  242. ::GetIconInfo(m_Icon,&bm);
  243. m_SizeImage =CSize((BYTE)(bm.xHotspot*2),(BYTE)(bm.yHotspot*2));
  244. }
  245. void CGuiToolButton::ShowMenu()
  246. {
  247. CRect rcW;
  248. int x,y;
  249. GetWindowRect(&rcW);
  250. x=rcW.left;
  251. y=rcW.bottom;
  252. if (m_hMenu != NULL )
  253. {
  254.    UINT m_iResMenu= ::TrackPopupMenu (m_hMenu,TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_NONOTIFY | TPM_RETURNCMD, 
  255. x, y, 0, GetSafeHwnd (), NULL);
  256. if (m_iResMenu!=0)
  257. {
  258. CWnd* pParent= GetParent();
  259. pParent->SendMessage ( WM_COMMAND,
  260. MAKEWPARAM (GetDlgCtrlID (), BN_CLICKED),
  261. (LPARAM) m_hWnd);
  262. }
  263. }
  264. else
  265. return;
  266. Invalidate ();
  267. UpdateWindow ();
  268. ReleaseCapture();
  269. }