ResizablePropertySheet.cpp
上传用户:sdnygcb
上传日期:2007-01-02
资源大小:18k
文件大小:5k
源码类别:

PropertySheet

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "ResizablePropertySheet.h"
  3. #ifdef _DEBUG
  4. #undef THIS_FILE
  5. static char BASED_CODE THIS_FILE[] = __FILE__;
  6. #endif
  7. IMPLEMENT_DYNAMIC(CResizablePropertySheet, CPropertySheet)
  8. CResizablePropertySheet::CResizablePropertySheet()
  9. {
  10. }
  11. CResizablePropertySheet::CResizablePropertySheet(UINT nIDCaption, CWnd *pParentWnd, UINT iSelectPage) : CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
  12. {
  13. }
  14. CResizablePropertySheet::CResizablePropertySheet(LPCTSTR pszCaption, CWnd *pParentWnd, UINT iSelectPage) : CPropertySheet(pszCaption, pParentWnd, iSelectPage)
  15. {
  16. }
  17. CResizablePropertySheet::~CResizablePropertySheet()
  18. {
  19. }
  20. BEGIN_MESSAGE_MAP(CResizablePropertySheet, CPropertySheet)
  21. //{{AFX_MSG_MAP(CResizablePropertySheet)
  22. ON_WM_SIZE()
  23. ON_WM_GETMINMAXINFO()
  24. ON_WM_PAINT()
  25. //}}AFX_MSG_MAP
  26. END_MESSAGE_MAP()
  27. void CResizablePropertySheet::GetPageRect(RECT *pRect)
  28. {
  29. CRect rcClient;
  30. GetClientRect(rcClient);
  31. // Set the page rect and adjust using the original page size
  32. pRect->left   = m_rcPage.left;
  33. pRect->top    = m_rcPage.top;
  34. pRect->right  = rcClient.right - (m_rcClient.right - m_rcPage.right);
  35. pRect->bottom = rcClient.bottom - (m_rcClient.bottom - m_rcPage.bottom);
  36. }
  37. void CResizablePropertySheet::OnSize(UINT nType, int cx, int cy) 
  38. {
  39. // Must repeatidly do this to keep the frame from restoring itself
  40. ModifyStyle(0, WS_THICKFRAME);
  41. CPropertySheet::OnSize(nType, cx, cy);
  42. // Make sure to erase the previous gripper position
  43. InvalidateRect(m_rcGripper, TRUE);
  44. if (GetTabControl()) {
  45. CRect rcClient;
  46. GetClientRect(rcClient);
  47. CRect rcPage;
  48. GetPageRect(rcPage);
  49. // Resize all pages created 
  50. for (INT i = 0; i < GetPageCount(); i++) {
  51. CPropertyPage *page = GetPage(i);
  52. if (IsWindow(page->GetSafeHwnd()))
  53. page->MoveWindow(rcPage);
  54. }
  55. // Resize other controls
  56. m_Resize.Resize(this);
  57. }
  58. }
  59. BOOL CResizablePropertySheet::OnInitDialog() 
  60. {
  61. CPropertySheet::OnInitDialog();
  62. ASSERT(GetActivePage() != 0);
  63. // Get the original client rect
  64. GetClientRect(m_rcClient);
  65. // Get the original page size 
  66. GetActivePage()->GetWindowRect(m_rcPage);
  67. ScreenToClient(m_rcPage);
  68. // Add all the controls to the resizer
  69. if (GetDlgItem(ID_APPLY_NOW) != 0)
  70. m_Resize.Add(this, ID_APPLY_NOW, RESIZE_LOCKBOTTOM|RESIZE_LOCKRIGHT);
  71. if (GetDlgItem(ID_WIZBACK) != 0)
  72. m_Resize.Add(this, ID_WIZBACK, RESIZE_LOCKBOTTOM|RESIZE_LOCKRIGHT);
  73. if (GetDlgItem(ID_WIZNEXT) != 0)
  74. m_Resize.Add(this, ID_WIZNEXT, RESIZE_LOCKBOTTOM|RESIZE_LOCKRIGHT);
  75. if (GetDlgItem(ID_WIZFINISH) != 0)
  76. m_Resize.Add(this, ID_WIZFINISH, RESIZE_LOCKBOTTOM|RESIZE_LOCKRIGHT);
  77. if (GetDlgItem(IDOK) != 0)
  78. m_Resize.Add(this, IDOK, RESIZE_LOCKBOTTOM|RESIZE_LOCKRIGHT);
  79. if (GetDlgItem(IDHELP) != 0)
  80. m_Resize.Add(this, IDHELP, RESIZE_LOCKBOTTOM|RESIZE_LOCKRIGHT);
  81. if (GetDlgItem(IDCANCEL) != 0)
  82. m_Resize.Add(this, IDCANCEL, RESIZE_LOCKBOTTOM|RESIZE_LOCKRIGHT);
  83. if (GetDlgItem(AFX_IDC_TAB_CONTROL) != 0)
  84. m_Resize.Add(this, AFX_IDC_TAB_CONTROL, RESIZE_LOCKALL);
  85. // Undocumented stuff, resize the two lines in wizard mode
  86. // Found the ID:s by using the Spy++ utility
  87. if (GetDlgItem(0x3026) != 0)
  88. m_Resize.Add(this, 0x3026, RESIZE_LOCKBOTTOM|RESIZE_LOCKRIGHT|RESIZE_LOCKLEFT);
  89. if (GetDlgItem(0x3027) != 0)
  90. m_Resize.Add(this, 0x3027, RESIZE_LOCKBOTTOM|RESIZE_LOCKRIGHT|RESIZE_LOCKLEFT);
  91. // Set the resizable border
  92. ModifyStyle(0, WS_THICKFRAME);
  93. return TRUE; 
  94. }
  95. LRESULT CResizablePropertySheet::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
  96. {
  97. // In wizard mode, it seems like the tab control does not send notification
  98. // messages (Spy++ says it is disabled) when a page is activated. 
  99. // Therefore this is done to resize the page when it becomes active.
  100. // Is there a better way?
  101. if (message == WM_COMMAND) {
  102. UINT nNotifyCode = HIWORD(wParam); // notification code 
  103. UINT nID = LOWORD(wParam);         // item, control, or accelerator identifier 
  104. HWND hwndCtl = (HWND)lParam;       // handle of control 
  105. if (nNotifyCode == BN_CLICKED && (nID == ID_WIZNEXT || nID == ID_WIZBACK || nID == ID_WIZFINISH)) {
  106. LRESULT result = CPropertySheet::WindowProc(message, wParam, lParam);
  107. // Make sure to resize it
  108. CRect rcPage;
  109. GetPageRect(rcPage);
  110. GetActivePage()->MoveWindow(rcPage);
  111. return result;
  112. }
  113. }
  114. return CPropertySheet::WindowProc(message, wParam, lParam);
  115. }
  116. void CResizablePropertySheet::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) 
  117. {
  118. CRect rc = m_rcClient;
  119. // Adjust it according to the window style
  120. AdjustWindowRect(rc, GetStyle(), FALSE);
  121. // Make sure it does not get smaller than the initial size
  122. lpMMI->ptMinTrackSize.x = rc.Width();
  123. lpMMI->ptMinTrackSize.y = rc.Height();
  124. CPropertySheet::OnGetMinMaxInfo(lpMMI);
  125. }
  126. void CResizablePropertySheet::OnPaint() 
  127. {
  128. CPaintDC dc(this); 
  129. CRect rect;
  130. GetClientRect(&rect);
  131. // Get the standard size of the gripper
  132. rect.left = rect.right-GetSystemMetrics(SM_CXHSCROLL);
  133. rect.top  = rect.bottom-GetSystemMetrics(SM_CYVSCROLL);
  134. // Dra it
  135. dc.DrawFrameControl(&rect, DFC_SCROLL, DFCS_SCROLLSIZEGRIP);
  136. // Save the painted rect so we can invalidate the rect on next OnSize()
  137. m_rcGripper = rect;
  138. }