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

对话框与窗口

开发平台:

Visual C++

  1. // XTPSkinObjectFrame.cpp: implementation of the XTPSkinObjectFrame 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/XTPDrawHelpers.h"
  22. #include "XTPSkinDrawTools.h"
  23. #include "XTPSkinManager.h"
  24. #include "XTPSkinImage.h"
  25. #include "XTPSkinObjectFrame.h"
  26. #ifdef _DEBUG
  27. #define new DEBUG_NEW
  28. #undef THIS_FILE
  29. static char THIS_FILE[] = __FILE__;
  30. #endif
  31. IMPLEMENT_DYNCREATE(CXTPSkinObjectFrame, CWnd)
  32. CXTPSkinObjectFrame::CCaptionButton::CCaptionButton(int nCommand, CXTPSkinObjectFrame* pFrame, UINT nHTCode, int nClassPart)
  33. {
  34. m_pFrame = pFrame;
  35. m_nHTCode = nHTCode;
  36. m_nClassPart = nClassPart;
  37. m_nCommand = nCommand;
  38. m_bEnabled = TRUE;
  39. }
  40. BOOL CXTPSkinObjectFrame::CCaptionButton::IsPressed() const
  41. {
  42. return m_pFrame->m_pButtonPressed == this;
  43. }
  44. BOOL CXTPSkinObjectFrame::CCaptionButton::IsHighlighted() const
  45. {
  46. return m_pFrame->m_pButtonHot == this;
  47. }
  48. void CXTPSkinObjectFrame::CCaptionButton::Draw(CDC* pDC, BOOL bFrameActive)
  49. {
  50. BOOL bHot = IsHighlighted() && (IsPressed() || !m_pFrame->m_pButtonPressed);
  51. BOOL pRessed = bHot && IsPressed();
  52. int nState = !m_bEnabled ? SBS_DISABLED : pRessed? SBS_PUSHED: bHot? SBS_HOT: SBS_NORMAL;
  53. if (!bFrameActive) nState += 4;
  54. CXTPSkinManagerClass* pClassWindow = m_pFrame->GetSkinManager()->GetSkinClass(_T("WINDOW"));
  55. pClassWindow->DrawThemeBackground(pDC, m_nClassPart, nState, m_rcButton);
  56. }
  57. /////////////////////////////////////////////////////////////////////////////
  58. // CXTPSkinObjectFrame
  59. CXTPSkinObjectFrame::CXTPSkinObjectFrame()
  60. {
  61. m_rcBorders.SetRectEmpty();
  62. m_rcMenuBar.SetRectEmpty();
  63. m_pSBTrack = NULL;
  64. m_strClassName = _T("WINDOW");
  65. m_nCtlColorMessage = WM_CTLCOLORDLG;
  66. m_bMDIClient = FALSE;
  67. ZeroMemory(&m_spi[SB_VERT], sizeof(XTP_SKINSCROLLBARPOSINFO));
  68. ZeroMemory(&m_spi[SB_HORZ], sizeof(XTP_SKINSCROLLBARPOSINFO));
  69. m_spi[SB_VERT].fVert = TRUE;
  70. m_spi[SB_VERT].nBar= SB_VERT;
  71. m_spi[SB_HORZ].fVert = FALSE;
  72. m_spi[SB_HORZ].nBar = SB_HORZ;
  73. m_szFrameRegion = CSize(0, 0);
  74. m_pButtonHot = 0;
  75. m_pButtonPressed = 0;
  76. m_bActive = FALSE;
  77. m_dwExStyle = (DWORD)-1;
  78. m_dwStyle = (DWORD)-1;
  79. m_bActiveX = FALSE;
  80. m_bRegionChanged = FALSE;
  81. m_bLockFrameDraw = FALSE;
  82. m_bInUpdateRegion = FALSE;
  83. m_dwDialogTexture = ETDT_DISABLE;
  84. m_pMDIClient = NULL;
  85. }
  86. CXTPSkinObjectFrame::~CXTPSkinObjectFrame()
  87. {
  88. RemoveButtons();
  89. }
  90. void CXTPSkinObjectFrame::ScreenToFrame(LPPOINT lpPoint)
  91. {
  92. CXTPDrawHelpers::ScreenToWindow(this, lpPoint);
  93. }
  94. void CXTPSkinObjectFrame::ClientToFrame(LPPOINT lpPoint)
  95. {
  96. ClientToScreen(lpPoint);
  97. ScreenToFrame(lpPoint);
  98. }
  99. void CXTPSkinObjectFrame::AdjustFrame(CRect& rc)
  100. {
  101. rc.DeflateRect(m_rcBorders);
  102. }
  103. BEGIN_MESSAGE_MAP(CXTPSkinObjectFrame, CCmdTarget)
  104. //{{AFX_MSG_MAP(CXTPSkinObjectFrame)
  105. ON_WM_NCPAINT()
  106. ON_WM_NCCALCSIZE()
  107. ON_WM_NCMOUSEMOVE()
  108. ON_WM_NCHITTEST_EX()
  109. ON_WM_NCLBUTTONDOWN()
  110. ON_WM_NCLBUTTONDBLCLK()
  111. ON_WM_NCRBUTTONUP()
  112. ON_MESSAGE_VOID(WM_NCMOUSELEAVE, OnNcMouseLeave)
  113. ON_WM_NCACTIVATE()
  114. ON_WM_TIMER()
  115. ON_MESSAGE(WM_SETTEXT, OnSetText)
  116. ON_WM_STYLECHANGED()
  117. ON_WM_CREATE()
  118. ON_WM_WINDOWPOSCHANGING()
  119. ON_WM_WINDOWPOSCHANGED()
  120. ON_MESSAGE(WM_PRINT, OnPrint)
  121. ON_WM_GETMINMAXINFO()
  122. ON_WM_SYSCOMMAND()
  123. ON_WM_ERASEBKGND()
  124. //}}AFX_MSG_MAP
  125. END_MESSAGE_MAP()
  126. /////////////////////////////////////////////////////////////////////////////
  127. // CXTPSkinObjectFrame message handlers
  128. BOOL CXTPSkinObjectFrame::OnEraseBkgnd(CDC* pDC)
  129. {
  130. HBRUSH hbr = (HBRUSH)(DWORD_PTR)GetClassLongPtr(m_hWnd, GCLP_HBRBACKGROUND);
  131. BOOL bChanged = FALSE;
  132. if (hbr > 0 && (ULONG_PTR)hbr < (ULONG_PTR)XTP_SKINMETRICS_COLORTABLESIZE)
  133. {
  134. HBRUSH hbrTheme = GetMetrics()->m_brTheme[(ULONG_PTR)hbr - 1];
  135. SetClassLongPtr(m_hWnd, GCLP_HBRBACKGROUND, (LONG_PTR)hbrTheme);
  136. bChanged = TRUE;
  137. }
  138. BOOL bResult =  CXTPSkinObject::OnEraseBkgnd(pDC);
  139. if (bChanged)
  140. {
  141. SetClassLongPtr(m_hWnd, GCLP_HBRBACKGROUND, (LONG_PTR)hbr);
  142. }
  143. return bResult;
  144. }
  145. void CXTPSkinObjectFrame::OnNcPaint()
  146. {
  147. #if 0
  148. static _int64 nPerfomanceEnd;
  149. _int64 nPerfomanceStart;
  150. static _int64 nPerfomanceSum = 0;
  151. QueryPerformanceCounter((LARGE_INTEGER*)&nPerfomanceStart);
  152. if (nPerfomanceStart - nPerfomanceEnd  > 100000)
  153. {
  154. TRACE(_T("Reset Timer n"));
  155. nPerfomanceSum = 0;
  156. }
  157. #endif
  158. if (IsFlatScrollBarInitialized())
  159. {
  160. Default();
  161. }
  162. else
  163. {
  164. UpdateButtons();
  165. CWindowDC dc(this);
  166. DrawFrame(&dc);
  167. }
  168. #if 0
  169. QueryPerformanceCounter((LARGE_INTEGER*)&nPerfomanceEnd);
  170. nPerfomanceSum += nPerfomanceEnd - nPerfomanceStart;
  171. TRACE(_T("TotalCounter = %i n"), int(nPerfomanceSum));
  172. #endif
  173. }
  174. void CXTPSkinObjectFrame::ResizeFrame()
  175. {
  176. if (HasCaption())
  177. {
  178. CXTPWindowRect rc(this);
  179. if ((m_pManager->GetApplyOptions() & xtpSkinApplyMetrics) && ((GetStyle() & WS_CHILD) == 0))
  180. {
  181. BOOL bSmallCaption = GetExStyle() & WS_EX_TOOLWINDOW;
  182. int cyCaption = bSmallCaption ? GetMetrics()->m_cySmallCaption : GetMetrics()->m_cyCaption;
  183. int cyOsCaption = bSmallCaption ? GetMetrics()->m_cyOsSmallCaption : GetMetrics()->m_cyOsCaption;
  184. rc.bottom += cyCaption - cyOsCaption;
  185. MoveWindow(rc, FALSE);
  186. }
  187. UpdateFrameRegion(rc.Size());
  188. }
  189. }
  190. void CXTPSkinObjectFrame::OnHookAttached(LPCREATESTRUCT lpcs, BOOL bAuto)
  191. {
  192. CXTPSkinObject::OnHookAttached(lpcs, bAuto);
  193. if (!bAuto)
  194. {
  195. ResizeFrame();
  196. }
  197. }
  198. void CXTPSkinObjectFrame::RefreshFrameStyle()
  199. {
  200. if ((GetSkinManager()->GetApplyOptions() & xtpSkinApplyFrame) == 0)
  201. return;
  202. m_bLockFrameDraw++;
  203. DWORD dwStyle = GetStyle();
  204. DWORD dwStyleRemove = (WS_DLGFRAME | WS_VSCROLL | WS_HSCROLL);
  205. if (dwStyle & dwStyleRemove)
  206. {
  207. SetWindowLong(m_hWnd, GWL_STYLE, dwStyle & ~dwStyleRemove);
  208. RECT rc = CXTPWindowRect(this);
  209. SendMessage(WM_NCCALCSIZE, FALSE, (LPARAM)&rc);
  210. SetWindowLong(m_hWnd, GWL_STYLE, dwStyle);
  211. }
  212. m_bLockFrameDraw--;
  213. }
  214. void CXTPSkinObjectFrame::OnSkinChanged(BOOL bPrevState, BOOL bNewState)
  215. {
  216. if (bNewState)
  217. {
  218. RefreshFrameStyle();
  219. }
  220. if (bNewState && !bPrevState)
  221. {
  222. m_bActive = SendMessage(0x0035) != 0;
  223. }
  224. SetWindowPos(0, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED | SWP_NOACTIVATE);
  225. RefreshMetrics();
  226. CXTPWindowRect rc(this);
  227. m_szFrameRegion = CSize(0);
  228. UpdateFrameRegion(rc.Size());
  229. Invalidate();
  230. }
  231. void CXTPSkinObjectFrame::OnHookDetached(BOOL bAuto)
  232. {
  233. if (m_bRegionChanged && !bAuto && ::IsWindow(m_hWnd))
  234. {
  235. SetWindowRgn(NULL, TRUE);
  236. m_bRegionChanged = FALSE;
  237. SetWindowPos(0, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED | SWP_NOACTIVATE);
  238. }
  239. CXTPSkinObject::OnHookDetached(bAuto);
  240. }
  241. BOOL CXTPSkinObjectFrame::IsFrameScrollBars()
  242. {
  243. HWND hWnd = m_hWnd;
  244. CXTPWindowRect rcChild(hWnd);
  245. int cxEdge = GetMetrics()->m_cxEdge;
  246. int cyEdge = GetMetrics()->m_cyEdge;
  247. while (hWnd)
  248. {
  249. if ((GetWindowLong(hWnd, GWL_STYLE) & WS_CAPTION) == WS_CAPTION)
  250. {
  251. CPoint ptParent = CXTPClientRect(hWnd).BottomRight();
  252. ::ClientToScreen(hWnd, &ptParent);
  253. if ((rcChild.right + cxEdge < ptParent.x) ||
  254. (rcChild.bottom + cyEdge < ptParent.y))
  255. {
  256. return FALSE;
  257. }
  258. return hWnd ? TRUE : FALSE;
  259. }
  260. if (((GetWindowLong(hWnd, GWL_STYLE) & WS_CHILD) == 0) || ((GetWindowLong(hWnd, GWL_STYLE) & WS_CAPTION) == WS_CAPTION))
  261. break;
  262. hWnd = ::GetParent(hWnd);
  263. }
  264. return FALSE;
  265. }
  266. BOOL CXTPSkinObjectFrame::IsSizeBox()
  267. {
  268. HWND hWnd = m_hWnd;
  269. CXTPWindowRect rcChild(hWnd);
  270. int cxEdge = GetMetrics()->m_cxEdge;
  271. int cyEdge = GetMetrics()->m_cyEdge;
  272. while (hWnd)
  273. {
  274. if (GetWindowLong(hWnd, GWL_STYLE) & WS_SIZEBOX)
  275. {
  276. if ((GetWindowLong(hWnd, GWL_STYLE) & WS_MAXIMIZE))
  277. return FALSE;
  278. CPoint ptParent = CXTPClientRect(hWnd).BottomRight();
  279. ::ClientToScreen(hWnd, &ptParent);
  280. if ((rcChild.right + cxEdge < ptParent.x) ||
  281. (rcChild.bottom + cyEdge < ptParent.y))
  282. {
  283. return FALSE;
  284. }
  285. return hWnd ? TRUE : FALSE;
  286. }
  287. if (((GetWindowLong(hWnd, GWL_STYLE) & WS_CHILD) == 0) || ((GetWindowLong(hWnd, GWL_STYLE) & WS_CAPTION) == WS_CAPTION))
  288. break;
  289. hWnd = ::GetParent(hWnd);
  290. }
  291. return FALSE;
  292. }
  293. void CXTPSkinObjectFrame::RedrawFrame()
  294. {
  295. CWindowDC dc(this);
  296. DrawFrame(&dc);
  297. }
  298. void CXTPSkinObjectFrame::DrawFrame(CDC* pDC)
  299. {
  300. if (m_bLockFrameDraw)
  301. return;
  302. CXTPWindowRect rc(this);
  303. rc.OffsetRect(-rc.TopLeft());
  304. GetSkinManager()->GetSchema()->DrawThemeFrame(pDC, this);
  305. if (!m_rcMenuBar.IsRectEmpty())
  306. {
  307. DrawFrameMenuBar(pDC);
  308. }
  309. if (m_spi[SB_VERT].fVisible || m_spi[SB_HORZ].fVisible)
  310. {
  311. if (m_spi[SB_VERT].fVisible)
  312. {
  313. if (!m_pSBTrack || !m_pSBTrack->bTrackThumb)
  314. SetupScrollInfo(&m_spi[SB_VERT]);
  315. CXTPBufferDCEx dcMem(*pDC, m_spi[SB_VERT].rc);
  316. DrawScrollBar(&dcMem, &m_spi[SB_VERT]);
  317. }
  318. if (m_spi[SB_HORZ].fVisible)
  319. {
  320. if (!m_pSBTrack || !m_pSBTrack->bTrackThumb)
  321. SetupScrollInfo(&m_spi[SB_HORZ]);
  322. CXTPBufferDCEx dcMem(*pDC, m_spi[SB_HORZ].rc);
  323. DrawScrollBar(&dcMem, &m_spi[SB_HORZ]);
  324. }
  325. if (m_spi[SB_HORZ].fVisible && m_spi[SB_VERT].fVisible)
  326. {
  327. CRect rcSizeGripper(m_spi[SB_HORZ].rc.right, m_spi[SB_VERT].rc.bottom,
  328. m_spi[SB_VERT].rc.right, m_spi[SB_HORZ].rc.bottom);
  329. if (GetExStyle() & WS_EX_LEFTSCROLLBAR)
  330. {
  331. rcSizeGripper.left = m_spi[SB_VERT].rc.left;
  332. rcSizeGripper.right = m_spi[SB_HORZ].rc.left;
  333. }
  334. pDC->FillSolidRect(rcSizeGripper, m_pManager->GetSchema()->GetScrollBarSizeBoxColor(this));
  335. if (IsSizeBox())
  336. {
  337. CXTPSkinManagerClass* pClassScrollBar = GetSkinManager()->GetSkinClass(_T("SCROLLBAR"));
  338. pClassScrollBar->DrawThemeBackground(pDC, SBP_SIZEBOX, SZB_RIGHTALIGN, rcSizeGripper);
  339. }
  340. }
  341. }
  342. }
  343. BOOL CXTPSkinObjectFrame::IsFlatScrollBarInitialized() const
  344. {
  345. INT nStyle = 0;
  346. if (FlatSB_GetScrollProp(m_hWnd, WSB_PROP_VSTYLE, &nStyle))
  347. return TRUE;
  348. return FALSE;
  349. }
  350. // Not implemented
  351. BOOL CXTPSkinObjectFrame::FrameHasMenuBar()
  352. {
  353. #if 0
  354. if (GetStyle() & WS_CHILD)
  355. return FALSE;
  356. HMENU hMenu = ::GetMenu(m_hWnd);
  357. if (!hMenu)
  358. return FALSE;
  359. return GetMenuItemCount(hMenu) > 0;
  360. #else
  361. return FALSE;
  362. #endif
  363. }
  364. // Not implemented
  365. int CalcMenuBarHeight(HWND /*hWnd*/, HMENU hMenu, int /*nWidth*/)
  366. {
  367. int nHeight = GetSystemMetrics(SM_CYMENUSIZE);
  368. if (GetMenuItemCount(hMenu) == 0)
  369. return 0;
  370. return nHeight + 1;
  371. }
  372. // Not implemented
  373. void CXTPSkinObjectFrame::DrawFrameMenuBar(CDC* pDC)
  374. {
  375. #if 0
  376. CRect rc = m_rcMenuBar;
  377. pDC->FillSolidRect(rc.left, rc.top, rc.Width(), rc.Height() - 1, GetColor(COLOR_3DFACE));
  378. pDC->FillSolidRect(rc.left, rc.bottom - 1, rc.Width(), 1, GetColor(COLOR_WINDOW));
  379. CMenu* pMenu = GetMenu();
  380. int nCount = pMenu->GetMenuItemCount();
  381. CXTPFontDC font(pDC, &GetMetrics()->m_fntMenu);
  382. pDC->SetTextColor(GetColor(COLOR_MENUTEXT));
  383. pDC->SetBkMode(TRANSPARENT);
  384. int x = rc.left;
  385. TEXTMETRIC tm;
  386. pDC->GetTextMetrics(&tm);
  387. for (int nIndex = 0; nIndex < nCount; nIndex++ )
  388. {
  389. CString strMenuText;
  390. pMenu->GetMenuString(nIndex, strMenuText, MF_BYPOSITION);
  391. int nText = pDC->GetTextExtent(strMenuText).cx;
  392. CRect rcItem(x, rc.top, x + nText + (tm.tmAveCharWidth + 1) * 2, rc.bottom - 2);
  393. pDC->DrawText(strMenuText, rcItem, DT_VCENTER | DT_CENTER | DT_SINGLELINE);
  394. x = rcItem.right;
  395. }
  396. #else
  397. pDC;
  398. #endif
  399. }
  400. void CXTPSkinObjectFrame::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp)
  401. {
  402. if (IsFlatScrollBarInitialized())
  403. {
  404. m_spi[SB_VERT].fVisible = FALSE;
  405. m_spi[SB_HORZ].fVisible = FALSE;
  406. CXTPSkinObject::OnNcCalcSize(bCalcValidRects, lpncsp);
  407. return;
  408. }
  409. m_rcBorders = GetSkinManager()->GetSchema()->CalcFrameBorders(this);
  410. lpncsp[0].rgrc->top += m_rcBorders.top;
  411. lpncsp[0].rgrc->left += m_rcBorders.left;
  412. lpncsp[0].rgrc->right -= m_rcBorders.right;
  413. lpncsp[0].rgrc->bottom -= m_rcBorders.bottom;
  414. DWORD dwStyle = GetStyle();
  415. if (FrameHasMenuBar())
  416. {
  417. int nHeight = CalcMenuBarHeight(m_hWnd, ::GetMenu(m_hWnd), lpncsp[0].rgrc->right - lpncsp[0].rgrc->left);
  418. m_rcMenuBar.SetRect(m_rcBorders.left, m_rcBorders.top, m_rcBorders.left + lpncsp[0].rgrc->right - lpncsp[0].rgrc->left, m_rcBorders.top + nHeight);
  419. lpncsp[0].rgrc->top += nHeight;
  420. }
  421. else
  422. {
  423. m_rcMenuBar.SetRectEmpty();
  424. }
  425. m_spi[SB_VERT].fVisible = dwStyle & WS_VSCROLL;
  426. m_spi[SB_HORZ].fVisible = dwStyle & WS_HSCROLL;
  427. if (m_spi[SB_VERT].fVisible)
  428. {
  429. if (GetExStyle() & (WS_EX_LAYOUTRTL | WS_EX_LEFTSCROLLBAR))
  430. lpncsp[0].rgrc->left += GetMetrics()->m_cxVScroll;
  431. else
  432. lpncsp[0].rgrc->right -= GetMetrics()->m_cxVScroll;
  433. }
  434. if (m_spi[SB_HORZ].fVisible)
  435. {
  436. lpncsp[0].rgrc->bottom -= GetMetrics()->m_cyHScroll;
  437. }
  438. if (lpncsp[0].rgrc->bottom < lpncsp[0].rgrc->top)
  439. lpncsp[0].rgrc->bottom = lpncsp[0].rgrc->top;
  440. if (lpncsp[0].rgrc->right < lpncsp[0].rgrc->left)
  441. lpncsp[0].rgrc->right = lpncsp[0].rgrc->left;
  442. }
  443. LRESULT CXTPSkinObjectFrame::HandleNcHitTest(CPoint point)
  444. {
  445. ScreenToFrame(&point);
  446. DWORD dwStyle = GetStyle();
  447. if ((dwStyle & WS_VSCROLL) && m_spi[SB_VERT].fVisible && ::PtInRect(&m_spi[SB_VERT].rc, point))
  448. return (LRESULT)HTVSCROLL;
  449. if ((dwStyle & WS_HSCROLL) &&m_spi[SB_HORZ].fVisible && ::PtInRect(&m_spi[SB_HORZ].rc, point))
  450. return (LRESULT)HTHSCROLL;
  451. if ((dwStyle & WS_VSCROLL) && m_spi[SB_VERT].fVisible && (dwStyle & WS_HSCROLL) && m_spi[SB_HORZ].fVisible && IsSizeBox())
  452. {
  453. CRect rcSizeGripper(m_spi[SB_HORZ].rc.right, m_spi[SB_VERT].rc.bottom,
  454. m_spi[SB_VERT].rc.right, m_spi[SB_HORZ].rc.bottom);
  455. if (rcSizeGripper.PtInRect(point))
  456. return GetExStyle() & WS_EX_LAYOUTRTL ? HTBOTTOMLEFT : HTBOTTOMRIGHT;
  457. }
  458. if (m_rcMenuBar.PtInRect(point))
  459. return HTMENU;
  460. CCaptionButton* pButtonHot = HitTestButton(point);
  461. if (pButtonHot)
  462. {
  463. return pButtonHot->m_nHTCode;
  464. }
  465. return (LRESULT)HTNOWHERE;
  466. }
  467. LRESULT CXTPSkinObjectFrame::OnNcHitTest(CPoint point)
  468. {
  469. LRESULT nHitCode = (LRESULT)CXTPSkinObject::OnNcHitTest(point);
  470. LRESULT nHitCode2 = HandleNcHitTest(point);
  471. if (nHitCode2 != HTNOWHERE)
  472. return nHitCode2;
  473. if (nHitCode == HTCLOSE || nHitCode == HTMAXBUTTON || nHitCode == HTMINBUTTON || nHitCode == HTHELP)
  474. return (LRESULT)HTCAPTION;
  475. if ((nHitCode == HTVSCROLL || nHitCode == HTHSCROLL) && !IsFlatScrollBarInitialized())
  476. return (LRESULT)HTCLIENT;
  477. return nHitCode;
  478. }
  479. void CXTPSkinObjectFrame::CancelMouseLeaveTracking()
  480. {
  481. KillTimer(XTP_TID_MOUSELEAVE);
  482. }
  483. void CXTPSkinObjectFrame::OnTimer(UINT_PTR uTimerID)
  484. {
  485. if (uTimerID == XTP_TID_REFRESHFRAME)
  486. {
  487. RefreshFrameStyle();
  488. KillTimer(XTP_TID_REFRESHFRAME);
  489. return;
  490. }
  491. if (uTimerID == XTP_TID_MOUSELEAVE)
  492. {
  493. RECT rect;
  494. POINT pt;
  495. GetWindowRect(&rect);
  496. ::GetCursorPos (&pt);
  497. if (::GetCapture() != NULL)
  498. return;
  499. LRESULT lHitTest = HandleNcHitTest(MAKELPARAM(pt.x, pt.y));
  500. if ((lHitTest == HTCLIENT || lHitTest == HTNOWHERE || lHitTest == HTBOTTOMRIGHT || lHitTest == HTBOTTOMLEFT) || !::PtInRect (&rect, pt))
  501. {
  502. HandleMouseMove(CPoint(-1, -1));
  503. CancelMouseLeaveTracking();
  504. }
  505. return;
  506. }
  507. CXTPSkinObject::OnTimer(uTimerID);
  508. }
  509. BOOL CXTPSkinObjectFrame::HandleMouseMove(CPoint point)
  510. {
  511. CPoint ptClient(point);
  512. ScreenToFrame(&ptClient);
  513. CCaptionButton* pButton = HitTestButton(ptClient);
  514. if (m_pButtonHot != pButton)
  515. {
  516. if (m_pButtonHot && !pButton)
  517. CancelMouseLeaveTracking();
  518. m_pButtonHot = pButton;
  519. InvalidateButtons();
  520. if (m_pButtonHot)
  521. {
  522. SetTimer (XTP_TID_MOUSELEAVE, 50, NULL);
  523. return  TRUE;
  524. }
  525. }
  526. if (m_pSBTrack)
  527. return TRUE;
  528. BOOL bResult = FALSE;
  529. for (int i = 0; i < 2; i++)
  530. {
  531. XTP_SKINSCROLLBARPOSINFO* pSBInfo = &m_spi[i];
  532. int ht = HitTestScrollBar(pSBInfo, ptClient);
  533. if (ht != pSBInfo->ht && pSBInfo->fVisible)
  534. {
  535. if (pSBInfo->ht != HTNOWHERE && ht == HTNOWHERE && !bResult)
  536. {
  537. CancelMouseLeaveTracking();
  538. }
  539. pSBInfo->ht = ht;
  540. RedrawScrollBar(pSBInfo);
  541. }
  542. if (ht != HTNOWHERE)
  543. {
  544. SetTimer (XTP_TID_MOUSELEAVE, 50, NULL);
  545. bResult = TRUE;
  546. }
  547. }
  548. return bResult;
  549. }
  550. void CXTPSkinObjectFrame::OnNcMouseMove(UINT nHitTest, CPoint point)
  551. {
  552. if (HandleMouseMove(point))
  553. return;
  554. CXTPSkinObject::OnNcMouseMove(nHitTest, point);
  555. }
  556. void CXTPSkinObjectFrame::OnNcMouseLeave()
  557. {
  558. if (HandleMouseMove(CPoint(-1, -1)))
  559. return;
  560. Default();
  561. }
  562. void CXTPSkinObjectFrame::OnNcLButtonDblClk(UINT nHitTest, CPoint point)
  563. {
  564. OnNcLButtonDown(nHitTest, point);
  565. }
  566. void CXTPSkinObjectFrame::OnNcRButtonUp(UINT nHitTest, CPoint point)
  567. {
  568. CPoint ptClient(point);
  569. ScreenToFrame(&ptClient);
  570. for (int i = 0; i < 2; i++)
  571. {
  572. XTP_SKINSCROLLBARPOSINFO* pSBInfo = &m_spi[i];
  573. int ht = HitTestScrollBar(pSBInfo, ptClient);
  574. if (ht != HTNOWHERE)
  575. {
  576. m_bLockFrameDraw++;
  577. RECT rc = CXTPWindowRect(this);
  578. SendMessage(WM_NCCALCSIZE, FALSE, (LPARAM)&rc);
  579. m_bLockFrameDraw--;
  580. SendMessage(WM_CONTEXTMENU, (WPARAM)m_hWnd, MAKELPARAM(point.x, point.y));
  581. RefreshFrameStyle();
  582. return;
  583. }
  584. }
  585. CXTPSkinObject::OnNcRButtonDown(nHitTest, point);
  586. }
  587. void CXTPSkinObjectFrame::OnNcLButtonDown(UINT nHitTest, CPoint point)
  588. {
  589. if (m_pButtonHot)
  590. {
  591. TrackCaptionButton();
  592. }
  593. CPoint ptClient(point);
  594. ScreenToFrame(&ptClient);
  595. for (int i = 0; i < 2; i++)
  596. {
  597. XTP_SKINSCROLLBARPOSINFO* pSBInfo = &m_spi[i];
  598. int ht = HitTestScrollBar(pSBInfo, ptClient);
  599. if (ht != HTNOWHERE)
  600. {
  601. TrackInit(ptClient, pSBInfo, (GetKeyState(VK_SHIFT) < 0) ? TRUE : FALSE);
  602. return;
  603. }
  604. }
  605. if (nHitTest == HTZOOM || nHitTest == HTREDUCE || nHitTest == HTCLOSE || nHitTest == HTHELP)
  606. return;
  607. CXTPSkinObject::OnNcLButtonDown(nHitTest, point);
  608. }
  609. BOOL CXTPSkinObjectFrame::OnHookDefWindowProc(UINT nMessage, WPARAM& wParam, LPARAM& lParam, LRESULT& lResult)
  610. {
  611. if (nMessage == WM_CTLCOLORBTN || nMessage == WM_CTLCOLORDLG ||
  612. nMessage == WM_CTLCOLORSTATIC || nMessage == WM_CTLCOLOREDIT || nMessage == WM_CTLCOLORLISTBOX)
  613. {
  614. if (m_strClassName == _T("COMBOBOX"))
  615. return FALSE;
  616. if (nMessage == WM_CTLCOLOREDIT || nMessage == WM_CTLCOLORLISTBOX)
  617. {
  618. ::SetBkColor((HDC)wParam, GetColor(COLOR_WINDOW));
  619. ::SetTextColor((HDC)wParam, GetColor(COLOR_WINDOWTEXT));
  620. lResult = (LRESULT)GetMetrics()->m_brTheme[COLOR_WINDOW];
  621. return TRUE;
  622. }
  623. if (CWnd::GrayCtlColor((HDC)wParam, (HWND)lParam,
  624. (UINT)(nMessage - WM_CTLCOLORMSGBOX),
  625. m_pManager->GetMetrics()->m_brushDialog, 0))
  626. {
  627. lResult = (LRESULT)GetClientBrush((HDC)wParam, (HWND)lParam, (UINT)(nMessage - WM_CTLCOLORMSGBOX));
  628. return TRUE;
  629. }
  630. }
  631. return CXTPSkinObject::OnHookDefWindowProc(nMessage, wParam, lParam, lResult);
  632. }
  633. BOOL CXTPSkinObjectFrame::IsDefWindowProcAvail(int nMessage) const
  634. {
  635. if (!CXTPSkinObject::IsDefWindowProcAvail(nMessage))
  636. return FALSE;
  637. return TRUE;
  638. }
  639. BOOL CXTPSkinObjectFrame::PreHookMessage(UINT nMessage)
  640. {
  641. if ((nMessage == WM_ENTERIDLE) &&
  642. ((GetStyle() & (WS_CAPTION | WS_MINIMIZE | WS_VISIBLE)) == (WS_CAPTION | WS_MINIMIZE | WS_VISIBLE)))
  643. {
  644. RedrawFrame();
  645. }
  646. if (m_bLockFrameDraw && (nMessage == WM_NCCALCSIZE || nMessage == WM_STYLECHANGED || nMessage == WM_STYLECHANGING))
  647. return TRUE;
  648. if ((m_pManager->GetApplyOptions() & xtpSkinApplyFrame) == 0)
  649. {
  650. if (nMessage == WM_NCPAINT || nMessage == WM_NCCALCSIZE ||
  651. nMessage == WM_NCHITTEST || nMessage == WM_NCLBUTTONDOWN ||
  652. nMessage == WM_NCLBUTTONDBLCLK ||
  653. nMessage == WM_WINDOWPOSCHANGED || nMessage == WM_NCMOUSEMOVE ||
  654. nMessage == WM_NCMOUSELEAVE || nMessage == WM_NCACTIVATE ||
  655. nMessage == WM_WINDOWPOSCHANGING || nMessage == WM_PRINT)
  656. return TRUE;
  657. }
  658. return CXTPSkinObject::PreHookMessage(nMessage);
  659. }
  660. BOOL CXTPSkinObjectFrame::OnHookMessage(UINT nMessage, WPARAM& wParam, LPARAM& lParam, LRESULT& lResult)
  661. {
  662. if (nMessage == WM_CTLCOLORBTN || nMessage == WM_CTLCOLORDLG ||
  663. nMessage == WM_CTLCOLORSTATIC || nMessage == WM_CTLCOLORLISTBOX  || nMessage == WM_CTLCOLOREDIT)
  664. {
  665. if (m_strClassName == _T("COMBOBOX"))
  666. return FALSE;
  667. if (IsDefWindowProcAvail(nMessage) &&
  668. (m_dwDialogTexture != ETDT_ENABLETAB || !m_bActiveX))
  669. {
  670. return FALSE;
  671. }
  672. if (nMessage == WM_CTLCOLORLISTBOX || nMessage == WM_CTLCOLOREDIT)
  673. {
  674. ::SetBkColor((HDC)wParam, GetColor(COLOR_WINDOW));
  675. ::SetTextColor((HDC)wParam, GetColor(COLOR_WINDOWTEXT));
  676. lResult = (LRESULT)GetMetrics()->m_brTheme[COLOR_WINDOW];
  677. return TRUE;
  678. }
  679. // handle standard gray backgrounds if enabled
  680. if (CWnd::GrayCtlColor((HDC)wParam, (HWND)lParam,
  681. (UINT)(nMessage - WM_CTLCOLORMSGBOX),
  682. m_pManager->GetMetrics()->m_brushDialog, 0))
  683. {
  684. lResult = (LRESULT)GetClientBrush((HDC)wParam, (HWND)lParam, (UINT)(nMessage - WM_CTLCOLORMSGBOX));
  685. return TRUE;
  686. }
  687. }
  688. if (nMessage == WM_ERASEBKGND && m_dwDialogTexture == ETDT_ENABLETAB)
  689. {
  690. ::SetBrushOrgEx((HDC)wParam, 0, 0, NULL);
  691. FillRect((HDC)wParam, CXTPClientRect(this), GetClientBrush((HDC)wParam, m_hWnd, CTLCOLOR_DLG));
  692. return TRUE;
  693. }
  694. return CXTPSkinObject::OnHookMessage(nMessage, wParam, lParam, lResult);
  695. }
  696. //////////////////////////////////////////////////////////////////////////
  697. // CXTPSkinObjectFrame;
  698. void CXTPSkinObjectFrame::RemoveButtons()
  699. {
  700. for (int i = 0; i < m_arrButtons.GetSize(); i++)
  701. delete m_arrButtons[i];
  702. m_arrButtons.RemoveAll();
  703. }
  704. void CXTPSkinObjectFrame::UpdateButton(int nCommand, BOOL bVisible, BOOL bEnabled, UINT htCode, int nClassPart)
  705. {
  706. if (bVisible)
  707. {
  708. CCaptionButton* pButton = new CCaptionButton(nCommand, this, htCode, nClassPart);
  709. pButton->m_bEnabled = bEnabled;
  710. m_arrButtons.Add(pButton);
  711. }
  712. }
  713. void CXTPSkinObjectFrame::UpdateButtons()
  714. {
  715. DWORD dwExStyle = GetExStyle();
  716. DWORD dwStyle = GetStyle();
  717. if (m_dwStyle == dwStyle && m_dwExStyle == dwExStyle)
  718. return;
  719. m_dwExStyle = dwExStyle;
  720. m_dwStyle = dwStyle;
  721. RemoveButtons();
  722. if (HasCaption())
  723. {
  724. BOOL bToolWindow = (dwExStyle & WS_EX_TOOLWINDOW) == WS_EX_TOOLWINDOW;
  725. BOOL bMaximized = (dwStyle & WS_MAXIMIZE) == WS_MAXIMIZE;
  726. BOOL bMinimized = (dwStyle & WS_MINIMIZE) == WS_MINIMIZE;
  727. BOOL bSysMenu = (dwStyle & WS_SYSMENU);
  728. BOOL bDialogFrame = (dwStyle & WS_DLGFRAME || dwExStyle & WS_EX_DLGMODALFRAME);
  729. BOOL bEnableClose = TRUE;
  730. BOOL bEnabledMaximize = ((dwStyle & WS_MAXIMIZEBOX) == WS_MAXIMIZEBOX);
  731. BOOL bEnabledMinimize = ((dwStyle & WS_MINIMIZEBOX) == WS_MINIMIZEBOX);
  732. BOOL bShowMinMaxButtons = !bToolWindow && bSysMenu && (bEnabledMaximize || bEnabledMinimize);
  733. if (bSysMenu && !bToolWindow)
  734. {
  735. CMenu* pMenu = GetSystemMenu(FALSE);
  736. if (pMenu->GetMenuState(SC_CLOSE, MF_BYCOMMAND) & (MF_DISABLED | MF_GRAYED)) bEnableClose = FALSE;
  737. }
  738. UpdateButton(SC_CLOSE, !bDialogFrame || bSysMenu,
  739. bEnableClose, HTCLOSE, bToolWindow? WP_SMALLCLOSEBUTTON: WP_CLOSEBUTTON);
  740. UpdateButton(SC_MAXIMIZE, !bMaximized && bShowMinMaxButtons,
  741. bEnabledMaximize, HTMAXBUTTON, WP_MAXBUTTON);
  742. if (bMinimized)
  743. {
  744. UpdateButton(SC_RESTORE, bShowMinMaxButtons,
  745. bEnabledMinimize, HTMINBUTTON, WP_RESTOREBUTTON);
  746. }
  747. else
  748. {
  749. UpdateButton(SC_RESTORE,  bMaximized && bShowMinMaxButtons,
  750. bEnabledMaximize, HTMAXBUTTON, WP_RESTOREBUTTON);
  751. UpdateButton(SC_MINIMIZE, bShowMinMaxButtons,
  752. bEnabledMinimize, HTMINBUTTON, WP_MINBUTTON);
  753. }
  754. UpdateButton(SC_CONTEXTHELP, ((dwExStyle & WS_EX_CONTEXTHELP) == WS_EX_CONTEXTHELP) && !bToolWindow && bSysMenu,
  755. TRUE, HTHELP, WP_HELPBUTTON);
  756. }
  757. }
  758. CXTPSkinObjectFrame::CCaptionButton* CXTPSkinObjectFrame::HitTestButton(CPoint pt)
  759. {
  760. DWORD dwStyle = GetStyle();
  761. for (int i = 0; i < m_arrButtons.GetSize(); i++)
  762. {
  763. CCaptionButton* pButton = m_arrButtons[i];
  764. CRect rcButton(pButton->m_rcButton);
  765. if ((dwStyle & (WS_MAXIMIZE | WS_CHILD)) == WS_MAXIMIZE)
  766. rcButton.InflateRect(0, 2, i == 0 ? 2 : 0, 0);
  767. if (rcButton.PtInRect(pt) && pButton->m_bEnabled)
  768. return pButton;
  769. }
  770. return NULL;
  771. }
  772. /////////////////////////////////////////////////////////////////////////////
  773. // CXTPSkinObjectFrame message handlers
  774. LRESULT CXTPSkinObjectFrame::OnSetText(WPARAM wParam, LPARAM lParam)
  775. {
  776. if ((GetStyle() & WS_CAPTION) == WS_CAPTION)
  777. {
  778. LRESULT lRet = DefWindowProc(WM_SETTEXT, wParam, lParam);
  779. RedrawFrame();
  780. return lRet;
  781. }
  782. return Default();
  783. }
  784. HWND CXTPSkinObjectFrame::FindMDIClient()
  785. {
  786. return m_pMDIClient ? m_pMDIClient->m_hWnd : NULL;
  787. }
  788. #if (_MSC_VER <= 1200) && !defined(_WIN64)
  789. #define GetWindowLongPtrW GetWindowLongW
  790. #define GetWindowLongPtrA GetWindowLongA
  791. #endif
  792. #ifndef DWLP_DLGPROC
  793. #define DWLP_DLGPROC 4
  794. #endif
  795. LRESULT CXTPSkinObjectFrame::CallDefDlgProc(UINT nMessage, WPARAM wParam, LPARAM lParam)
  796. {
  797. if (m_dwDialogTexture == ETDT_ENABLE) // Dialog ?
  798. {
  799. int nNotifyFormat = (int)SendMessage(WM_NOTIFYFORMAT, 0, NF_QUERY);
  800. WNDPROC pDlgWndProc = (WNDPROC) (nNotifyFormat == NFR_UNICODE ?
  801. GetWindowLongPtrW(m_hWnd, DWLP_DLGPROC) : GetWindowLongPtrA(m_hWnd, DWLP_DLGPROC));
  802. if (pDlgWndProc && (HIWORD((ULONG)(ULONG_PTR)pDlgWndProc) != 0xFFFF))
  803. {
  804. return (pDlgWndProc)(m_hWnd, nMessage, wParam, lParam);
  805. }
  806. }
  807. return 0;
  808. }
  809. BOOL CXTPSkinObjectFrame::OnNcActivate(BOOL bActive)
  810. {
  811. if (HasCaption())
  812. {
  813. CallDefDlgProc(WM_NCACTIVATE, (WPARAM)bActive, 0);
  814. if (!bActive)
  815. {
  816. CWnd* pWnd = CWnd::FromHandlePermanent(m_hWnd);
  817. // Mimic MFC kludge to stay active if WF_STAYACTIVE bit is on
  818. //
  819. if (pWnd && pWnd->m_nFlags & WF_STAYACTIVE)
  820. bActive = TRUE;
  821. if (!IsWindowEnabled())
  822. bActive = FALSE;
  823. }
  824. HWND hWndClient = FindMDIClient();
  825. HWND hWndActive = hWndClient ? (HWND)::SendMessage(hWndClient, WM_MDIGETACTIVE, 0, 0) : NULL;
  826. if (hWndActive != m_hWnd && hWndActive)
  827. {
  828. ::SendMessage(hWndActive, WM_NCACTIVATE, bActive, 0);
  829. ::SendMessage(hWndActive, WM_NCPAINT, 0, 0);
  830. }
  831. m_bActive = bActive;            // update state
  832. RedrawFrame();
  833. return TRUE;
  834. }
  835. return CXTPSkinObject::OnNcActivate(bActive);
  836. }
  837. int CXTPSkinObjectFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  838. {
  839. if (CXTPSkinObject::OnCreate(lpCreateStruct) == -1)
  840. return -1;
  841. ResizeFrame();
  842. return 0;
  843. }
  844. BOOL CXTPSkinObjectFrame::HasCaption() const
  845. {
  846. return (GetStyle() & WS_CAPTION) == WS_CAPTION;
  847. }
  848. void CXTPSkinObjectFrame::UpdateFrameRegion(CSize szFrameRegion)
  849. {
  850. if (m_bInUpdateRegion)
  851. return;
  852. m_bInUpdateRegion = TRUE;
  853. if (m_bRegionChanged && !HasCaption())
  854. {
  855. SetWindowRgn(NULL, TRUE);
  856. m_bRegionChanged = FALSE;
  857. }
  858. //  DWORD dwStyle = GetStyle();
  859. if (HasCaption() && (m_szFrameRegion != szFrameRegion))
  860. {
  861. if (GetSkinManager()->IsEnabled() && GetSkinManager()->GetApplyOptions() & xtpSkinApplyFrame)
  862. {
  863. HRGN hRgn = GetSkinManager()->GetSchema()->CalcFrameRegion(this, szFrameRegion);
  864. SetWindowRgn(hRgn, TRUE);
  865. m_bRegionChanged = TRUE;
  866. }
  867. else if (m_bRegionChanged)
  868. {
  869. SetWindowRgn(NULL, TRUE);
  870. m_bRegionChanged = FALSE;
  871. }
  872. m_szFrameRegion = szFrameRegion;
  873. }
  874. m_bInUpdateRegion = FALSE;
  875. }
  876. void CXTPSkinObjectFrame::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)
  877. {
  878. CXTPSkinObject::OnWindowPosChanging(lpwndpos);
  879. CSize szFrameRegion(lpwndpos->cx, lpwndpos->cy);
  880. if (((lpwndpos->flags & SWP_NOSIZE) ==  0) && (m_szFrameRegion != szFrameRegion))
  881. {
  882. if ((GetExStyle() & WS_EX_LAYOUTRTL) == 0)
  883. UpdateFrameRegion(szFrameRegion);
  884. }
  885. }
  886. void CXTPSkinObjectFrame::OnWindowPosChanged(WINDOWPOS FAR* lpwndpos)
  887. {
  888. CXTPSkinObject::OnWindowPosChanged(lpwndpos);
  889. CSize szFrameRegion(lpwndpos->cx, lpwndpos->cy);
  890. if (((lpwndpos->flags & SWP_NOSIZE) ==  0) && (m_szFrameRegion != szFrameRegion))
  891. {
  892. if ((GetExStyle() & WS_EX_LAYOUTRTL) != 0)
  893. UpdateFrameRegion(szFrameRegion);
  894. }
  895. }
  896. void CXTPSkinObjectFrame::RefreshMetrics()
  897. {
  898. CXTPSkinObject::RefreshMetrics();
  899. m_szFrameRegion = CSize(0, 0);
  900. PostMessage(WM_SYSCOLORCHANGE);
  901. }
  902. void CXTPSkinObjectFrame::InvalidateButtons()
  903. {
  904. RedrawFrame();
  905. }
  906. void CXTPSkinObjectFrame::TrackCaptionButton()
  907. {
  908. SetCapture();
  909. BOOL bAccept = FALSE;
  910. m_pButtonPressed = m_pButtonHot;
  911. CCaptionButton* pButtonPressed = m_pButtonHot;
  912. ASSERT(pButtonPressed);
  913. RedrawFrame();
  914. while (::GetCapture() == m_hWnd)
  915. {
  916. MSG msg;
  917. if (!::GetMessage(&msg, NULL, 0, 0))
  918. {
  919. AfxPostQuitMessage((int)msg.wParam);
  920. break;
  921. }
  922. if (msg.message == WM_LBUTTONUP)
  923. {
  924. bAccept = m_pButtonPressed == pButtonPressed;
  925. break;
  926. }
  927. else if (msg.message == WM_NCMOUSELEAVE)
  928. {
  929. }
  930. else if (msg.message == WM_MOUSEMOVE)
  931. {
  932. POINT point = msg.pt;
  933. ScreenToFrame(&point);
  934. CCaptionButton* pButton = HitTestButton(point) == pButtonPressed ? pButtonPressed : NULL;
  935. if (pButton != m_pButtonPressed)
  936. {
  937. m_pButtonPressed = pButton;
  938. RedrawFrame();
  939. }
  940. }
  941. else
  942. {
  943. TranslateMessage(&msg);
  944. DispatchMessage(&msg);
  945. }
  946. }
  947. m_pButtonPressed = NULL;
  948. m_pButtonHot = NULL;
  949. ReleaseCapture();
  950. RedrawFrame();
  951. if (bAccept)
  952. {
  953. SendMessage(WM_SYSCOMMAND, pButtonPressed->m_nCommand);
  954. }
  955. }
  956. LRESULT CXTPSkinObjectFrame::OnPrint(WPARAM wParam, LPARAM lParam)
  957. {
  958. LRESULT lResult = TRUE;
  959. if (lParam != PRF_NONCLIENT)
  960. {
  961. m_bLockFrameDraw++;
  962. lResult = DefWindowProc(WM_PRINT, wParam, lParam);
  963. m_bLockFrameDraw--;
  964. }
  965. if (lParam & PRF_NONCLIENT)
  966. {
  967. if (m_spi[SB_VERT].fVisible) m_spi[SB_VERT].fVisible = GetStyle() & WS_VSCROLL;
  968. if (m_spi[SB_HORZ].fVisible) m_spi[SB_HORZ].fVisible = GetStyle() & WS_HSCROLL;
  969. CDC* pDC = CDC::FromHandle((HDC)wParam);
  970. if ((GetExStyle() & WS_EX_LAYOUTRTL) && !XTPDrawHelpers()->IsContextRTL(pDC))
  971. XTPDrawHelpers()->SetContextRTL(pDC, 1);
  972. DrawFrame(pDC);
  973. }
  974. return lResult;
  975. }
  976. void CXTPSkinObjectFrame::OnSysCommand(UINT nID, LPARAM lParam)
  977. {
  978. UINT nCmd = (nID & 0xFFF0);
  979. if ((nCmd == SC_MAXIMIZE) && (m_pManager->GetApplyOptions() & xtpSkinApplyMetrics) &&
  980. ((GetExStyle() & WS_EX_MDICHILD) == WS_EX_MDICHILD) &&
  981. ((GetStyle() & WS_MAXIMIZE) == 0))
  982. {
  983. CXTPSkinObject::OnSysCommand(nID, lParam);
  984. RECT rc;
  985. GetParent()->GetClientRect(&rc);
  986. int cx = rc.right - rc.left;
  987. int cy = rc.bottom - rc.top;
  988. rc.left = -m_rcBorders.left;
  989. rc.top = -m_rcBorders.top;
  990. rc.right = cx + m_rcBorders.right;
  991. rc.bottom = cy + m_rcBorders.bottom;
  992. MoveWindow(rc.left, rc.top,
  993. rc.right - rc.left, rc.bottom - rc.top, TRUE);
  994. return;
  995. }
  996. if (nCmd == SC_MOUSEMENU || nCmd == SC_KEYMENU || nCmd == SC_MOUSEMENU)
  997. {
  998. if (HasCaption() && (m_pManager->GetApplyOptions() & xtpSkinApplyMetrics))
  999. {
  1000. RECT rc = {0, 0, 100, 100};
  1001. AdjustWindowRectEx(&rc, GetStyle(), FALSE, GetExStyle());
  1002. CRect rcBorder = GetSkinManager()->GetSchema()->CalcFrameBorders(this);
  1003. m_sMenuOffset.y = rcBorder.top + rc.top;
  1004. m_sMenuOffset.x = rcBorder.left + rc.left;
  1005. }
  1006. }
  1007. if ((nCmd == SC_MOVE) && (GetStyle() & WS_MINIMIZE))
  1008. {
  1009. DoDefWindowProc(WM_NCPAINT, 0, 0);
  1010. RedrawFrame();
  1011. }
  1012. CXTPSkinObject::OnSysCommand(nID, lParam);
  1013. if (nCmd == SC_MINIMIZE)
  1014. {
  1015. RedrawFrame();
  1016. }
  1017. m_sMenuOffset.x = m_sMenuOffset.y = 0;
  1018. }
  1019. void CXTPSkinObjectFrame::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
  1020. {
  1021. CXTPSkinObject::OnGetMinMaxInfo(lpMMI);
  1022. if ((m_pManager->GetApplyOptions() & xtpSkinApplyFrame) && HasCaption())
  1023. {
  1024. int yMin = m_rcBorders.top + m_rcBorders.bottom;
  1025. int xMin = (int)m_arrButtons.GetSize() * m_rcBorders.top;
  1026. xMin += GetSystemMetrics(SM_CYSIZE) + 2 * GetSystemMetrics(SM_CXEDGE);
  1027. lpMMI->ptMinTrackSize.x = max(lpMMI->ptMinTrackSize.x, xMin);
  1028. lpMMI->ptMinTrackSize.y = max(lpMMI->ptMinTrackSize.y, yMin);
  1029. }
  1030. if ((m_pManager->GetApplyOptions() & xtpSkinApplyMetrics) && ((GetExStyle() & WS_EX_MDICHILD) == WS_EX_MDICHILD))
  1031. {
  1032. int nDelta = m_rcBorders.top + lpMMI->ptMaxPosition.y;
  1033. lpMMI->ptMaxPosition.y -= nDelta;
  1034. lpMMI->ptMaxSize.y += nDelta;
  1035. }
  1036. }
  1037. void CXTPSkinObjectFrame::OnStyleChanged(int nStyleType, LPSTYLESTRUCT lpStyleStruct)
  1038. {
  1039. CXTPSkinObject::OnStyleChanged(nStyleType, lpStyleStruct);
  1040. m_rcBorders = GetSkinManager()->GetSchema()->CalcFrameBorders(this);
  1041. CXTPWindowRect rc(this);
  1042. m_szFrameRegion = CSize(0);
  1043. UpdateFrameRegion(rc.Size());
  1044. UpdateButtons();
  1045. }
  1046. int CXTPSkinObjectFrame::GetClientBrushMessage()
  1047. {
  1048. return m_nCtlColorMessage;
  1049. }
  1050. HBRUSH CXTPSkinObjectFrame::GetClientBrush(CDC* pDC)
  1051. {
  1052. return GetFillBackgroundBrush(pDC, GetClientBrushMessage());
  1053. }
  1054. HBRUSH CXTPSkinObjectFrame::GetFillBackgroundBrush(CDC* pDC, int nMessage)
  1055. {
  1056. if (GetParent() == NULL)
  1057. return GetMetrics()->m_brTheme[COLOR_3DFACE];
  1058. HBRUSH hBrush = (HBRUSH)::SendMessage(GetParent()->GetSafeHwnd(), nMessage, (WPARAM)pDC->GetSafeHdc(), (LPARAM)m_hWnd);
  1059. if (hBrush)
  1060. {
  1061. if ((DWORD_PTR)hBrush < XTP_SKINMETRICS_COLORTABLESIZE)
  1062. {
  1063. hBrush = GetMetrics()->m_brTheme[(DWORD_PTR)hBrush - 1];
  1064. }
  1065. return hBrush;
  1066. }
  1067. return nMessage == WM_CTLCOLOREDIT || nMessage == WM_CTLCOLORLISTBOX ?
  1068. GetMetrics()->m_brTheme[COLOR_WINDOW] :
  1069. GetMetrics()->m_brTheme[COLOR_3DFACE];
  1070. }
  1071. HBRUSH CXTPSkinObjectFrame::FillBackground(CDC* pDC, LPCRECT lprc, int nMessage /*= WM_CTLCOLORSTATIC*/)
  1072. {
  1073. HBRUSH hBrush = ::GetParent(m_hWnd) ? (HBRUSH)::SendMessage(::GetParent(m_hWnd), nMessage, (WPARAM)pDC->GetSafeHdc(), (LRESULT)m_hWnd) : NULL;
  1074. if (hBrush)
  1075. {
  1076. if ((DWORD_PTR)hBrush < XTP_SKINMETRICS_COLORTABLESIZE)
  1077. {
  1078. hBrush = GetMetrics()->m_brTheme[(DWORD_PTR)hBrush - 1];
  1079. }
  1080. ::FillRect(pDC->GetSafeHdc(), lprc, hBrush);
  1081. return hBrush;
  1082. }
  1083. pDC->FillSolidRect(lprc, GetColor(COLOR_3DFACE));
  1084. return GetMetrics()->m_brTheme[COLOR_3DFACE];
  1085. }