XTPSkinObjectButton.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:16k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTPSkinObjectButton.cpp: implementation of the CXTPSkinObjectButton class.
  2. //
  3. // This file is a part of the XTREME SKINFRAMEWORK MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "Common/XTPColorManager.h"
  22. #include "Common/XTPDrawHelpers.h"
  23. #include "XTPSkinObjectButton.h"
  24. #include "XTPSkinDrawTools.h"
  25. #include "XTPSkinManager.h"
  26. #define DT_HIDEPREFIX       0x00100000
  27. #define CBR_CLIENTRECT 0
  28. #define CBR_CHECKBOX   1
  29. #define CBR_RADIOBOX   2
  30. #define CBR_CHECKTEXT  3
  31. #define CBR_RADIOTEXT  4
  32. #define CBR_GROUPTEXT  5
  33. #define CBR_GROUPFRAME 6
  34. #define CBR_PUSHBUTTON 7
  35. #define BS_HORZMASK   (BS_LEFT | BS_RIGHT | BS_CENTER)
  36. #define BS_VERTMASK   (BS_TOP | BS_BOTTOM | BS_VCENTER)
  37. #ifdef _DEBUG
  38. #undef THIS_FILE
  39. static char THIS_FILE[]=__FILE__;
  40. #define new DEBUG_NEW
  41. #endif
  42. IMPLEMENT_DYNCREATE(CXTPSkinObjectButton, CXTPSkinObjectFrame)
  43. CXTPSkinObjectButton::CXTPSkinObjectButton()
  44. {
  45. m_bHot = FALSE;
  46. m_bPushed = FALSE;
  47. m_bStyle = (BYTE)0xFF;
  48. m_strClassName = _T("BUTTON");
  49. m_nCtlColorMessage = WM_CTLCOLORBTN;
  50. }
  51. CXTPSkinObjectButton::~CXTPSkinObjectButton()
  52. {
  53. }
  54. BEGIN_MESSAGE_MAP(CXTPSkinObjectButton, CXTPSkinObjectFrame)
  55. //{{AFX_MSG_MAP(CXTPSkinObjectButton)
  56. ON_WM_ERASEBKGND()
  57. ON_WM_MOUSEMOVE()
  58. ON_WM_CREATE()
  59. ON_WM_SETFOCUS()
  60. ON_WM_KILLFOCUS()
  61. ON_WM_PAINT()
  62. ON_MESSAGE(WM_PRINTCLIENT, OnPrintClient)
  63. //}}AFX_MSG_MAP
  64. ON_MESSAGE_VOID(WM_MOUSELEAVE, OnMouseLeave)
  65. ON_MESSAGE_VOID(BM_SETSTYLE, OnDefaultAndInvalidate)
  66. ON_MESSAGE_VOID(BM_SETCHECK, OnDefaultAndInvalidate)
  67. ON_MESSAGE_VOID(WM_CAPTURECHANGED, OnDefaultAndInvalidate)
  68. ON_MESSAGE_VOID(WM_ENABLE, OnInvalidate)
  69. ON_MESSAGE(WM_UPDATEUISTATE, OnUpdateUIState)
  70. ON_MESSAGE(BM_SETSTATE, OnSetState)
  71. ON_MESSAGE(WM_SETTEXT, OnSetText)
  72. END_MESSAGE_MAP()
  73. /////////////////////////////////////////////////////////////////////////////
  74. // CXTPSkinObjectButton message handlers
  75. int CXTPSkinObjectButton::OnCreate(LPCREATESTRUCT lpCreateStruct)
  76. {
  77. if (CXTPSkinObjectFrame::OnCreate(lpCreateStruct) == -1)
  78. return -1;
  79. Invalidate(FALSE);
  80. return 0;
  81. }
  82. void CXTPSkinObjectButton::OnSkinChanged(BOOL bPrevState, BOOL bNewState)
  83. {
  84. CXTPSkinObjectFrame::OnSkinChanged(bPrevState, bNewState);
  85. m_bHot = FALSE;
  86. m_bPushed = FALSE;
  87. if (!bPrevState)
  88. {
  89. m_bPushed = FALSE;
  90. }
  91. }
  92. BOOL CXTPSkinObjectButton::OnEraseBkgnd(CDC* /*pDC*/)
  93. {
  94. return TRUE;
  95. }
  96. void CXTPSkinObjectButton::OnMouseLeave()
  97. {
  98. OnMouseMove(0, CPoint(-1, -1));
  99. }
  100. void CXTPSkinObjectButton::OnMouseMove(UINT nFlags, CPoint point)
  101. {
  102. if (GetButtonStyle() == BS_GROUPBOX)
  103. return;
  104. CXTPSkinObjectFrame::OnMouseMove(nFlags, point);
  105. CRect rc;
  106. GetClientRect(&rc);
  107. BOOL bHot = rc.PtInRect(point);
  108. if (bHot != m_bHot)
  109. {
  110. m_bHot = bHot;
  111. Invalidate(FALSE);
  112. if (m_bHot)
  113. {
  114. TRACKMOUSEEVENT tme = {sizeof(TRACKMOUSEEVENT), TME_LEAVE, m_hWnd, HOVER_DEFAULT};
  115. _TrackMouseEvent(&tme);
  116. }
  117. }
  118. }
  119. BOOL CXTPSkinObjectButton::IsDefWindowProcAvail(int nMessage) const
  120. {
  121. if (m_bWindowsForms && (nMessage < WM_CTLCOLORMSGBOX || nMessage > WM_CTLCOLORSTATIC))
  122. return FALSE;
  123. if (nMessage == WM_TIMER)
  124. return FALSE;
  125. if (m_bActiveX)
  126. return TRUE;
  127. return CXTPSkinObjectFrame::IsDefWindowProcAvail(nMessage);
  128. }
  129. LRESULT CXTPSkinObjectButton::OnSetState(WPARAM wParam, LPARAM /*lParam*/)
  130. {
  131. BOOL bVisible = GetStyle() & WS_VISIBLE;
  132. if (bVisible) ModifyStyle(WS_VISIBLE, 0);
  133. Default();
  134. if (bVisible) ModifyStyle(0, WS_VISIBLE);
  135. m_bPushed = (wParam != 0);
  136. Invalidate(FALSE);
  137. return 0;
  138. }
  139. void CXTPSkinObjectButton::OnSetFocus(CWnd* pOldWnd)
  140. {
  141. CXTPSkinObjectFrame::OnSetFocus(pOldWnd);
  142. Invalidate(FALSE);
  143. }
  144. void CXTPSkinObjectButton::OnKillFocus(CWnd* pNewWnd)
  145. {
  146. CXTPSkinObjectFrame::OnKillFocus(pNewWnd);
  147. Invalidate(FALSE);
  148. }
  149. void CXTPSkinObjectButton::OnDefaultAndInvalidate()
  150. {
  151. Default();
  152. Invalidate(FALSE);
  153. }
  154. void CXTPSkinObjectButton::OnInvalidate()
  155. {
  156. Invalidate(FALSE);
  157. }
  158. LRESULT CXTPSkinObjectButton::OnPrintClient(WPARAM wParam, LPARAM lParam)
  159. {
  160. if ((lParam & PRF_CLIENT) == 0)
  161. return Default();
  162. CDC* pDC = CDC::FromHandle((HDC)wParam);
  163. if (pDC) OnDraw(pDC);
  164. return 1;
  165. }
  166. void CXTPSkinObjectButton::OnPaint()
  167. {
  168. CXTPSkinObjectPaintDC dc(this); // device context for painting
  169. OnDraw(&dc);
  170. }
  171. void CXTPSkinObjectButton::OnDraw(CDC* pDC)
  172. {
  173. CRect rc;
  174. GetClientRect(&rc);
  175. if ((GetButtonStyle() == BS_GROUPBOX) && !m_bActiveX && !m_bWindowsForms)
  176. {
  177. CFont* pOldFont = pDC->SelectObject(GetFont());
  178. pDC->SetBkColor(GetColor(COLOR_3DFACE));
  179. OnDraw(pDC, rc);
  180. pDC->SelectObject(pOldFont);
  181. }
  182. else
  183. {
  184. CXTPBufferDC memDC(*pDC, rc);
  185. FillBackground(&memDC, rc, WM_CTLCOLORBTN);
  186. CFont* pOldFont = memDC.SelectObject(GetFont());
  187. memDC.SetBkMode(TRANSPARENT);
  188. OnDraw(&memDC, rc);
  189. memDC.SelectObject(pOldFont);
  190. }
  191. }
  192. BOOL CXTPSkinObjectButton::IsPushButton()
  193. {
  194. DWORD dwStyle = GetStyle();
  195. switch (GetButtonStyle())
  196. {
  197. case LOBYTE(BS_PUSHBUTTON):
  198. case LOBYTE(BS_DEFPUSHBUTTON):
  199. case LOBYTE(BS_OWNERDRAW):
  200. return TRUE;
  201. default:
  202. if ((dwStyle & BS_PUSHLIKE) == BS_PUSHLIKE)
  203. return TRUE;
  204. break;
  205. }
  206. return FALSE;
  207. }
  208. DWORD CXTPSkinObjectButton::GetAlignment()
  209. {
  210. DWORD bHorz;
  211. DWORD bVert;
  212. DWORD dwStyle = GetStyle();
  213. bHorz = dwStyle & (BS_LEFT | BS_RIGHT | BS_CENTER);
  214. bVert = dwStyle & (BS_TOP | BS_BOTTOM | BS_VCENTER);
  215. if (!bHorz || !bVert)
  216. {
  217. if (IsPushButton())
  218. {
  219. if (!bHorz)
  220. bHorz = BS_CENTER;
  221. }
  222. else
  223. {
  224. if (!bHorz)
  225. bHorz = BS_LEFT;
  226. }
  227. if (!bVert)
  228. bVert = BS_VCENTER;
  229. }
  230. if (m_bActiveX)
  231. bVert = BS_VCENTER;
  232. return bHorz | bVert;
  233. }
  234. CSize CXTPSkinObjectButton::GetGlyphSize(BOOL bCheckBox)
  235. {
  236. CXTPSkinManagerClass* pClassButton = GetSkinClass();
  237. CRect rcButton(0, 0, 13, 13);
  238. CSize sz(13, 13);
  239. pClassButton->GetThemePartSize(bCheckBox ? BP_CHECKBOX : BP_RADIOBUTTON,
  240. 1, rcButton, TS_DRAW, &sz);
  241. return sz;
  242. }
  243. void CXTPSkinObjectButton::CalcRect(CDC* pDC, LPRECT lprc, int code)
  244. {
  245. CString strText;
  246. GetWindowText(strText);
  247. int dy;
  248. UINT align;
  249. CSize extent;
  250. GetClientRect(lprc);
  251. align = GetAlignment();
  252. switch (code)
  253. {
  254. case CBR_PUSHBUTTON:
  255. // Subtract out raised edge all around
  256. InflateRect(lprc, -GetMetrics()->m_cxEdge, -GetMetrics()->m_cyEdge);
  257. break;
  258. case CBR_CHECKBOX:
  259. case CBR_RADIOBOX:
  260. {
  261. CSize szGlyph = GetGlyphSize(code == CBR_CHECKBOX);
  262. switch (align & BS_VERTMASK)
  263. {
  264. case BS_VCENTER:
  265. lprc->top = (lprc->top + lprc->bottom - szGlyph.cy) / 2;
  266. break;
  267. case BS_TOP:
  268. case BS_BOTTOM:
  269. {
  270. extent = pDC->GetTextExtent(_T(" "), 1);
  271. dy = extent.cy + extent.cy/4;
  272. // Save vertical extent
  273. extent.cx = dy;
  274. // Get centered amount
  275. dy = (dy - szGlyph.cy) / 2;
  276. if ((align & BS_VERTMASK) == BS_TOP)
  277. lprc->top += dy;
  278. else
  279. lprc->top = lprc->bottom - extent.cx + dy;
  280. break;
  281. }
  282. }
  283. lprc->bottom = lprc->top + szGlyph.cy;
  284. if (GetStyle() & BS_RIGHTBUTTON)
  285. lprc->left = lprc->right - szGlyph.cx;
  286. else
  287. lprc->right = lprc->left + szGlyph.cx;
  288. }
  289. break;
  290. case CBR_CHECKTEXT:
  291. case CBR_RADIOTEXT:
  292. {
  293. int nOffset = GetGlyphSize(code == CBR_CHECKBOX).cx + 3;
  294. if (GetStyle() & BS_RIGHTBUTTON)
  295. {
  296. lprc->right -= nOffset;
  297. }
  298. else
  299. {
  300. lprc->left += nOffset;
  301. }
  302. }
  303. break;
  304. case CBR_GROUPTEXT:
  305. if (strText.IsEmpty())
  306. {
  307. SetRectEmpty(lprc);
  308. break;
  309. }
  310. extent = pDC->GetTextExtent(strText);
  311. extent.cx += GetMetrics()->m_cxEdge * 2;
  312. switch (align & BS_HORZMASK)
  313. {
  314. case BS_RIGHT:
  315. lprc->right -= 6 + GetMetrics()->m_cxBorder;
  316. lprc->left += lprc->right - (int)(extent.cx);
  317. break;
  318. default:
  319. lprc->left += 8 + GetMetrics()->m_cxBorder;
  320. lprc->right = lprc->left + (int)(extent.cx);
  321. }
  322. lprc->bottom = lprc->top + extent.cy;
  323. break;
  324. case CBR_GROUPFRAME:
  325. extent = pDC->GetTextExtent(_T(" "), 1);
  326. lprc->top += extent.cy / 2;
  327. break;
  328. }
  329. }
  330. void CXTPSkinObjectButton::DrawButtonText(CDC* pDC)
  331. {
  332. static const BYTE buttonsStyles[] =
  333. {
  334. CBR_PUSHBUTTON,
  335. CBR_PUSHBUTTON,
  336. CBR_CHECKTEXT,
  337. CBR_CHECKTEXT,
  338. CBR_RADIOTEXT,
  339. CBR_CHECKTEXT,
  340. CBR_CHECKTEXT,
  341. CBR_GROUPTEXT,
  342. CBR_CLIENTRECT,
  343. CBR_RADIOTEXT,
  344. CBR_CLIENTRECT,
  345. CBR_PUSHBUTTON,
  346. };
  347. RECT    rc;
  348. int     x, y, cx = 0, cy = 0;
  349. CString strText;
  350. UINT dsFlags = DT_SINGLELINE | DT_LEFT | DT_TOP | DT_NOCLIP;
  351. BYTE bStyle = GetButtonStyle();
  352. BOOL pbfPush = IsPushButton();
  353. if (pbfPush)
  354. {
  355. CalcRect(pDC, &rc, CBR_PUSHBUTTON);
  356. }
  357. else
  358. {
  359. CalcRect(pDC, &rc, buttonsStyles[bStyle]);
  360. }
  361. // Alignment
  362. GetWindowText(strText);
  363. UINT wAlignment = GetAlignment();
  364. HGDIOBJ hImage = 0;
  365. if (GetStyle() & BS_BITMAP)
  366. {
  367. hImage = (HGDIOBJ)SendMessage(BM_GETIMAGE, IMAGE_BITMAP);
  368. if (!hImage)
  369. return;
  370. BITMAP bmp;
  371. GetObject(hImage, sizeof(BITMAP), &bmp);
  372. cx = bmp.bmWidth;
  373. cy = bmp.bmHeight;
  374. }
  375. else if (GetStyle() & BS_ICON)
  376. {
  377. hImage = (HGDIOBJ)SendMessage(BM_GETIMAGE, IMAGE_ICON);
  378. if (!hImage)
  379. return;
  380. XTPSkinFrameworkGetIconSize((HICON)hImage, &cx, &cy);
  381. }
  382. else
  383. {
  384. // Text button
  385. if (strText.IsEmpty())
  386. return;
  387. if (GetStyle() & BS_MULTILINE)
  388. {
  389. dsFlags |= DT_WORDBREAK | DT_EDITCONTROL;
  390. dsFlags &= ~DT_SINGLELINE;
  391. }
  392. CRect rcText(0, 0, rc.right - rc.left, 0);
  393. pDC->DrawText(strText, rcText, dsFlags | DT_CALCRECT);
  394. cx = rcText.Width();
  395. cy = rcText.Height();
  396. }
  397. CRect rcText(rc);
  398. if (pbfPush && ((GetStyle() & BS_MULTILINE) == 0)) rcText.DeflateRect(GetMetrics()->m_cxBorder, GetMetrics()->m_cyBorder);
  399. // Horizontal
  400. switch (wAlignment & BS_HORZMASK)
  401. {
  402. case BS_LEFT:
  403. x = rc.left + (pbfPush ? GetMetrics()->m_cxBorder : 0);
  404. break;
  405. case BS_RIGHT:
  406. x = rc.right - cx -  (pbfPush ? GetMetrics()->m_cxBorder : 0);
  407. dsFlags |= DT_RIGHT;
  408. break;
  409. default:
  410. x = (rc.left + rc.right - cx) / 2;
  411. dsFlags |= DT_CENTER;
  412. break;
  413. }
  414. // Vertical
  415. switch (wAlignment & BS_VERTMASK)
  416. {
  417. case BS_TOP:
  418. y = rc.top + (pbfPush ? GetMetrics()->m_cyBorder : 0);
  419. break;
  420. case BS_BOTTOM:
  421. y = rc.bottom - cy - (pbfPush ? GetMetrics()->m_cyBorder : 0);
  422. dsFlags |= DT_BOTTOM;
  423. break;
  424. default:
  425. y = (rc.top + rc.bottom - cy) / 2;
  426. dsFlags |= DT_VCENTER;
  427. break;
  428. }
  429. if (GetStyle() & BS_BITMAP)
  430. {
  431. pDC->DrawState(CPoint(x, y), CSize(cx, cy), (HBITMAP)hImage, DSS_NORMAL, 0);
  432. }
  433. else if (GetStyle() & BS_ICON)
  434. {
  435. pDC->DrawState(CPoint(x, y), CSize(cx, cy), (HICON)hImage, DSS_NORMAL, (HBRUSH)0);
  436. }
  437. else if (bStyle !=  LOBYTE(BS_USERBUTTON))
  438. {
  439. if (SendMessage(WM_QUERYUISTATE) & UISF_HIDEACCEL)
  440. {
  441. dsFlags |= DT_HIDEPREFIX;
  442. }
  443. if (GetExStyle() & WS_EX_RTLREADING)
  444. dsFlags |= DT_RTLREADING;
  445. if (GetStyle() & BS_MULTILINE)
  446. {
  447. pDC->DrawText(strText, CRect(x, y, x + cx, y + cy), dsFlags | DT_NOCLIP);
  448. }
  449. else
  450. {
  451. pDC->DrawText(strText, rcText, dsFlags);
  452. }
  453. }
  454. if (::GetFocus() == m_hWnd)
  455. {
  456. if ((SendMessage(WM_QUERYUISTATE) & UISF_HIDEFOCUS) == 0)
  457. {
  458. if (!pbfPush)
  459. {
  460. RECT rcClient;
  461. GetClientRect(&rcClient);
  462. if (bStyle == LOBYTE(BS_USERBUTTON))
  463. CopyRect(&rc, &rcClient);
  464. else
  465. {
  466. // Try to leave a border all around text.  That causes
  467. // focus to hug text.
  468. rc.top = max(rcClient.top, y - GetMetrics()->m_cyBorder);
  469. rc.bottom = min(rcClient.bottom, rc.top + GetMetrics()->m_cyEdge + cy);
  470. rc.left = max(rcClient.left, x-GetMetrics()->m_cxBorder);
  471. rc.right = min(rcClient.right, rc.left + GetMetrics()->m_cxEdge + cx);
  472. }
  473. }
  474. else
  475. InflateRect(&rc, -GetMetrics()->m_cxBorder, -GetMetrics()->m_cyBorder);
  476. pDC->SetTextColor(0);
  477. pDC->SetBkColor(0xFFFFFF);
  478. // Are back & fore colors set properly?
  479. ::DrawFocusRect(pDC->GetSafeHdc(), &rc);
  480. }
  481. }
  482. }
  483. /////////////////////////////////////////////////////////////////////////////
  484. // CXTPSkinObjectButton message handlers
  485. BYTE CXTPSkinObjectButton::GetButtonStyle()
  486. {
  487. if (m_bStyle != 0xFF)
  488. return m_bStyle;
  489. BYTE bStyle = BYTE(GetStyle() & 0xF);
  490. return bStyle;
  491. }
  492. void CXTPSkinObjectButton::OnDraw(CDC* pDC, CRect rc)
  493. {
  494. BOOL bPressed = m_bPushed;
  495. BOOL bHot = m_bHot || (::GetCapture() == m_hWnd);
  496. BYTE bStyle = GetButtonStyle();
  497. BOOL bDefault = bStyle == BS_DEFPUSHBUTTON;
  498. BOOL bEnabled = IsWindowEnabled();
  499. BOOL bChecked = (BOOL)SendMessage(BM_GETCHECK);
  500. CXTPSkinManagerClass* pClassButton = GetSkinClass();
  501. if (IsPushButton())
  502. {
  503. int nState = !bEnabled? PBS_DISABLED: bPressed? PBS_PRESSED: bHot? PBS_HOT: bChecked ? PBS_PRESSED : bDefault? PBS_DEFAULTED: PBS_NORMAL;
  504. pClassButton->DrawThemeBackground(pDC, BP_PUSHBUTTON, nState, rc);
  505. pDC->SetTextColor(pClassButton->GetThemeColor(BP_PUSHBUTTON, nState, TMT_TEXTCOLOR));
  506. }
  507. else if (bStyle == BS_RADIOBUTTON || bStyle == BS_AUTORADIOBUTTON)
  508. {
  509. int nState = !bEnabled? RBS_UNCHECKEDDISABLED: bPressed? RBS_UNCHECKEDPRESSED: bHot? RBS_UNCHECKEDHOT: RBS_UNCHECKEDNORMAL;
  510. if (bChecked) nState += 4;
  511. pDC->SetTextColor(pClassButton->GetThemeColor(BP_RADIOBUTTON, nState, TMT_TEXTCOLOR, GetColor(COLOR_BTNTEXT)));
  512. CRect rcRadio;
  513. CalcRect(pDC, &rcRadio, CBR_RADIOBOX);
  514. pClassButton->DrawThemeBackground(pDC, BP_RADIOBUTTON, nState, rcRadio);
  515. }
  516. else if (bStyle == BS_CHECKBOX || bStyle == BS_AUTOCHECKBOX || bStyle == BS_AUTO3STATE || bStyle == BS_3STATE)
  517. {
  518. int nState = !bEnabled? RBS_UNCHECKEDDISABLED: bPressed? RBS_UNCHECKEDPRESSED: bHot? RBS_UNCHECKEDHOT: RBS_UNCHECKEDNORMAL;
  519. if (bChecked)
  520. nState += 4;
  521. if ((bChecked == BST_INDETERMINATE) && (bStyle == BS_AUTO3STATE || bStyle == BS_3STATE))
  522. nState += 4;
  523. CRect rcRadio;
  524. CalcRect(pDC, &rcRadio, CBR_CHECKBOX);
  525. pClassButton->DrawThemeBackground(pDC, BP_CHECKBOX, nState, rcRadio);
  526. pDC->SetTextColor(pClassButton->GetThemeColor(BP_CHECKBOX, nState, TMT_TEXTCOLOR, GetColor(COLOR_BTNTEXT)));
  527. }
  528. else if (bStyle == BS_GROUPBOX)
  529. {
  530. int nState = !bEnabled? GBS_DISABLED: GBS_NORMAL;
  531. CRect rcGroupBox;
  532. CalcRect(pDC, &rcGroupBox, CBR_GROUPFRAME);
  533. pClassButton->DrawThemeBackground(pDC, BP_GROUPBOX, nState, rcGroupBox);
  534. CRect rcGrouText;
  535. CalcRect(pDC, &rcGrouText, CBR_GROUPTEXT);
  536. FillBackground(pDC, rcGrouText, WM_CTLCOLORBTN);
  537. pDC->SetTextColor(pClassButton->GetThemeColor(BP_GROUPBOX, nState, TMT_TEXTCOLOR, GetColor(COLOR_BTNTEXT)));
  538. }
  539. else
  540. {
  541. }
  542. DrawButtonText(pDC);
  543. }
  544. LRESULT CXTPSkinObjectButton::OnSetText(WPARAM wParam, LPARAM lParam)
  545. {
  546. BOOL bVisible = GetStyle() & WS_VISIBLE;
  547. if (bVisible) ModifyStyle(WS_VISIBLE, 0);
  548. LRESULT lResult = CXTPSkinObjectFrame::OnSetText(wParam, lParam);
  549. if (bVisible) ModifyStyle(0, WS_VISIBLE);
  550. Invalidate(FALSE);
  551. return lResult;
  552. }
  553. BOOL CXTPSkinObjectButton::OnHookMessage(UINT nMessage, WPARAM& wParam, LPARAM& lParam, LRESULT& lResult)
  554. {
  555. if (GetButtonStyle() >= BS_OWNERDRAW)
  556. {
  557. return FALSE;
  558. }
  559. return CXTPSkinObjectFrame::OnHookMessage(nMessage, wParam, lParam, lResult);
  560. }
  561. BOOL CXTPSkinObjectButton::OnHookDefWindowProc(UINT nMessage, WPARAM& wParam, LPARAM& lParam, LRESULT& lResult)
  562. {
  563. if (GetButtonStyle() >= BS_OWNERDRAW)
  564. {
  565. return FALSE;
  566. }
  567. if (!m_bActiveX && wParam && (nMessage == WM_PAINT || nMessage == WM_PRINTCLIENT))
  568. {
  569. OnDraw(CDC::FromHandle((HDC)wParam));
  570. return TRUE;
  571. }
  572. return CXTPSkinObjectFrame::OnHookDefWindowProc(nMessage, wParam, lParam, lResult);
  573. }
  574. LRESULT CXTPSkinObjectButton::OnUpdateUIState(WPARAM wParam, LPARAM lParam)
  575. {
  576. LRESULT lResult = ::DefWindowProc(m_hWnd, WM_UPDATEUISTATE, wParam, lParam);
  577. Invalidate(FALSE);
  578. return lResult;
  579. }