GuiLinkButton.cpp
上传用户:wlkj888
上传日期:2022-08-01
资源大小:806k
文件大小:6k
源码类别:

对话框与窗口

开发平台:

Visual C++

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