ButtonEx.cpp
上传用户:lds876
上传日期:2013-05-25
资源大小:567k
文件大小:7k
源码类别:

P2P编程

开发平台:

Visual C++

  1. // ButtonEx.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "ButtonEx.h"
  5. #include "testBT.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CButtonEx
  13. CButtonEx::CButtonEx()
  14. {
  15. m_bOver = m_bSelected = m_bTracking = m_bFocus = FALSE;
  16. m_cyIcon = m_cxIcon = 16;
  17. m_bIconOnly = false;
  18. m_bTiping = FALSE;
  19. m_hIcon = 0;
  20. }
  21. CButtonEx::~CButtonEx()
  22. {
  23. if (m_hIcon)
  24. {
  25. BOOL bRet = DestroyIcon(m_hIcon);
  26. ASSERT(bRet);
  27. }
  28. }
  29. BEGIN_MESSAGE_MAP(CButtonEx, CButton)
  30. //{{AFX_MSG_MAP(CButtonEx)
  31. ON_WM_CREATE()
  32. ON_WM_ERASEBKGND()
  33. //}}AFX_MSG_MAP
  34. ON_WM_MOUSEMOVE()
  35. ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
  36. ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)
  37. END_MESSAGE_MAP()
  38. /////////////////////////////////////////////////////////////////////////////
  39. // CButtonEx message handlers
  40. bool CButtonEx::Create(HICON hIcon, bool bIconOnly, CString strTipText)
  41. {
  42. m_bIconOnly = bIconOnly;
  43. if (bIconOnly)
  44. {
  45. m_tip.Create(this, TTS_ALWAYSTIP);
  46. m_tip.AddTool(this);
  47. m_strTipText = strTipText;
  48. ASSERT(!m_strTipText.IsEmpty());
  49. }
  50. // if (uResourceID)
  51. // m_hIcon = AfxGetApp()->LoadIcon(uResourceID);
  52. if (hIcon)
  53. m_hIcon = hIcon;
  54. else
  55. {
  56. ASSERT(FALSE);
  57. }
  58. return true;
  59. }
  60. void CButtonEx::RoundRectExK(CDC& dc, const CRect rc, const CPoint& pt, COLORREF itl, COLORREF ibr) 
  61. {
  62. CPen pentl, penbr;
  63. BOOL bRet = pentl.CreatePen(PS_SOLID, 1, itl);
  64. ASSERT(bRet);
  65. bRet = penbr.CreatePen(PS_SOLID, 1, ibr);
  66. ASSERT(bRet);
  67. CGdiObject* pold = dc.SelectObject(&pentl);
  68. dc.MoveTo(rc.left, rc.bottom - pt.y);
  69. dc.LineTo(rc.left, rc.top + pt.y);
  70. dc.LineTo(rc.left + pt.x, rc.top );
  71. dc.LineTo(rc.right - pt.x, rc.top);
  72. dc.LineTo(rc.right, rc.top + pt.y);
  73. dc.SelectObject(&penbr);
  74. dc.LineTo(rc.right, rc.bottom - pt.y);
  75. dc.LineTo(rc.right - pt.x, rc.bottom);
  76. dc.LineTo(rc.left + pt.x, rc.bottom);
  77. dc.LineTo(rc.left, rc.bottom - pt.y);
  78. //*/
  79. dc.SelectObject(pold);
  80. pentl.DeleteObject();
  81. penbr.DeleteObject();
  82. }
  83. int CButtonEx::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  84. {
  85. if (CButton::OnCreate(lpCreateStruct) == -1)
  86. return -1;
  87. return 0;
  88. }
  89. void CButtonEx::OnMouseMove(UINT nFlags, CPoint point) 
  90. {
  91. if (!m_bTracking)
  92. {
  93. TRACKMOUSEEVENT tme;
  94. tme.cbSize = sizeof(tme);
  95. tme.hwndTrack = m_hWnd;
  96. tme.dwFlags = TME_LEAVE ;
  97. tme.dwHoverTime = 1;
  98. m_bTracking = _TrackMouseEvent(&tme);
  99. }
  100. CPoint pt;
  101. GetCursorPos(&pt);
  102. ScreenToClient(&pt);
  103. CRect rc;
  104. GetClientRect(rc);
  105. if (rc.PtInRect(pt))
  106. {
  107. if (!m_bOver)
  108. {
  109. m_bOver = true;
  110. InvalidateRect(NULL, FALSE);
  111. }
  112. if (m_bIconOnly && !m_bTiping)
  113. {
  114. m_bTiping = true;
  115. m_tip.UpdateTipText(m_strTipText, this);
  116. }
  117. }
  118. else
  119. {
  120. if (m_bOver)
  121. {
  122. m_bOver = false;
  123. InvalidateRect(NULL, FALSE);
  124. }
  125. }
  126. CButton::OnMouseMove(nFlags, point);
  127. }
  128. LRESULT CButtonEx::OnMouseLeave(WPARAM wParam, LPARAM lParam)
  129. {
  130. m_bTiping = FALSE;
  131. m_bOver = FALSE;
  132. m_bTracking = FALSE;
  133. InvalidateRect(NULL, FALSE);
  134. return 0;
  135. }
  136. LRESULT CButtonEx::OnMouseHover(WPARAM wParam, LPARAM lParam)
  137. {
  138. m_bOver = TRUE;
  139. InvalidateRect(NULL);
  140. return 0;
  141. }
  142. void CButtonEx::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
  143. {
  144. _DrawItem(lpDrawItemStruct);
  145. }
  146. void CButtonEx::_DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
  147. {
  148. HDC dc = lpDrawItemStruct->hDC;
  149. CRect &rect = (CRect&) lpDrawItemStruct->rcItem;
  150. CMemDC pDC(dc, NULL);
  151. UINT state = lpDrawItemStruct->itemState;
  152. TCHAR szText[MAX_PATH + 1];
  153. ::GetWindowText(m_hWnd, szText, MAX_PATH);
  154. POINT pt ;
  155. pt.x = 2;
  156. pt.y = 2;
  157. if (state & ODS_FOCUS)
  158. {
  159. m_bFocus = TRUE;
  160. m_bSelected = TRUE;
  161. }
  162. else
  163. {
  164. m_bFocus = FALSE;
  165. m_bSelected = FALSE;
  166. }
  167. if (state & ODS_SELECTED || state & ODS_DEFAULT)
  168. {
  169. m_bFocus = TRUE;
  170. }
  171. // pDC.SelectObject(hOldPen);
  172. // pDC.FillRect(rect, &CBrush(::GetSysColor(COLOR_BTNFACE)));
  173. pDC.FillSolidRect(rect, ::GetSysColor(COLOR_BTNFACE));
  174. CRect rcSel = rect;
  175. rcSel.DeflateRect(1, 1);
  176. if (m_bIconOnly)
  177. {
  178. if (state & ODS_SELECTED)
  179. {
  180. pDC.Draw3dRect(rcSel, RGB(128, 128, 128), RGB(255, 255, 255));
  181. }
  182. else if (m_bOver)
  183. {
  184. pDC.Draw3dRect(rcSel, RGB(255, 255, 255), RGB(128, 128, 128));
  185. }
  186. if (m_hIcon)
  187. DrawTheIcon(&pDC, &CString(szText), rect, state & ODS_SELECTED, false);
  188. return;
  189. }
  190. {
  191. // DbgGuiLeak m_dbg;
  192. if (state & ODS_SELECTED)
  193. {
  194. CRect rclt = rcSel;
  195. rclt.DeflateRect(1, 1);
  196. RoundRectExK(pDC, rclt, pt, RGB(128, 128, 128), RGB(10, 36, 106));
  197. RoundRectExK(pDC, rcSel, CPoint(3, 3) , RGB(10, 36, 106), RGB(255, 255, 255));
  198. }
  199. else if (m_bOver)
  200. {
  201. CRect rclt = rcSel;
  202. rclt.DeflateRect(1, 1);
  203. RoundRectExK(pDC, rclt, pt, RGB(255, 255, 255),  RGB(128, 128, 128));
  204. RoundRectExK(pDC, rcSel, CPoint(3, 3),RGB(10, 36, 106) , RGB(10, 36, 106));
  205. }
  206. else
  207. {
  208. CRect rclt = rcSel;
  209. rclt.DeflateRect(1, 1);
  210. RoundRectExK(pDC, rclt, pt,  RGB(128, 128, 128) ,  RGB(128, 128, 128));
  211. }
  212. }
  213. rect.DeflateRect(CSize(GetSystemMetrics(SM_CXEDGE), GetSystemMetrics(SM_CYEDGE)));
  214. if (m_hIcon)
  215. {
  216. DrawTheIcon(&pDC, &CString(szText), rect, state & ODS_SELECTED, false);
  217. }
  218. if (szText!=NULL)
  219. {
  220. CFont* hFont = GetFont();
  221. CFont* hOldFont = 0;
  222. CFont fBold;
  223. if (m_bFocus)
  224. {
  225. LOGFONT lf;
  226. hFont->GetLogFont(&lf);
  227. lf.lfWeight = FW_BOLD;
  228. fBold.CreateFontIndirect(&lf);
  229. hOldFont = pDC.SelectObject(&fBold);
  230. }
  231. else
  232. {
  233. hOldFont = pDC.SelectObject(hFont);
  234. }
  235. CSize Extent = pDC.GetTextExtent(szText, lstrlen(szText));
  236. int iTextOffset = Extent.cx / 2;
  237. if (m_hIcon)
  238. iTextOffset = Extent.cx / 3;
  239. CPoint pt( rect.CenterPoint().x - iTextOffset, rect.CenterPoint().y - Extent.cy / 2);
  240. if (state & ODS_SELECTED) 
  241. pt.Offset(1, 1);
  242. int nMode = pDC.SetBkMode(TRANSPARENT);
  243. if (state & ODS_DISABLED)
  244. pDC.DrawState(pt, Extent, szText, DSS_DISABLED, TRUE, 0, (HBRUSH)NULL);
  245. else
  246. pDC.DrawState(pt, Extent, szText, DSS_NORMAL, TRUE, 0, (HBRUSH)NULL);
  247. pDC.SelectObject(hOldFont);
  248. pDC.SetBkMode(nMode);
  249. if (m_bFocus)
  250. {
  251. CRect rcFocus(pt.x, pt.y, pt.x + Extent.cx, pt.y + Extent.cy);
  252. rcFocus.InflateRect(2, 1);
  253. pDC.DrawFocusRect(rcFocus);
  254. }
  255. }
  256. }
  257. BOOL CButtonEx::OnEraseBkgnd(CDC* pDC) 
  258. {
  259. CRect rc;
  260. pDC->GetClipBox(rc);
  261. GetClientRect(rc);
  262. // pDC->FillRect(rc, &CBrush(::GetSysColor(COLOR_BTNFACE)));
  263. pDC->FillSolidRect(rc, ::GetSysColor(COLOR_BTNFACE));
  264. return CButton::OnEraseBkgnd(pDC);
  265. }
  266. void CButtonEx::DrawTheIcon(CDC* pDC, CString* title, RECT* rcItem, BOOL IsPressed, BOOL IsDisabled)
  267. {
  268. CRect iconRect = rcItem;
  269. if (title->IsEmpty())
  270. {
  271. iconRect.left += ((iconRect.Width() - m_cxIcon)/2);
  272. }
  273. else
  274. {
  275. iconRect.left += 3;  
  276. }
  277. // Center the icon vertically
  278. iconRect.top += ((iconRect.Height() - m_cyIcon)/2);
  279. iconRect.right = iconRect.left + m_cxIcon;
  280. iconRect.bottom += iconRect.bottom + m_cyIcon;
  281.     
  282. // If button is pressed then press the icon also
  283. if (IsPressed) iconRect.OffsetRect(1, 1);
  284. // Ole'!
  285. pDC->DrawState(iconRect.TopLeft(), 
  286. iconRect.Size(), 
  287. m_hIcon, 
  288. DSS_NORMAL,
  289. // (IsDisabled ? DSS_DISABLED : DSS_NORMAL), 
  290. (CBrush*)NULL);
  291. } // End of DrawTheIcon
  292. BOOL CButtonEx::PreTranslateMessage(MSG* pMsg) 
  293. {
  294. if (m_bIconOnly)
  295. {
  296. if(m_tip.m_hWnd != NULL)
  297. m_tip.RelayEvent(pMsg);
  298. }
  299. return CButton::PreTranslateMessage(pMsg);
  300. }