ViewPropertySheet.cpp
上传用户:sisi1999
上传日期:2007-01-02
资源大小:39k
文件大小:6k
源码类别:

PropertySheet

开发平台:

Visual C++

  1. // ViewPropertySheet.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "ViewPropertyPage.h"
  5. #include "ViewPropertySheet.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. #define WM_ADJUST WM_USER + 111
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CViewPropertySheet
  14. IMPLEMENT_DYNAMIC(CViewPropertySheet, CPropertySheet)
  15. CViewPropertySheet::CViewPropertySheet()
  16. :CPropertySheet(), m_MaxPageRect(0,0,0,0), m_MinPageRect(0,0,0,0), m_Center(FALSE), m_bOKToLeaveTab(TRUE)
  17. {
  18. }
  19. CViewPropertySheet::CViewPropertySheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
  20. :CPropertySheet(nIDCaption, pParentWnd, iSelectPage), m_MaxPageRect(0,0,0,0), m_MinPageRect(0,0,0,0), m_Center(FALSE), m_bOKToLeaveTab(true)
  21. {
  22. }
  23. CViewPropertySheet::CViewPropertySheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
  24. :CPropertySheet(pszCaption, pParentWnd, iSelectPage), m_MaxPageRect(0,0,0,0), m_MinPageRect(0,0,0,0), m_Center(FALSE), m_bOKToLeaveTab(true)
  25. {
  26. }
  27. CViewPropertySheet::~CViewPropertySheet()
  28. {
  29. }
  30. BOOL CViewPropertySheet::Create(CWnd *pParentWnd, DWORD dwStyle, DWORD dwExStyle)
  31. // Default to a Child Window overriding normal CPropertySheet Style
  32. if (dwStyle == -1)
  33. dwStyle = DS_3DLOOK | DS_CONTEXTHELP | DS_SETFONT | WS_VISIBLE | WS_CHILD;
  34. dwExStyle = dwExStyle | WS_EX_CONTROLPARENT; // Handle tab key
  35. if (!CPropertySheet::Create(pParentWnd,dwStyle,dwExStyle))
  36. return FALSE;
  37. GetClientRect(m_rectOriginal); // save original size, which is optimized for all initial pages
  38. return TRUE;
  39. }
  40. BOOL CViewPropertySheet::PreTranslateMessage(MSG* pMsg) 
  41. {
  42. // NOTE: this code will handle hotkeys for the tab controls
  43. // Hotkeys only get here if the propsheet has the focus, so must
  44.   // route hotkeys from parent view to get this to work (See CPropPgFormView::PreTranslateMessage()) 
  45. if ((pMsg->message == WM_SYSKEYDOWN) && (pMsg->wParam > 32)) {
  46. CTabCtrl *pTab = GetTabControl();
  47. int n = pTab->GetItemCount();
  48. char buf[80], shortcut[3];
  49. TC_ITEM tcItem;
  50. tcItem.mask = TCIF_TEXT;
  51. tcItem.pszText = buf;
  52. shortcut[0] = '&';
  53. shortcut[2] = '';
  54. for (int i = 0; i < n; i++ ) {
  55. tcItem.cchTextMax = sizeof(buf)-1;
  56. pTab->GetItem(i, &tcItem);
  57. shortcut[1] = (char)pMsg->wParam;
  58. if (strstr(buf, shortcut)) {
  59. if (m_bOKToLeaveTab)
  60. SetActivePage(i);
  61. return TRUE;
  62. }
  63. else {
  64. shortcut[1] = (char)(isupper(pMsg->wParam) ? tolower : toupper)(pMsg->wParam);
  65. if (strstr(buf, shortcut)) {
  66. if (m_bOKToLeaveTab)
  67. SetActivePage(i);
  68. return TRUE;
  69. }
  70. }
  71. }
  72. }
  73. // allow view to pre-translate for hotkeys
  74. CView *pView = (CView*)GetParent();
  75. if (pView->PreTranslateMessage(pMsg))
  76. return TRUE;
  77. return CPropertySheet::PreTranslateMessage(pMsg);
  78. }
  79. // Adjusts the size and position of Tabs and PropertyPages
  80. //
  81. void CViewPropertySheet::AdjustPages()
  82. {
  83. CRect rect;
  84. GetClientRect(&rect);
  85. CTabCtrl* pTab = GetTabControl();
  86. if (pTab) {
  87. pTab->Invalidate(FALSE);
  88. pTab->MoveWindow(rect, FALSE); // Resize the TabsCtrl to new size but don't draw now
  89. pTab->AdjustRect(FALSE, &rect); // Get the display area below the Tabs
  90.  
  91. int iTabHeight = rect.top; // Save the Tab Height
  92. // Which Page is being adjusted?
  93. CPropertyPage* pPage = GetActivePage();
  94. if (pPage) {
  95. CRect pageRect;
  96. //Going to be moving things without redrawing
  97. pPage->Invalidate(FALSE); 
  98. // Return to Original Dialog Size
  99. ((CViewPropertyPage*)pPage)->GetOriginalRect(&pageRect);
  100. pPage->MoveWindow(pageRect, FALSE); //Move but don't draw
  101. if (m_Center) // Move to the Center of the display area
  102. pPage->CenterWindow(pTab); // Center in Window
  103. // Adjust for tab height
  104. pPage->GetWindowRect(&pageRect);
  105. ScreenToClient(&pageRect);
  106. pageRect.OffsetRect(0,iTabHeight);
  107. pageRect.IntersectRect(pageRect,rect); // restrict to the display area
  108.  
  109. // Fit Page to the new size
  110. pPage->MoveWindow(pageRect); 
  111. }
  112. }
  113. }
  114. void CViewPropertySheet::CenterControls(BOOL bCenter /* = TRUE */)
  115. {
  116. m_Center = bCenter;
  117. PostMessage(WM_ADJUST);
  118. }
  119. void CViewPropertySheet::AllowPageChange(BOOL bAllowPageChange /* = TRUE */)
  120. {
  121. m_bOKToLeaveTab = bAllowPageChange;
  122. }
  123. BEGIN_MESSAGE_MAP(CViewPropertySheet, CPropertySheet)
  124. //{{AFX_MSG_MAP(CViewPropertySheet)
  125. ON_WM_SIZE()
  126. //}}AFX_MSG_MAP
  127. ON_MESSAGE(WM_ADJUST, OnAdjust)
  128. END_MESSAGE_MAP()
  129. /////////////////////////////////////////////////////////////////////////////
  130. // CViewPropertySheet message handlers
  131. LRESULT CViewPropertySheet::OnAdjust(WPARAM wParam, LPARAM lParam)
  132. {
  133. AdjustPages();
  134. return 0;
  135. }
  136. BOOL CViewPropertySheet::OnInitDialog() 
  137. {
  138.   ModifyStyleEx(0,WS_EX_CONTROLPARENT);
  139. BOOL bResult = CPropertySheet::OnInitDialog();
  140. // Resize the CTabCtrl and PropertyPages
  141. PostMessage(WM_ADJUST);
  142. return bResult;
  143. }
  144. BOOL CViewPropertySheet::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) 
  145. {
  146. NMHDR* pnmh = (LPNMHDR)lParam;
  147.   if (TCN_SELCHANGING == pnmh->code) // save the current page index
  148.     m_nLastActive = GetActiveIndex();       
  149. else if (TCN_SELCHANGE == pnmh->code) { // just changed tabs
  150.     if (!m_bOKToLeaveTab)
  151.       PostMessage(PSM_SETCURSEL, m_nLastActive);       
  152.     else {
  153. // NOTE: ON_NOTIFY_REFLECT does not seem to work for non-CDialog based windows, oh well...
  154. PostMessage(WM_ADJUST); // adjust the pages
  155. CView *pView = (CView*)GetParent();
  156. static NMHDR nmh = *pnmh;
  157. pView->PostMessage(WM_NOTIFY, wParam, (LPARAM)&nmh); // notify view of page change
  158. }
  159. }
  160. return CPropertySheet::OnNotify(wParam, lParam, pResult);
  161. }
  162. void CViewPropertySheet::OnSize(UINT nType, int cx, int cy) 
  163. {
  164. CPropertySheet::OnSize(nType, cx, cy);
  165. PostMessage(WM_ADJUST); // adjust the pages
  166. }