SheetInDlg.cpp
上传用户:hjw22cn
上传日期:2007-01-11
资源大小:192k
文件大小:5k
源码类别:

Tab控件

开发平台:

Visual C++

  1. // this file contains the functions necessary to place the property sheet into a dialog box.
  2. #include "stdafx.h"
  3. #include "SheetInDlg.h"
  4. #ifdef _DEBUG
  5. #define new DEBUG_NEW
  6. #undef THIS_FILE
  7. static char THIS_FILE[] = __FILE__;
  8. #endif
  9. //-----------------------------------------------------------------------------/
  10. BOOL CreateDlgSheet(CWnd* pParent, CPropertySheet* pPSheet, DWORD dwStyle/*=WS_CHILD | WS_VISIBLE*/, DWORD dwExStyle/*=0*/)
  11. {
  12. ASSERT_VALID(pParent);
  13. ASSERT_VALID(pPSheet);
  14. // 1 - Create the embedded property sheet window
  15. if (!pPSheet->Create(pParent, dwStyle, dwExStyle))
  16. {
  17. TRACE0("Embedded property sheet creation failedn");
  18. return FALSE;
  19. }
  20. // 2 - Add WS_TABSTOP and WS_EX_CONTROLPARENT to the property sheet styles
  21. pPSheet->ModifyStyle(0, WS_TABSTOP);
  22. pPSheet->ModifyStyleEx(0, WS_EX_CONTROLPARENT);
  23. // 3 - Add WS_EX_CONTROLPARENT to the parent window styles
  24. pParent->ModifyStyleEx (0, WS_EX_CONTROLPARENT);
  25. return TRUE;
  26. }
  27. //-----------------------------------------------------------------------------/
  28. void MoveDlgSheet(CWnd* pParent, CPropertySheet* pPSheet, CRect rcNewPos)
  29. {
  30. ASSERT_VALID(pParent);
  31. ASSERT_VALID(pPSheet);
  32. // 0 - get the currently active page and set redraw to false.  This
  33. // will keep the dialog box from flashing when it's resized
  34. int nCurrentPage = pPSheet->GetActiveIndex();
  35. pPSheet->SetRedraw(FALSE);
  36. // 1 - Get current coordinates of tab control
  37. // and property sheet window
  38. CTabCtrl* pTabCtrl = pPSheet->GetTabControl();
  39. ASSERT(pTabCtrl != NULL);
  40. CRect rcTabCtrl;
  41. pTabCtrl->GetWindowRect(&rcTabCtrl);
  42. pParent->ScreenToClient(&rcTabCtrl);
  43. CRect rcPSheet;
  44. pPSheet->GetWindowRect(&rcPSheet);
  45. pParent->ScreenToClient(&rcPSheet);
  46. // 2 - Calculate margin between property sheet
  47. // and tab control
  48. int dcx = rcPSheet.Width() - rcTabCtrl.Width();
  49. int dcy = rcPSheet.Height() - rcTabCtrl.Height();
  50. // 3 - Move and resize property sheet window
  51. // (also moves the tab window because it is a child
  52. // of the property sheet window)
  53. pPSheet->MoveWindow(rcNewPos.left, rcNewPos.top, rcNewPos.Width(), rcNewPos.Height());
  54. // 4 - Resize tab control window to restore
  55. // right / bottom margins
  56. pTabCtrl->SetWindowPos(NULL,
  57.                        0, 0,
  58.                        rcNewPos.Width() - dcx, rcNewPos.Height() - dcy, 
  59.                        SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE );
  60. // 5 - turn the drawing back on now, and invalidate the whole dialog
  61. pPSheet->SetRedraw(TRUE);
  62. pParent->Invalidate();
  63. // now reset the active page
  64. pPSheet->SetActivePage(nCurrentPage);
  65. }
  66. //-----------------------------------------------------------------------------/
  67. void MoveDlgSheet(CWnd* pParent, CPropertySheet* pPSheet, UINT nIDPSheetArea )
  68. {
  69. ASSERT_VALID(pParent);
  70. ASSERT_VALID(pPSheet);
  71. // 1 - Retrieve property sheet destination position
  72. CRect rcNewPosition;
  73. CWnd* pWndNewArea = pParent->GetDlgItem(nIDPSheetArea);
  74. if (pWndNewArea == NULL)
  75. {
  76. ASSERT(FALSE); // Invalid nIDPSheetArea
  77. return;
  78. }
  79. pWndNewArea->GetWindowRect(&rcNewPosition);
  80. pParent->ScreenToClient(&rcNewPosition);
  81. // 2 - Call overloaded function
  82. MoveDlgSheet(pParent, pPSheet, rcNewPosition);
  83. }
  84. void MoveWndSheet(CWnd* pParent, CPropertySheet* pPSheet, CRect rcNewPos)
  85. {
  86. ASSERT_VALID(pParent);
  87. ASSERT_VALID(pPSheet);
  88. // 0 - get the currently active page and set redraw to false.  This
  89. // will keep the dialog box from flashing when it's resized
  90. int nCurrentPage = pPSheet->GetActiveIndex();
  91. pPSheet->SetRedraw(FALSE);
  92. // 1 - Get current coordinates of tab control
  93. // and property sheet window
  94. CTabCtrl* pTabCtrl = pPSheet->GetTabControl();
  95. ASSERT(pTabCtrl != NULL);
  96. CRect rcTabCtrl;
  97. pTabCtrl->GetWindowRect(&rcTabCtrl);
  98. pParent->ScreenToClient(&rcTabCtrl);
  99. CRect rcPSheet;
  100. pPSheet->GetWindowRect(&rcPSheet);
  101. pParent->ScreenToClient(&rcPSheet);
  102. // 2 - Calculate margin between property sheet
  103. // and tab control
  104. int dcx = rcPSheet.Width() - rcTabCtrl.Width();
  105. int dcy = rcPSheet.Height() - rcTabCtrl.Height();
  106. // 3 - Move and resize property sheet window
  107. // (also moves the tab window because it is a child
  108. // of the property sheet window)
  109. pPSheet->MoveWindow(rcNewPos.left, rcNewPos.top, rcNewPos.Width(), rcNewPos.Height());
  110. // 4 - Resize tab control window to restore
  111. // right / bottom margins
  112. pTabCtrl->SetWindowPos(NULL,
  113.                        0, 0,
  114.                        rcNewPos.Width() - dcx, rcNewPos.Height() - dcy, 
  115.                        SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE );
  116. // 5 - turn the drawing back on now, and invalidate the whole dialog
  117. pPSheet->SetRedraw(TRUE);
  118. pParent->Invalidate();
  119. // now reset the active page
  120. pPSheet->SetActivePage(nCurrentPage);
  121. }