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

对话框与窗口

开发平台:

Visual C++

  1. // XTPPropertyPage.cpp : implementation file
  2. //
  3. // This file is a part of the XTREME CONTROLS 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 "XTGlobal.h"
  23. #include "XTPPropertyPage.h"
  24. #include "XTPPropertySheet.h"
  25. #include "XTPPropertyPageNavigator.h"
  26. #ifdef _DEBUG
  27. #define new DEBUG_NEW
  28. #undef THIS_FILE
  29. static char THIS_FILE[] = __FILE__;
  30. #endif
  31. #pragma warning(disable: 4355) // 'this' : used in base member initializer list
  32. /////////////////////////////////////////////////////////////////////////////
  33. // CXTPPropertyPage property page
  34. IMPLEMENT_DYNCREATE(CXTPPropertyPage, CPropertyPage)
  35. CXTPPropertyPage::CXTPPropertyPage()
  36. : CPropertyPage(), CXTResize(this, xtResizeNoClipChildren | xtResizeNoSizeIcon)
  37. {
  38. CommonConstruct();
  39. }
  40. CXTPPropertyPage::CXTPPropertyPage(UINT nIDTemplate, UINT nIDCaption)
  41. : CPropertyPage(nIDTemplate, nIDCaption), CXTResize(this, xtResizeNoClipChildren | xtResizeNoSizeIcon)
  42. {
  43. CommonConstruct();
  44. }
  45. CXTPPropertyPage::CXTPPropertyPage(LPCTSTR lpszTemplateName, UINT nIDCaption)
  46. : CPropertyPage(lpszTemplateName, nIDCaption), CXTResize(this, xtResizeNoClipChildren | xtResizeNoSizeIcon)
  47. {
  48. CommonConstruct();
  49. }
  50. void CXTPPropertyPage::CommonConstruct()
  51. {
  52. m_pSheet = 0;
  53. m_dwData = 0;
  54. m_bModified = FALSE;
  55. m_bInsideUpdate = FALSE;
  56. m_totalDev = CSize(0, 0);
  57. }
  58. CXTPPropertyPage::~CXTPPropertyPage()
  59. {
  60. }
  61. void CXTPPropertyPage::SetCaption(LPCTSTR lpszCaption)
  62. {
  63. m_strCaption = lpszCaption;
  64. m_psp.pszTitle = m_strCaption;
  65. m_psp.dwFlags |= PSP_USETITLE;
  66. }
  67. CString CXTPPropertyPage::GetCaption() const
  68. {
  69. CString strCaption;
  70. if (m_psp.dwFlags & PSP_USETITLE)
  71. {
  72. strCaption = m_psp.pszTitle;
  73. }
  74. else
  75. {
  76. GetWindowText(strCaption);
  77. }
  78. return strCaption;
  79. }
  80. void CXTPPropertyPage::DoDataExchange(CDataExchange* pDX)
  81. {
  82. CPropertyPage::DoDataExchange(pDX);
  83. //{{AFX_DATA_MAP(CXTPPropertyPage)
  84. // NOTE: the ClassWizard will add DDX and DDV calls here
  85. //}}AFX_DATA_MAP
  86. }
  87. struct DLGEXTEMPLATE
  88. {
  89. WORD dlgVer;
  90. WORD wSignature;
  91. DWORD helpID;
  92. DWORD exStyle;
  93. DWORD dwStyle;
  94. WORD cDlgItems;
  95. short x;
  96. short y;
  97. short cx;
  98. short cy;
  99. };
  100. BOOL CXTPPropertyPage::CreatePage(CWnd* pParentWnd)
  101. {
  102. if (GetSafeHwnd())
  103. return TRUE;
  104. HGLOBAL hTemplate = 0;
  105. HINSTANCE hInst = AfxGetInstanceHandle();
  106. if ((m_psp.dwFlags & PSP_DLGINDIRECT) && m_psp.pResource)
  107. {
  108. CDialogTemplate dlgTemp((LPCDLGTEMPLATE)m_psp.pResource);
  109. hTemplate = dlgTemp.Detach();
  110. }
  111. else
  112. {
  113. hInst = AfxFindResourceHandle(m_psp.pszTemplate, RT_DIALOG);
  114. if (!hInst)
  115. return FALSE;
  116. HRSRC hResource = ::FindResource(hInst, m_psp.pszTemplate, RT_DIALOG);
  117. if (!hResource)
  118. return FALSE;
  119. hTemplate = LoadResource(hInst, hResource);
  120. if (!hTemplate)
  121. return FALSE;
  122. DLGTEMPLATE* pTemplate = (DLGTEMPLATE*)LockResource(hTemplate);
  123. CDialogTemplate dlgTemp(pTemplate);
  124. UnlockResource(hTemplate);
  125. FreeResource(hTemplate);
  126. hTemplate = dlgTemp.Detach();
  127. }
  128. if (!hTemplate)
  129. return FALSE;
  130. DLGTEMPLATE* lpDialogTemplate = (DLGTEMPLATE*)GlobalLock(hTemplate);
  131. if (!lpDialogTemplate)
  132. return FALSE;
  133. DLGEXTEMPLATE* lpDialogExTemplate = (DLGEXTEMPLATE*)lpDialogTemplate;
  134. DWORD lSaveStyle;
  135. if (lpDialogExTemplate->wSignature == 0xFFFF)
  136. lSaveStyle = lpDialogExTemplate->dwStyle;
  137. else
  138. lSaveStyle = lpDialogTemplate->style;
  139. DWORD dwNewStyle = (lSaveStyle & (DS_LOCALEDIT | WS_CLIPCHILDREN | DS_SETFONT | DS_FIXEDSYS))
  140. | WS_CHILD | WS_TABSTOP | DS_3DLOOK | DS_CONTROL;
  141. if (lpDialogExTemplate->wSignature == 0xFFFF)
  142. lpDialogExTemplate->dwStyle = dwNewStyle;
  143. else
  144. lpDialogTemplate->style = dwNewStyle;
  145. BOOL bResult = CreateDlgIndirect(lpDialogTemplate, pParentWnd, hInst);
  146. GlobalUnlock(hTemplate);
  147. GlobalFree(hTemplate);
  148. m_totalDev = m_hWnd ? CXTPWindowRect(this).Size() : CSize(0, 0);
  149. m_lineDev = CXTPDrawHelpers::Dlu2Pix(5, 5);
  150. return bResult;
  151. }
  152. void CXTPPropertyPage::EndDialog(int nID)
  153. {
  154. // Normally you shouldn't call EndDialog from a page. But in case it does
  155. // happen during error situations, call CPropertySheet::EndDialog instead.
  156. CXTPPropertySheet* pParent = DYNAMIC_DOWNCAST(CXTPPropertySheet, GetParent());
  157. if (pParent != NULL)
  158. pParent->EndDialog(nID);
  159. }
  160. BEGIN_MESSAGE_MAP(CXTPPropertyPage, CPropertyPage)
  161. //{{AFX_MSG_MAP(CXTPPropertyPage)
  162. ON_WM_ERASEBKGND()
  163. ON_WM_CTLCOLOR()
  164. ON_WM_SIZE()
  165. ON_WM_HSCROLL()
  166. ON_WM_VSCROLL()
  167. ON_WM_MOUSEWHEEL()
  168. ON_WM_NCPAINT()
  169. ON_WM_NCCALCSIZE()
  170. //}}AFX_MSG_MAP
  171. END_MESSAGE_MAP()
  172. /////////////////////////////////////////////////////////////////////////////
  173. // CXTPPropertyPage message handlers
  174. BOOL CXTPPropertyPage::OnEraseBkgnd(CDC* pDC)
  175. {
  176. HBRUSH hBrush = m_pSheet->GetNavigator()->GetPageBrush(pDC, this);
  177. if (hBrush)
  178. {
  179. CXTPClientRect rc(this);
  180. ::FillRect(pDC->GetSafeHdc(), rc, hBrush);
  181. return TRUE;
  182. }
  183. return CPropertyPage::OnEraseBkgnd(pDC);
  184. }
  185. HBRUSH CXTPPropertyPage::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
  186. {
  187. if ((nCtlColor == CTLCOLOR_BTN || nCtlColor == CTLCOLOR_DLG ||
  188. nCtlColor == CTLCOLOR_STATIC ))
  189. {
  190. HBRUSH hBrush = m_pSheet->GetNavigator()->GetPageBrush(pDC, this);
  191. if (hBrush)
  192. {
  193. CXTPWindowRect rcPaint(pWnd);
  194. CXTPWindowRect rcBrush(m_hWnd);
  195. ::SetBrushOrgEx(pDC->GetSafeHdc(), rcBrush.left - rcPaint.left, rcBrush.top - rcPaint.top, NULL);
  196. ::SetBkMode(pDC->GetSafeHdc(), TRANSPARENT);
  197. ::SetTextColor(pDC->GetSafeHdc(), GetSysColor(COLOR_BTNTEXT));
  198. return hBrush;
  199. }
  200. }
  201. return CPropertyPage::OnCtlColor(pDC, pWnd, nCtlColor);
  202. }
  203. LRESULT CXTPPropertyPage::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
  204. {
  205. // TODO: Add your specialized code here and/or call the base class
  206. return CPropertyPage::WindowProc(message, wParam, lParam);
  207. }
  208. BOOL CXTPPropertyPage::OnInitDialog()
  209. {
  210. CPropertyPage::OnInitDialog();
  211. CXTResize::Init();
  212. return TRUE;
  213. }
  214. void CXTPPropertyPage::AjustResizeRect(CSize& szWindow)
  215. {
  216. CSize szMin = m_totalDev;
  217. szWindow.cx = max(szWindow.cx, szMin.cx);
  218. szWindow.cy = max(szWindow.cy, szMin.cy);
  219. }
  220. void CXTPPropertyPage::OnSize(UINT nType, int cx, int cy)
  221. {
  222. CPropertyPage::OnSize(nType, cx, cy);
  223. // UpdateBars() handles locking out recursion
  224. UpdateBars();
  225. CXTResize::Size();
  226. }
  227. void CXTPPropertyPage::GetScrollBarSizes(CSize& sizeSb)
  228. {
  229. sizeSb.cx = sizeSb.cy = 0;
  230. DWORD dwStyle = GetStyle();
  231. if (GetScrollBarCtrl(SB_VERT) == NULL)
  232. {
  233. // vert scrollbars will impact client area of this window
  234. sizeSb.cx = GetSystemMetrics(SM_CXVSCROLL);
  235. if (dwStyle & WS_BORDER)
  236. sizeSb.cx -= CX_BORDER;
  237. }
  238. if (GetScrollBarCtrl(SB_HORZ) == NULL)
  239. {
  240. // horz scrollbars will impact client area of this window
  241. sizeSb.cy = GetSystemMetrics(SM_CYHSCROLL);
  242. if (dwStyle & WS_BORDER)
  243. sizeSb.cy -= CY_BORDER;
  244. }
  245. }
  246. BOOL CXTPPropertyPage::GetTrueClientSize(CSize& size, CSize& sizeSb)
  247. // return TRUE if enough room to add scrollbars if needed
  248. {
  249. CRect rect;
  250. GetClientRect(&rect);
  251. ASSERT(rect.top == 0 && rect.left == 0);
  252. size.cx = rect.right;
  253. size.cy = rect.bottom;
  254. DWORD dwStyle = GetStyle();
  255. // first get the size of the scrollbars for this window
  256. GetScrollBarSizes(sizeSb);
  257. // first calculate the size of a potential scrollbar
  258. // (scroll bar controls do not get turned on/off)
  259. if (sizeSb.cx != 0 && (dwStyle & WS_VSCROLL))
  260. {
  261. // vert scrollbars will impact client area of this window
  262. size.cx += sizeSb.cx;   // currently on - adjust now
  263. }
  264. if (sizeSb.cy != 0 && (dwStyle & WS_HSCROLL))
  265. {
  266. // horz scrollbars will impact client area of this window
  267. size.cy += sizeSb.cy;   // currently on - adjust now
  268. }
  269. // return TRUE if enough room
  270. return (size.cx > sizeSb.cx && size.cy > sizeSb.cy);
  271. }
  272. CPoint CXTPPropertyPage::GetDeviceScrollPosition() const
  273. {
  274. CPoint pt(GetScrollPos(SB_HORZ), GetScrollPos(SB_VERT));
  275. ASSERT(pt.x >= 0 && pt.y >= 0);
  276. return pt;
  277. }
  278. // helper to return the state of the scrollbars without actually changing
  279. //  the state of the scrollbars
  280. void CXTPPropertyPage::GetScrollBarState(CSize sizeClient, CSize& needSb,
  281. CSize& sizeRange, CPoint& ptMove, BOOL bInsideClient)
  282. {
  283. // get scroll bar sizes (the part that is in the client area)
  284. CSize sizeSb;
  285. GetScrollBarSizes(sizeSb);
  286. // enough room to add scrollbars
  287. sizeRange = m_totalDev - sizeClient;
  288. // > 0 => need to scroll
  289. ptMove = GetDeviceScrollPosition();
  290. // point to move to (start at current scroll pos)
  291. BOOL bNeedH = sizeRange.cx > 0;
  292. if (!bNeedH)
  293. ptMove.x = 0;                       // jump back to origin
  294. else if (bInsideClient)
  295. sizeRange.cy += sizeSb.cy;          // need room for a scroll bar
  296. BOOL bNeedV = sizeRange.cy > 0;
  297. if (!bNeedV)
  298. ptMove.y = 0;                       // jump back to origin
  299. else if (bInsideClient)
  300. sizeRange.cx += sizeSb.cx;          // need room for a scroll bar
  301. if (bNeedV && !bNeedH && sizeRange.cx > 0)
  302. {
  303. ASSERT(bInsideClient);
  304. // need a horizontal scrollbar after all
  305. bNeedH = TRUE;
  306. sizeRange.cy += sizeSb.cy;
  307. }
  308. // if current scroll position will be past the limit, scroll to limit
  309. if (sizeRange.cx > 0 && ptMove.x >= sizeRange.cx)
  310. ptMove.x = sizeRange.cx;
  311. if (sizeRange.cy > 0 && ptMove.y >= sizeRange.cy)
  312. ptMove.y = sizeRange.cy;
  313. // now update the bars as appropriate
  314. needSb.cx = bNeedH;
  315. needSb.cy = bNeedV;
  316. // needSb, sizeRange, and ptMove area now all updated
  317. }
  318. void CXTPPropertyPage::ScrollToDevicePosition(POINT ptDev)
  319. {
  320. ASSERT(ptDev.x >= 0);
  321. ASSERT(ptDev.y >= 0);
  322. // Note: ScrollToDevicePosition can and is used to scroll out-of-range
  323. //  areas as far as CXTPPropertyPage is concerned -- specifically in
  324. //  the print-preview code.  Since OnScrollBy makes sure the range is
  325. //  valid, ScrollToDevicePosition does not vector through OnScrollBy.
  326. int xOrig = GetScrollPos(SB_HORZ);
  327. SetScrollPos(SB_HORZ, ptDev.x);
  328. int yOrig = GetScrollPos(SB_VERT);
  329. SetScrollPos(SB_VERT, ptDev.y);
  330. ScrollPage(xOrig - ptDev.x, yOrig - ptDev.y);
  331. }
  332. void CXTPPropertyPage::ScrollPage(int xAmount, int yAmount)
  333. {
  334. if (xAmount == 0 && yAmount == 0)
  335. return;
  336. ScrollWindow(xAmount, yAmount);
  337. for (int i = 0; i < (int)m_arrItems.GetSize(); i++)
  338. {
  339. CXTResizeRect& rrcWindow = m_arrItems[i]->m_rrcWindow;
  340. rrcWindow.left += xAmount;
  341. rrcWindow.right += xAmount;
  342. rrcWindow.top += yAmount;
  343. rrcWindow.bottom += yAmount;
  344. }
  345. }
  346. void CXTPPropertyPage::UpdateBars()
  347. {
  348. if (m_totalDev == CSize(0, 0))
  349. return;
  350. // UpdateBars may cause window to be resized - ignore those resizings
  351. if (m_bInsideUpdate)
  352. return;         // Do not allow recursive calls
  353. // Lock out recursion
  354. m_bInsideUpdate = TRUE;
  355. // update the horizontal to reflect reality
  356. // NOTE: turning on/off the scrollbars will cause 'OnSize' callbacks
  357. ASSERT(m_totalDev.cx >= 0 && m_totalDev.cy >= 0);
  358. CRect rectClient;
  359. BOOL bCalcClient = TRUE;
  360. CSize sizeClient;
  361. CSize sizeSb;
  362. // get client rect
  363. if (!GetTrueClientSize(sizeClient, sizeSb))
  364. {
  365. // no room for scroll bars (common for zero sized elements)
  366. CRect rect;
  367. GetClientRect(&rect);
  368. if (rect.right > 0 && rect.bottom > 0)
  369. {
  370. // if entire client area is not invisible, assume we have
  371. //  control over our scrollbars
  372. EnableScrollBarCtrl(SB_BOTH, FALSE);
  373. }
  374. m_bInsideUpdate = FALSE;
  375. return;
  376. }
  377. // enough room to add scrollbars
  378. CSize sizeRange;
  379. CPoint ptMove;
  380. CSize needSb;
  381. // get the current scroll bar state given the true client area
  382. GetScrollBarState(sizeClient, needSb, sizeRange, ptMove, bCalcClient);
  383. if (needSb.cx)
  384. sizeClient.cy -= sizeSb.cy;
  385. if (needSb.cy)
  386. sizeClient.cx -= sizeSb.cx;
  387. // first scroll the window as needed
  388. ScrollToDevicePosition(ptMove); // will set the scroll bar positions too
  389. // this structure needed to update the scrollbar page range
  390. SCROLLINFO info;
  391. info.fMask = SIF_PAGE|SIF_RANGE;
  392. info.nMin = 0;
  393. // now update the bars as appropriate
  394. EnableScrollBarCtrl(SB_HORZ, needSb.cx);
  395. if (needSb.cx)
  396. {
  397. info.nPage = sizeClient.cx;
  398. info.nMax = m_totalDev.cx-1;
  399. if (!SetScrollInfo(SB_HORZ, &info, TRUE))
  400. SetScrollRange(SB_HORZ, 0, sizeRange.cx, TRUE);
  401. }
  402. EnableScrollBarCtrl(SB_VERT, needSb.cy);
  403. if (needSb.cy)
  404. {
  405. info.nPage = sizeClient.cy;
  406. info.nMax = m_totalDev.cy-1;
  407. if (!SetScrollInfo(SB_VERT, &info, TRUE))
  408. SetScrollRange(SB_VERT, 0, sizeRange.cy, TRUE);
  409. }
  410. // remove recursion lockout
  411. m_bInsideUpdate = FALSE;
  412. }
  413. void CXTPPropertyPage::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
  414. {
  415. if (pScrollBar != NULL && pScrollBar->SendChildNotifyLastMsg())
  416. return;     // eat it
  417. // ignore scroll bar msgs from other controls
  418. if (pScrollBar != GetScrollBarCtrl(SB_HORZ))
  419. return;
  420. OnScroll(MAKEWORD(nSBCode, -1), nPos);
  421. }
  422. void CXTPPropertyPage::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
  423. {
  424. if (pScrollBar != NULL && pScrollBar->SendChildNotifyLastMsg())
  425. return;     // eat it
  426. // ignore scroll bar msgs from other controls
  427. if (pScrollBar != GetScrollBarCtrl(SB_VERT))
  428. return;
  429. OnScroll(MAKEWORD(-1, nSBCode), nPos);
  430. }
  431. BOOL CXTPPropertyPage::OnMouseWheel(UINT fFlags, short zDelta, CPoint point)
  432. {
  433. // we don't handle anything but scrolling just now
  434. if (fFlags & (MK_SHIFT | MK_CONTROL))
  435. return FALSE;
  436. // we can't get out of it--perform the scroll ourselves
  437. return DoMouseWheel(fFlags, zDelta, point);
  438. }
  439. // This function isn't virtual. If you need to override it,
  440. // you really need to override OnMouseWheel() here or in
  441. // CSplitterWnd.
  442. BOOL CXTPPropertyPage::DoMouseWheel(UINT fFlags, short zDelta, CPoint point)
  443. {
  444. UNUSED_ALWAYS(point);
  445. UNUSED_ALWAYS(fFlags);
  446. // if we have a vertical scroll bar, the wheel scrolls that
  447. // if we have _only_ a horizontal scroll bar, the wheel scrolls that
  448. // otherwise, don't do any work at all
  449. DWORD dwStyle = GetStyle();
  450. CScrollBar* pBar = GetScrollBarCtrl(SB_VERT);
  451. BOOL bHasVertBar = ((pBar != NULL) && pBar->IsWindowEnabled()) ||
  452. (dwStyle & WS_VSCROLL);
  453. pBar = GetScrollBarCtrl(SB_HORZ);
  454. BOOL bHasHorzBar = ((pBar != NULL) && pBar->IsWindowEnabled()) ||
  455. (dwStyle & WS_HSCROLL);
  456. if (!bHasVertBar && !bHasHorzBar)
  457. return FALSE;
  458. BOOL bResult = FALSE;
  459. UINT uWheelScrollLines = 3;
  460. if (bHasVertBar)
  461. {
  462. bResult = OnScrollBy(CSize(0, (zDelta < 0 ? 1 : -1) * m_lineDev.cy * uWheelScrollLines), TRUE);
  463. }
  464. else if (bHasHorzBar)
  465. {
  466. bResult = OnScrollBy(CSize((zDelta < 0 ? 1 : -1) * m_lineDev.cy * uWheelScrollLines, 0), TRUE);
  467. }
  468. if (bResult)
  469. UpdateWindow();
  470. return bResult;
  471. }
  472. BOOL CXTPPropertyPage::OnScroll(UINT nScrollCode, UINT nPos, BOOL bDoScroll)
  473. {
  474. // calc new x position
  475. int x = GetScrollPos(SB_HORZ);
  476. int xOrig = x;
  477. switch (LOBYTE(nScrollCode))
  478. {
  479. case SB_TOP:
  480. x = 0;
  481. break;
  482. case SB_BOTTOM:
  483. x = INT_MAX;
  484. break;
  485. case SB_LINEUP:
  486. x -= m_lineDev.cx;
  487. break;
  488. case SB_LINEDOWN:
  489. x += m_lineDev.cx;
  490. break;
  491. case SB_PAGEUP:
  492. x -= CXTPClientRect(this).Width();
  493. break;
  494. case SB_PAGEDOWN:
  495. x += CXTPClientRect(this).Width();
  496. break;
  497. case SB_THUMBTRACK:
  498. x = nPos;
  499. break;
  500. }
  501. // calc new y position
  502. int y = GetScrollPos(SB_VERT);
  503. int yOrig = y;
  504. switch (HIBYTE(nScrollCode))
  505. {
  506. case SB_TOP:
  507. y = 0;
  508. break;
  509. case SB_BOTTOM:
  510. y = INT_MAX;
  511. break;
  512. case SB_LINEUP:
  513. y -= m_lineDev.cy;
  514. break;
  515. case SB_LINEDOWN:
  516. y += m_lineDev.cy;
  517. break;
  518. case SB_PAGEUP:
  519. y -= CXTPClientRect(this).Height();
  520. break;
  521. case SB_PAGEDOWN:
  522. y += CXTPClientRect(this).Height();
  523. break;
  524. case SB_THUMBTRACK:
  525. y = nPos;
  526. break;
  527. }
  528. BOOL bResult = OnScrollBy(CSize(x - xOrig, y - yOrig), bDoScroll);
  529. if (bResult && bDoScroll)
  530. UpdateWindow();
  531. return bResult;
  532. }
  533. BOOL CXTPPropertyPage::OnScrollBy(CSize sizeScroll, BOOL bDoScroll)
  534. {
  535. int xOrig, x;
  536. int yOrig, y;
  537. // don't scroll if there is no valid scroll range (ie. no scroll bar)
  538. CScrollBar* pBar;
  539. DWORD dwStyle = GetStyle();
  540. pBar = GetScrollBarCtrl(SB_VERT);
  541. if ((pBar != NULL && !pBar->IsWindowEnabled()) ||
  542. (pBar == NULL && !(dwStyle & WS_VSCROLL)))
  543. {
  544. // vertical scroll bar not enabled
  545. sizeScroll.cy = 0;
  546. }
  547. pBar = GetScrollBarCtrl(SB_HORZ);
  548. if ((pBar != NULL && !pBar->IsWindowEnabled()) ||
  549. (pBar == NULL && !(dwStyle & WS_HSCROLL)))
  550. {
  551. // horizontal scroll bar not enabled
  552. sizeScroll.cx = 0;
  553. }
  554. // adjust current x position
  555. xOrig = x = GetScrollPos(SB_HORZ);
  556. int xMax = GetScrollLimit(SB_HORZ);
  557. x += sizeScroll.cx;
  558. if (x < 0)
  559. x = 0;
  560. else if (x > xMax)
  561. x = xMax;
  562. // adjust current y position
  563. yOrig = y = GetScrollPos(SB_VERT);
  564. int yMax = GetScrollLimit(SB_VERT);
  565. y += sizeScroll.cy;
  566. if (y < 0)
  567. y = 0;
  568. else if (y > yMax)
  569. y = yMax;
  570. // did anything change?
  571. if (x == xOrig && y == yOrig)
  572. return FALSE;
  573. if (bDoScroll)
  574. {
  575. // do scroll and update scroll positions
  576. ScrollPage(-(x-xOrig), -(y-yOrig));
  577. if (x != xOrig)
  578. SetScrollPos(SB_HORZ, x);
  579. if (y != yOrig)
  580. SetScrollPos(SB_VERT, y);
  581. }
  582. return TRUE;
  583. }
  584. void CXTPPropertyPage::OnNcPaint()
  585. {
  586. Default();
  587. CWindowDC dc(this);
  588. CXTPWindowRect rcPage(this);
  589. rcPage.OffsetRect(-rcPage.TopLeft());
  590. if (m_pSheet->GetPageBorderStyle() == xtpPageBorderFrame)
  591. {
  592. BOOL bFrame = FALSE;
  593. CXTPWinThemeWrapper wrpTreeView;
  594. wrpTreeView.OpenTheme(0, L"LISTBOX");
  595. if (wrpTreeView.IsAppThemed())
  596. {
  597. COLORREF clr;
  598. if (SUCCEEDED(wrpTreeView.GetThemeColor(0, 0, TMT_BORDERCOLOR, &clr)))
  599. {
  600. dc.Draw3dRect(rcPage, clr, clr);
  601. rcPage.DeflateRect(1, 1);
  602. dc.Draw3dRect(rcPage, GetXtremeColor(COLOR_WINDOW), GetXtremeColor(COLOR_WINDOW));
  603. rcPage.DeflateRect(1, 1);
  604. bFrame = TRUE;
  605. }
  606. }
  607. if (!bFrame)
  608. {
  609. dc.DrawEdge(rcPage, EDGE_SUNKEN, BF_RECT);
  610. rcPage.DeflateRect(2, 2);
  611. }
  612. }
  613. else if (m_pSheet->GetPageBorderStyle() == xtpPageBorderBottomLine)
  614. {
  615. dc.FillSolidRect(rcPage.left, rcPage.bottom - 2, rcPage.Width(), 1, GetXtremeColor(COLOR_BTNSHADOW));
  616. dc.FillSolidRect(rcPage.left, rcPage.bottom - 1, rcPage.Width(), 1, GetXtremeColor(COLOR_BTNHIGHLIGHT));
  617. rcPage.DeflateRect(0, 0, 0, 2);
  618. }
  619. if ((GetStyle() & (WS_HSCROLL | WS_VSCROLL)) == (WS_HSCROLL | WS_VSCROLL))
  620. {
  621. CRect rcSizeIcon(rcPage.right - GetSystemMetrics(SM_CXVSCROLL),
  622. rcPage.bottom - GetSystemMetrics(SM_CYHSCROLL), rcPage.right, rcPage.bottom);
  623. HBRUSH hBrush = m_pSheet->GetNavigator()->GetPageBrush(&dc, this);
  624. if (hBrush)
  625. {
  626. CXTPClientRect rc(this);
  627. ::FillRect(dc, rcSizeIcon, hBrush);
  628. }
  629. else
  630. {
  631. dc.FillSolidRect(rcSizeIcon, GetXtremeColor(COLOR_3DFACE));
  632. }
  633. }
  634. }
  635. void CXTPPropertyPage::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp)
  636. {
  637. if (m_pSheet->GetPageBorderStyle() == xtpPageBorderFrame)
  638. {
  639. RECT& rc = lpncsp->rgrc[0];
  640. rc.left   += 2;
  641. rc.top    += 2;
  642. rc.right  -= 2;
  643. rc.bottom -= 2;
  644. }
  645. if (m_pSheet->GetPageBorderStyle() == xtpPageBorderBottomLine)
  646. {
  647. lpncsp->rgrc[0].bottom -= 2;
  648. }
  649. CWnd::OnNcCalcSize(bCalcValidRects, lpncsp);
  650. }
  651. void CXTPPropertyPage::OnChildSetFocus(HWND hWndFocus)
  652. {
  653. if ((GetStyle() & (WS_HSCROLL | WS_VSCROLL)) == 0)
  654. return;
  655. CWnd* pWnd = CWnd::FromHandle(hWndFocus);
  656. if (!pWnd)
  657. return;
  658. CRect rc;
  659. pWnd->GetWindowRect(rc);
  660. ScreenToClient(rc);
  661. CXTPClientRect rcClient(this);
  662. CSize szScroll(0, 0);
  663. if (rc.bottom > rcClient.bottom)
  664. szScroll.cy = rc.bottom - rcClient.bottom;
  665. if (rc.top - szScroll.cy < rcClient.top)
  666. szScroll.cy = rc.top - rcClient.top;
  667. if (rc.right > rcClient.right)
  668. szScroll.cx = rc.right - rcClient.right;
  669. if (rc.left - szScroll.cx < rcClient.left)
  670. szScroll.cx = rc.left - rcClient.left;
  671. if (szScroll != CSize(0, 0))
  672. {
  673. OnScrollBy(szScroll, TRUE);
  674. }
  675. }
  676. //////////////////////////////////////////////////////////////////////////
  677. // CXTPPropertyPageCaption
  678. CXTPPropertyPageStaticCaption::CXTPPropertyPageStaticCaption()
  679. {
  680. };
  681. BEGIN_MESSAGE_MAP(CXTPPropertyPageStaticCaption, CWnd)
  682. ON_WM_PAINT()
  683. ON_WM_ERASEBKGND()
  684. END_MESSAGE_MAP()
  685. BOOL CXTPPropertyPageStaticCaption::OnEraseBkgnd(CDC* /*pDC*/)
  686. {
  687. return TRUE;
  688. }
  689. void CXTPPropertyPageStaticCaption::OnPaint()
  690. {
  691. CPaintDC dcPaint(this);
  692. CXTPBufferDC dc(dcPaint);
  693. CXTPClientRect rc(this);
  694. dc.FillSolidRect(rc, RGB(221, 231, 238));
  695. dc.FillSolidRect(rc.left, rc.bottom - 1, rc.Width(), 1, RGB(197, 197, 197));
  696. rc.DeflateRect(7, 0);
  697. CString strText;
  698. GetWindowText(strText);
  699. dc.SetBkMode(TRANSPARENT);
  700. dc.SetTextColor(RGB(0, 21, 110));
  701. CXTPFontDC font(&dc, &XTAuxData().fontBold);
  702. dc.DrawText(strText, rc, DT_VCENTER | DT_SINGLELINE);
  703. }