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

金融证券系统

开发平台:

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 "GuiLinkButton.h"
  15. #include "Resource.h"
  16. #ifdef _DEBUG
  17. #define new DEBUG_NEW
  18. #undef THIS_FILE
  19. static char THIS_FILE[] = __FILE__;
  20. #endif
  21. /////////////////////////////////////////////////////////////////////////////
  22. // CGuiLinkButton
  23. CGuiLinkButton::CGuiLinkButton()
  24. {
  25. m_clNormal=RGB(0,0,200);
  26. m_clover=RGB(0,0,255);
  27. m_Link="";
  28. m_cfont.CreateFont(14,0,0,0,400,0,1,0,0,1,2,1,34,"Arial");
  29. m_iSelected=0;
  30. m_rectMsg.SetRectEmpty( );
  31. m_bFirstPas=TRUE;
  32. }
  33. CGuiLinkButton::~CGuiLinkButton()
  34. {
  35. }
  36. BEGIN_MESSAGE_MAP(CGuiLinkButton, CButton)
  37. //{{AFX_MSG_MAP(CGuiLinkButton)
  38. ON_WM_ERASEBKGND()
  39. ON_WM_MOUSEMOVE()
  40. ON_WM_TIMER()
  41. ON_WM_LBUTTONDOWN()
  42. ON_WM_CREATE()
  43. ON_WM_SETCURSOR()
  44. //}}AFX_MSG_MAP
  45. END_MESSAGE_MAP()
  46. /////////////////////////////////////////////////////////////////////////////
  47. // CGuiLinkButton message handlers
  48. void CGuiLinkButton::SetColorNormal(COLORREF m_clnor)
  49. {
  50. m_clNormal=m_clnor;
  51. }
  52. void CGuiLinkButton::SetColorSelect(COLORREF m_clselec)
  53. {
  54. m_clover=m_clselec;
  55. }
  56. void CGuiLinkButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
  57. {
  58. // TODO: Add your code to draw the specified item
  59. CDC* pDC=CDC::FromHandle(lpDrawItemStruct->hDC);
  60. CRect m_rect=lpDrawItemStruct->rcItem;
  61. CSize SizeCad=CSize(0,0);
  62. int m_iStatus=lpDrawItemStruct->itemState;
  63. int m_iMode;
  64. int m_iposx;
  65. int m_iposy;
  66. CBrush cb;
  67. cb.CreateSysColorBrush(COLOR_BTNFACE); 
  68. static CPoint pt=CPoint(2,1);
  69. CString m_sCaption;
  70. GetWindowText(m_sCaption);
  71. //se calcula la posici髇 exacta del texto para que solo se 
  72. //seleccione cuando se encuentre el puntero en el rectangulo
  73. SizeCad=pDC->GetTextExtent(m_sCaption);
  74. if (m_bFirstPas==TRUE)
  75. {
  76. if (SizeCad.cx < m_rect.Width())
  77. {
  78. pDC->FillRect(m_rect,&cb);
  79. m_iposx=m_rect.Width()-(SizeCad.cx+30);
  80. m_iposy=m_rect.Height()-SizeCad.cy;
  81. m_rectMsg=m_rect;
  82. m_rectMsg.bottom=m_rect.bottom-(m_iposy-2);
  83. m_rectMsg.right=m_rect.right-(m_iposx);
  84. SetWindowPos (NULL, m_rectMsg.left, m_rectMsg.top,m_rectMsg.right, m_rectMsg.bottom,
  85. SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
  86. m_bFirstPas=FALSE;
  87. }
  88. }
  89. m_iMode=pDC->SetBkMode(TRANSPARENT);
  90. CFont* m_OldFont=pDC->SelectObject(&m_cfont);
  91. if (m_iSelected==1)
  92. pDC->SetTextColor(m_clover);
  93. else
  94. pDC->SetTextColor(m_clNormal);
  95. pDC->DrawState(pt, SizeCad, m_sCaption, (m_iStatus==ODS_DISABLED)?DSS_DISABLED:DSS_NORMAL, TRUE, 0, (CBrush*)NULL);
  96. pDC->SelectObject(m_OldFont);
  97. pDC->SetBkMode(m_iMode);
  98. }
  99. void CGuiLinkButton::PreSubclassWindow() 
  100. {
  101. // TODO: Add your specialized code here and/or call the base class
  102. ModifyStyle(0,BS_OWNERDRAW);
  103. CButton::PreSubclassWindow();
  104. }
  105. BOOL CGuiLinkButton::PreTranslateMessage(MSG* pMsg) 
  106. {
  107. // TODO: Add your specialized code here and/or call the base class
  108. if (GetSafeHwnd() == NULL) return FALSE;
  109. if (pMsg->message== WM_MOUSEMOVE)
  110. if (m_ToolTipCtrl.GetSafeHwnd())
  111. m_ToolTipCtrl.RelayEvent(pMsg);
  112. return CButton::PreTranslateMessage(pMsg);
  113. }
  114. BOOL CGuiLinkButton::OnEraseBkgnd(CDC* pDC) 
  115. {
  116. // TODO: Add your message handler code here and/or call default
  117. return TRUE;
  118. }
  119. void CGuiLinkButton::OnMouseMove(UINT nFlags, CPoint point) 
  120. {
  121. // TODO: Add your message handler code here and/or call default
  122. ::SetCursor(::LoadCursor(NULL,MAKEINTRESOURCE(32649)));//IDC_HAND));
  123.  
  124. CRect m_rect;
  125. GetClientRect(&m_rect);
  126. if (m_iSelected == 1) return;
  127. if (m_rect.PtInRect(point))
  128. {
  129. m_iSelected =1;
  130. Invalidate();
  131. UpdateWindow();
  132. SetTimer(1,100,NULL);
  133. }
  134. CButton::OnMouseMove(nFlags, point);
  135. }
  136. void CGuiLinkButton::OnTimer(UINT nIDEvent) 
  137. {
  138. // TODO: Add your message handler code here and/or call default
  139. if(nIDEvent== 1)
  140. {
  141. CPoint pt=GetMessagePos();
  142. ScreenToClient(&pt);
  143. if (!m_rectMsg.PtInRect(pt))
  144. {
  145. m_iSelected=0;
  146. Invalidate();
  147. UpdateWindow();
  148. KillTimer(1);
  149. }
  150. }
  151. CButton::OnTimer(nIDEvent);
  152. }
  153. void CGuiLinkButton::SetToolTip(LPCSTR m_lpMsg)
  154. {
  155. if (GetSafeHwnd()== NULL) return;
  156. if (m_lpMsg != NULL)
  157. {
  158. if (m_ToolTipCtrl.GetSafeHwnd () == NULL) 
  159. {
  160. m_ToolTipCtrl.Create(this,TTS_ALWAYSTIP);
  161. m_ToolTipCtrl.Activate(TRUE);
  162. m_ToolTipCtrl.AddTool(this,m_lpMsg);
  163. }
  164. else
  165. {
  166. m_ToolTipCtrl.UpdateTipText(m_lpMsg,this);
  167. }
  168. }
  169. else
  170. {
  171. if (m_ToolTipCtrl.GetSafeHwnd () == NULL) 
  172. {
  173. m_ToolTipCtrl.Create(this,TTS_ALWAYSTIP);
  174. m_ToolTipCtrl.AddTool(this,m_lpMsg);
  175. }
  176. else
  177. m_ToolTipCtrl.UpdateTipText(m_lpMsg,this);
  178. m_ToolTipCtrl.Activate(FALSE);
  179. }
  180. }
  181. void CGuiLinkButton::SetLink(LPCSTR lpMsg)
  182. {
  183. m_Link=lpMsg;
  184. }
  185. void CGuiLinkButton::OnLButtonDown(UINT nFlags, CPoint point) 
  186. {
  187. // TODO: Add your message handler code here and/or call default
  188. ShellExecute (NULL, "open",m_Link, NULL, NULL, 0) ;
  189. CButton::OnLButtonDown(nFlags, point);
  190. }
  191. int CGuiLinkButton::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  192. {
  193. if (CButton::OnCreate(lpCreateStruct) == -1)
  194. return -1;
  195. // TODO: Add your specialized creation code here
  196. return 0;
  197. }
  198. BOOL CGuiLinkButton::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
  199. {
  200. SetCursor(::LoadCursor(NULL,MAKEINTRESOURCE(32649)));
  201. return CButton::OnSetCursor(pWnd, nHitTest, message);
  202. }