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

对话框与窗口

开发平台:

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 "GuiToolButton.h"
  24. #include "GuiDrawLayer.h"
  25. #ifdef _DEBUG
  26. #undef THIS_FILE
  27. static char THIS_FILE[]=__FILE__;
  28. #define new DEBUG_NEW
  29. #endif
  30. // CGuiToolButton
  31. #define UPDATEWIN  Invalidate();
  32.    UpdateWindow();  
  33. IMPLEMENT_DYNAMIC(CGuiToolButton, CButton)
  34. CGuiToolButton::CGuiToolButton()
  35. {
  36. m_bMouserOver=FALSE;
  37. m_SizeImage=CSize(0,0);
  38. m_SizeText=CSize(0,0);
  39. m_clColor=GuiDrawLayer::GetRGBColorXP();
  40. m_bShowDark=TRUE;
  41. m_ScrollButton=FALSE;
  42. m_clrFont=RGB(0,0,0);
  43. m_bSimple=FALSE;
  44. m_Icon=NULL;
  45. m_StyleDisplay=GUISTYLE_XP;
  46. m_Transparent=TRUE;
  47. }
  48. CGuiToolButton::~CGuiToolButton()
  49. {
  50. //if (m_Icon!=NULL) DestroyIcon(m_Icon);
  51. }
  52. BEGIN_MESSAGE_MAP(CGuiToolButton, CButton)
  53. ON_WM_ERASEBKGND()
  54. ON_WM_LBUTTONUP()
  55. ON_WM_LBUTTONDOWN()
  56. ON_WM_MOUSEMOVE()
  57. ON_WM_TIMER()
  58. END_MESSAGE_MAP()
  59. // CGuiToolButton message handlers
  60. void CGuiToolButton::SetFontColor(COLORREF clrFont)
  61. {
  62. m_clrFont=clrFont;
  63. }
  64. void CGuiToolButton::ShowDark(BOOL bShow)
  65. {
  66. m_bShowDark=bShow;
  67. }
  68. void CGuiToolButton::OnSysColorChange( )
  69. {
  70. m_clColor=GuiDrawLayer::GetRGBColorXP();
  71. CButton::OnSysColorChange( );
  72. }
  73. void CGuiToolButton::PreSubclassWindow() 
  74. {
  75. ModifyStyle(0,BS_OWNERDRAW);
  76. CButton::PreSubclassWindow();
  77. }
  78. void CGuiToolButton::SetScrollButton(BOOL bScroll)
  79. {
  80. m_ScrollButton=bScroll;
  81. }
  82. void CGuiToolButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
  83. {
  84. CDC*  pdc= CDC::FromHandle(lpDrawItemStruct->hDC);
  85. CRect rc=lpDrawItemStruct->rcItem;
  86. UINT  uState=lpDrawItemStruct->itemState;
  87. CBrush cb;
  88. if( uState & ODS_SELECTED) //the button is pressed
  89. {
  90. if(m_StyleDisplay==GUISTYLE_2003 || m_StyleDisplay == GUISTYLE_2003MENUBTN)
  91. cb.CreateSolidBrush(GuiDrawLayer::m_Theme? RGB(249,200,102):GuiDrawLayer::GetRGBPressBXP());
  92. else
  93. cb.CreateSolidBrush(GuiDrawLayer::GetRGBPressBXP());
  94. }
  95. else
  96. if (m_bMouserOver)
  97. {
  98. if(m_StyleDisplay==GUISTYLE_2003 || m_StyleDisplay== GUISTYLE_2003MENUBTN)
  99. cb.CreateSolidBrush(GuiDrawLayer::m_Theme? RGB(252,230,186):GuiDrawLayer::GetRGBFondoXP());
  100. else
  101. cb.CreateSolidBrush(GuiDrawLayer::GetRGBFondoXP());
  102. }
  103. else
  104. {
  105. if(m_StyleDisplay==GUISTYLE_2003)
  106. {
  107. if (m_Transparent && m_StyleDisplay )
  108. cb.CreateStockObject(NULL_BRUSH);
  109. else
  110. {
  111. CGradient M(CSize(rc.Width(),rc.Height()+1));
  112. M.PrepareReverseVertTab(pdc,m_StyleDisplay);
  113. M.Draw(pdc,rc.left,rc.top,0,0,rc.Width(),rc.Height(),SRCCOPY);
  114. }
  115. }
  116. else
  117. if (m_StyleDisplay== GUISTYLE_2003MENUBTN)
  118. cb.CreateSolidBrush(GuiDrawLayer::GetRGBColorFace(m_StyleDisplay));
  119. else
  120. cb.CreateSolidBrush(m_clColor);
  121. }
  122. if (( uState & ODS_SELECTED) || m_bMouserOver )
  123. {
  124. pdc->Draw3dRect(rc,GuiDrawLayer::GetRGBCaptionXP(),GuiDrawLayer::GetRGBCaptionXP());
  125. rc.DeflateRect(1,1);
  126. }
  127. else if(m_ScrollButton || m_bSimple)
  128. {
  129. pdc->Draw3dRect(rc,GuiDrawLayer::GetRGBColorShadow(),GuiDrawLayer::GetRGBColorShadow());
  130. rc.DeflateRect(1,1);
  131. }
  132. if (m_Transparent )
  133. pdc->FillRect(rc,&cb);
  134. int calculodify;
  135. calculodify=rc.Height()-(m_SizeImage.cy);
  136. calculodify/=2;
  137. int nHeigh=calculodify+(m_bShowDark?1:0);
  138. int nWidth=m_ScrollButton?rc.Width()/2 :2;
  139. CPoint m_point=CPoint(nWidth,nHeigh);
  140. if (m_SizeImage.cx > 2)
  141. {
  142. if(m_bMouserOver == 1 && !(uState & ODS_DISABLED) && !(uState & ODS_SELECTED) && m_bShowDark)
  143. {
  144. CPoint p(m_point.x+1,m_point.y+1);
  145. pdc->DrawState(p,m_SizeImage,m_Icon,DSS_MONO,CBrush (GuiDrawLayer::GetRGBColorShadow()));
  146. m_point.x-=1; m_point.y-=1;
  147. }
  148. pdc->DrawState (m_point, m_SizeImage,m_Icon,
  149. (uState==ODS_DISABLED?DSS_DISABLED:DSS_NORMAL),(CBrush*)NULL);
  150. }
  151. if (m_SizeText.cx > 2)
  152. {
  153. int nMode = pdc->SetBkMode(TRANSPARENT);
  154. CRect rectletra=rc;
  155. int nt=m_ScrollButton?0:8;
  156. rectletra.left+=m_SizeImage.cx+nt;
  157. CPoint pt=CSize(rectletra.top,rectletra.left);
  158. if (uState & ODS_DISABLED)
  159. pdc->DrawState(pt, m_SizeText, m_szText, DSS_DISABLED, TRUE, 0, (CBrush*)NULL);
  160. else
  161. {
  162. if(m_bMouserOver != 1) 
  163. pdc->SetTextColor(m_clrFont);
  164. pdc->DrawText(m_szText,rectletra,DT_SINGLELINE|DT_LEFT|DT_VCENTER);
  165. }
  166. pdc->SetBkMode(nMode);
  167. }
  168. // TODO:  Add your code to draw the specified item
  169. }
  170. void CGuiToolButton::SetColor(COLORREF clColor)
  171. {
  172. m_clColor=clColor;
  173. }
  174. BOOL CGuiToolButton::OnEraseBkgnd(CDC* pDC)
  175. {
  176. return TRUE;
  177. }
  178. void CGuiToolButton::OnLButtonUp(UINT nFlags, CPoint point)
  179. {
  180. // TODO: Add your message handler code here and/or call default
  181. CRect rcCli;
  182. GetClientRect(rcCli);
  183. ClientToScreen(rcCli);
  184. GetParent()->ScreenToClient(rcCli);
  185. GetParent()->InvalidateRect(rcCli);
  186. GetParent()->UpdateWindow();
  187. UPDATEWIN 
  188. CButton::OnLButtonUp(nFlags, point);
  189. }
  190. void CGuiToolButton::OnLButtonDown(UINT nFlags, CPoint point)
  191. {
  192. // TODO: Add your message handler code here and/or call default
  193. CButton::OnLButtonDown(nFlags, point);
  194. }
  195. void CGuiToolButton::OnMouseMove(UINT nFlags, CPoint 
  196.  point)
  197. {
  198. // TODO: Add your message handler code here and/or call default
  199. if (m_bMouserOver) return;
  200. if (!IsTopParentActive() || !GetTopLevelParent()->IsWindowEnabled())
  201. return;
  202. CRect rc;
  203. GetClientRect(rc);
  204. if (rc.PtInRect(point))
  205. {
  206. m_bMouserOver=TRUE;
  207. SetTimer(1,50,0);
  208. UPDATEWIN 
  209. }
  210. CButton::OnMouseMove(nFlags, point);
  211. }
  212. void CGuiToolButton::OnTimer(UINT nIDEvent)
  213. {
  214. // TODO: Add your message handler code here and/or call default
  215. if (!m_bMouserOver) return;
  216. CRect rc;
  217. CPoint pt(GetMessagePos());
  218. ScreenToClient(&pt);
  219. GetClientRect(rc);
  220. if (!rc.PtInRect(pt))
  221. {
  222. m_bMouserOver=FALSE;
  223. KillTimer(1);
  224. ClientToScreen(rc);
  225. GetParent()->ScreenToClient(rc);
  226. GetParent()->InvalidateRect(rc);
  227. GetParent()->UpdateWindow();
  228. UPDATEWIN 
  229. }
  230. CButton::OnTimer(nIDEvent);
  231. }
  232. BOOL CGuiToolButton::PreTranslateMessage(MSG* pMsg)
  233. {
  234. // TODO: Add your specialized code here and/or call the base class
  235. if (pMsg->message == WM_MOUSEMOVE)
  236. if (m_toolTip.GetSafeHwnd())
  237. m_toolTip.RelayEvent(pMsg);
  238. return CButton::PreTranslateMessage(pMsg);
  239. }
  240. void CGuiToolButton::SetToolTip(LPCTSTR lpMsg)
  241. {
  242. if (GetSafeHwnd ()== NULL) return;
  243. if (lpMsg != NULL)
  244. {
  245. if (m_toolTip.GetSafeHwnd () == NULL) 
  246. {
  247. m_toolTip.Create(this,TTS_ALWAYSTIP);
  248. m_toolTip.Activate(TRUE);
  249. m_toolTip.AddTool(this,lpMsg);
  250. }
  251. else
  252. {
  253. m_toolTip.UpdateTipText(lpMsg,this);
  254. }
  255. }
  256. else
  257. {
  258. if (m_toolTip.GetSafeHwnd () == NULL) 
  259. {
  260. m_toolTip.Create(this,TTS_ALWAYSTIP);
  261. m_toolTip.AddTool(this,lpMsg);
  262. }
  263. else
  264. m_toolTip.UpdateTipText(lpMsg,this);
  265. m_toolTip.Activate(FALSE);
  266. }
  267. }
  268. CSize CGuiToolButton::GetSizeButton()
  269. {
  270. m_ReposWindow=FALSE;
  271. RecalSize();
  272. m_ReposWindow=TRUE;
  273. return m_szButton;
  274. }
  275. void CGuiToolButton::RecalSize()
  276. {
  277. CRect m_rect;
  278. int m_High=0;
  279. if (GetSafeHwnd() == NULL) return;
  280. CClientDC dc(this);
  281. GetClientRect(&m_rect);
  282. CSize SizeCad=CSize(0,0);
  283. m_High=max(m_SizeImage.cy,m_SizeText.cy);
  284. m_High=max(m_High,m_rect.Height());
  285. m_szButton= CSize(m_SizeText.cx+m_SizeImage.cx+7,m_High);
  286. if (m_ReposWindow==TRUE)
  287. SetWindowPos (NULL, -1,-1, m_szButton.cx, m_High,
  288. SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
  289. }
  290. void CGuiToolButton::SetCaption(CString szCaption)
  291. {
  292. m_szText=szCaption;
  293. CClientDC dc(this);
  294. m_SizeText= dc.GetTextExtent(m_szText,m_szText.GetLength());
  295. m_SizeText.cx-=7;
  296. }
  297. void CGuiToolButton::SethIcon(HICON hIcon)
  298. {
  299. m_Icon=hIcon;
  300. ICONINFO bm;
  301. ZeroMemory(&bm, sizeof(ICONINFO));
  302. ::GetIconInfo(m_Icon,&bm);
  303. m_SizeImage =CSize((BYTE)(bm.xHotspot*2),(BYTE)(bm.yHotspot*2));
  304. ::DeleteObject(bm.hbmMask);
  305. ::DeleteObject(bm.hbmColor);
  306. }
  307. void CGuiToolButton::ShowMenu()
  308. {
  309. CRect rcW;
  310. int x,y;
  311. GetWindowRect(&rcW);
  312. x=rcW.left;
  313. y=rcW.bottom;
  314. if (m_hMenu != NULL )
  315. {
  316.    UINT m_iResMenu= ::TrackPopupMenu (m_hMenu,TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_NONOTIFY | TPM_RETURNCMD, 
  317. x, y, 0, GetSafeHwnd (), NULL);
  318. if (m_iResMenu!=0)
  319. {
  320. CWnd* pParent= GetParent();
  321. pParent->SendMessage ( WM_COMMAND,
  322. MAKEWPARAM (GetDlgCtrlID (), BN_CLICKED),
  323. (LPARAM) m_hWnd);
  324. }
  325. }
  326. else
  327. return;
  328. Invalidate ();
  329. UpdateWindow ();
  330. ReleaseCapture();
  331. }