void CResizableSheetEx::PresetLayout() { if (IsWizard() || IsWizard97()) // wizard mode { // hide tab control GetTabControl()->ShowWindow(SW_HIDE); AddAnchor(ID_WIZLINE, BOTTOM_LEFT, BOTTOM_RIGHT); if (IsWizard97()) // add header line for wizard97 dialogs AddAnchor(ID_WIZLINEHDR, TOP_LEFT, TOP_RIGHT); } else // tab mode { AddAnchor(AFX_IDC_TAB_CONTROL, TOP_LEFT, BOTTOM_RIGHT); } // add a callback for active page (which can change at run-time) m_nCallbackID = AddAnchorCallback(); // use *total* parent size to have correct margins CRect rectPage, rectSheet; GetTotalClientRect(&rectSheet); GetActivePage()->GetWindowRect(&rectPage); ::MapWindowPoints(NULL, m_hWnd, (LPPOINT)&rectPage, 2); // pre-calculate margins m_sizePageTL = rectPage.TopLeft() - rectSheet.TopLeft(); m_sizePageBR = rectPage.BottomRight() - rectSheet.BottomRight(); // add all possible buttons, if they exist for (int i = 0; i < _propButtonsCount; i++) { if (NULL != GetDlgItem(_propButtons[i])) AddAnchor(_propButtons[i], BOTTOM_RIGHT); } }
void CResizableSheetEx::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) { MinMaxInfo(lpMMI); CTabCtrl* pTab = GetTabControl(); if (!pTab) return; int nCount = GetPageCount(); for (int idx = 0; idx < nCount; ++idx) { if (IsWizard()) // wizard mode { // use pre-calculated margins CRect rectExtra(-CPoint(m_sizePageTL), -CPoint(m_sizePageBR)); // add non-client size ::AdjustWindowRectEx(&rectExtra, GetStyle(), !(GetStyle() & WS_CHILD) && ::IsMenu(GetMenu()->GetSafeHmenu()), GetExStyle()); ChainMinMaxInfo(lpMMI, *GetPage(idx), rectExtra.Size()); } else if (IsWizard97()) // wizard 97 { // use pre-calculated margins CRect rectExtra(-CPoint(m_sizePageTL), -CPoint(m_sizePageBR)); if (!(GetPage(idx)->m_psp.dwFlags & PSP_HIDEHEADER)) { // add header vertical offset CRect rectLine, rectSheet; GetTotalClientRect(&rectSheet); GetAnchorPosition(ID_WIZLINEHDR, rectSheet, rectLine); rectExtra.top = -rectLine.bottom; } // add non-client size ::AdjustWindowRectEx(&rectExtra, GetStyle(), !(GetStyle() & WS_CHILD) && ::IsMenu(GetMenu()->GetSafeHmenu()), GetExStyle()); ChainMinMaxInfo(lpMMI, *GetPage(idx), rectExtra.Size()); } else // tab mode { ChainMinMaxInfoCB(lpMMI, *GetPage(idx)); } } }
BOOL CResizableSheetEx::OnEraseBkgnd(CDC* pDC) { if (ClipChildren(pDC, FALSE)) { // when clipping, remove header from clipping area if (IsWizard97()) { // clip header area out CRect rect; GetHeaderRect(rect); pDC->ExcludeClipRect(rect); } } BOOL bRet = CPropertySheetEx::OnEraseBkgnd(pDC); ClipChildren(pDC, TRUE); return bRet; }
void CResizableSheetEx::OnSize(UINT nType, int cx, int cy) { CWnd::OnSize(nType, cx, cy); if (nType == SIZE_MAXHIDE || nType == SIZE_MAXSHOW) return; // arrangement not needed if (nType == SIZE_MAXIMIZED) HideSizeGrip(&m_dwGripTempState); else ShowSizeGrip(&m_dwGripTempState); // update grip and layout UpdateSizeGrip(); ArrangeLayout(); if (IsWizard97()) { // refresh header area CRect rect; GetHeaderRect(rect); InvalidateRect(rect, FALSE); } }
BOOL CResizableSheetEx::ArrangeLayoutCallback(LAYOUTINFO &layout) const { if (layout.nCallbackID != m_nCallbackID) // we only added 1 callback return CResizableLayout::ArrangeLayoutCallback(layout); // set layout info for active page layout.hWnd = (HWND)::SendMessage(GetSafeHwnd(), PSM_GETCURRENTPAGEHWND, 0, 0); if (!::IsWindow(layout.hWnd)) return FALSE; // set margins if (IsWizard()) // wizard mode { // use pre-calculated margins layout.marginTopLeft = m_sizePageTL; layout.marginBottomRight = m_sizePageBR; } else if (IsWizard97()) // wizard 97 { // use pre-calculated margins layout.marginTopLeft = m_sizePageTL; layout.marginBottomRight = m_sizePageBR; if (!(GetActivePage()->m_psp.dwFlags & PSP_HIDEHEADER)) { // add header vertical offset CRect rectLine, rectSheet; GetTotalClientRect(&rectSheet); GetAnchorPosition(ID_WIZLINEHDR, rectSheet, rectLine); layout.marginTopLeft.cy = rectLine.bottom; } } else // tab mode { CTabCtrl* pTab = GetTabControl(); ASSERT(pTab != NULL); // get tab position after resizing and calc page rect CRect rectPage, rectSheet; GetTotalClientRect(&rectSheet); if (!GetAnchorPosition(pTab->m_hWnd, rectSheet, rectPage)) return FALSE; // no page yet // temporarily resize the tab control to calc page size CRect rectSave; pTab->GetWindowRect(rectSave); ::MapWindowPoints(NULL, m_hWnd, (LPPOINT)&rectSave, 2); pTab->SetRedraw(FALSE); pTab->MoveWindow(rectPage, FALSE); pTab->AdjustRect(FALSE, &rectPage); pTab->MoveWindow(rectSave, FALSE); pTab->SetRedraw(TRUE); // set margins layout.marginTopLeft = rectPage.TopLeft() - rectSheet.TopLeft(); layout.marginBottomRight = rectPage.BottomRight() - rectSheet.BottomRight(); } // set anchor types layout.anchorTopLeft = TOP_LEFT; layout.anchorBottomRight = BOTTOM_RIGHT; // use this layout info return TRUE; }
void CResizableSheetEx::PresetLayout() { if (IsWizard() || IsWizard97()) // wizard mode { // hide tab control GetTabControl()->ShowWindow(SW_HIDE); AddAnchor(ID_WIZLINE, BOTTOM_LEFT, BOTTOM_RIGHT); if (IsWizard97()) // add header line for wizard97 dialogs AddAnchor(ID_WIZLINEHDR, TOP_LEFT, TOP_RIGHT); } else // tab mode { AddAnchor(AFX_IDC_TAB_CONTROL, TOP_LEFT, BOTTOM_RIGHT); } // add a callback for active page (which can change at run-time) m_nCallbackID = AddAnchorCallback(); // use *total* parent size to have correct margins CRect rectPage, rectSheet; GetTotalClientRect(&rectSheet); GetActivePage()->GetWindowRect(&rectPage); ::MapWindowPoints(NULL, m_hWnd, (LPPOINT)&rectPage, 2); // pre-calculate margins m_sizePageTL = rectPage.TopLeft() - rectSheet.TopLeft(); m_sizePageBR = rectPage.BottomRight() - rectSheet.BottomRight(); // add all possible buttons, if they exist for (int i = 0; i < _propButtonsCount; i++) { CButton* dlgBtn = reinterpret_cast<CButton*>(GetDlgItem(_propButtons[i])); if (dlgBtn != NULL) { CRect rcBtn; CString sBtn; dlgBtn->GetWindowRect(rcBtn); ScreenToClient(rcBtn); HBITMAP hBmp = NULL; switch(_propButtons[i]) { case ID_WIZBACK: dlgBtn->SetWindowPos(NULL, rcBtn.left - 16, rcBtn.top - 8, rcBtn.Width(), rcBtn.Height() + 4, SWP_NOZORDER | SWP_NOREDRAW); sBtn.LoadString(IDS_BACK); //sBtn.Insert(0, _T(" ")); dlgBtn->SetWindowText(sBtn); m_BtnNavBack.SubclassDlgItem(_propButtons[i], this); m_BtnNavBack.SetIcon(IDI_ICON_NAV_BACK); rcBtn.right = rcBtn.Width() * 2 + 10; rcBtn.left = 5; rcBtn.top -= 10; rcBtn.bottom -= 3; m_BtnDonate.Create(_T("Help keep us strong!"), WS_CHILD | WS_VISIBLE | WS_GROUP, rcBtn, this, ID_WIZDONATE); m_BtnDonate.SetIcon(IDI_ICON_DONATE); m_BtnDonate.SetAlign(CButtonST::ST_ALIGN_HORIZ); m_BtnDonate.SetDisplayStyle(CButtonST::DISP_FLAT); m_BtnDonate.SetFont(GetFont(), FALSE); AddAnchor(ID_WIZDONATE, BOTTOM_LEFT); AddAnchor(_propButtons[i], BOTTOM_RIGHT); break; case ID_WIZNEXT: dlgBtn->SetWindowPos(NULL, rcBtn.left - 14, rcBtn.top - 8, rcBtn.Width(), rcBtn.Height() + 4, SWP_NOZORDER | SWP_NOREDRAW); sBtn.LoadString(IDS_NEXT); //sBtn.Append(_T(" ")); dlgBtn->SetWindowText(sBtn); m_BtnNavNext.SubclassDlgItem(_propButtons[i], this); m_BtnNavNext.SetIcon(IDI_ICON_NAV_NEXT); m_BtnNavNext.SetAlign(CButtonST::ST_ALIGN_HORIZ_RIGHT); AddAnchor(_propButtons[i], BOTTOM_RIGHT); break; case IDCANCEL: dlgBtn->SetWindowPos(NULL, rcBtn.left - 14, rcBtn.top - 8, rcBtn.Width(), rcBtn.Height() + 4, SWP_NOZORDER | SWP_NOREDRAW); sBtn.LoadString(IDS_CANCEL); //sBtn.Append(_T(" ")); dlgBtn->SetWindowText(sBtn); m_BtnNavCancel.SubclassDlgItem(_propButtons[i], this); m_BtnNavCancel.SetIcon(IDI_ICON_NAV_CANCEL); m_BtnNavCancel.SetAlign(CButtonST::ST_ALIGN_HORIZ_RIGHT); AddAnchor(_propButtons[i], BOTTOM_RIGHT); break; case ID_WIZFINISH: dlgBtn->SetWindowPos(NULL, rcBtn.left - 14, rcBtn.top - 8, rcBtn.Width(), rcBtn.Height() + 4, SWP_NOZORDER | SWP_NOREDRAW); sBtn.LoadString(IDS_FINISH); //sBtn.Append(_T(" ")); dlgBtn->SetWindowText(sBtn); m_BtnNavFinish.SubclassDlgItem(_propButtons[i], this); m_BtnNavFinish.SetIcon(IDI_ICON_NAV_FINISH); m_BtnNavFinish.SetAlign(CButtonST::ST_ALIGN_HORIZ_RIGHT); AddAnchor(_propButtons[i], BOTTOM_RIGHT); break; } } } }
void CResizableSheetEx::PresetLayout() { // set the initial size as the min track size CRect rc; GetWindowRect(&rc); SetMinTrackSize(rc.Size()); // use *total* parent size to have correct margins CRect rectPage, rectSheet; GetTotalClientRect(&rectSheet); // get page area if (IsWizard() || IsWizard97()) { HWND hPage = PropSheet_GetCurrentPageHwnd(m_hWnd); ::GetWindowRect(hPage, &rectPage); } else { GetTabControl()->GetWindowRect(&rectPage); } ::MapWindowPoints(NULL, m_hWnd, (LPPOINT)&rectPage, 2); // calculate margins CRect rect; int cxDiff = rectSheet.right - rectPage.right; int cyDiff = 0; // try all possible buttons for (int i = 0; i < _propButtonsCount; i++) { CWnd* pWnd = GetDlgItem(_propButtons[i]); if (NULL != pWnd) { // move buttons if necessary if (GetStyle() & WS_CHILD) { pWnd->GetWindowRect(&rect); ::MapWindowPoints(NULL, m_hWnd, (LPPOINT)&rect, 2); cyDiff = rectSheet.bottom - rect.bottom; rect.OffsetRect(cxDiff, cyDiff); pWnd->MoveWindow(&rect); } // add buttons to the layout manager AddAnchor(_propButtons[i], BOTTOM_RIGHT); } } // setup pages area if (IsWizard() || IsWizard97()) { // move line and pages if necessary if (GetStyle() & WS_CHILD) { GetDlgItem(ID_WIZLINE)->GetWindowRect(&rect); ::MapWindowPoints(NULL, m_hWnd, (LPPOINT)&rect, 2); rect.OffsetRect(0, cyDiff); rect.InflateRect(cxDiff, 0); GetDlgItem(ID_WIZLINE)->MoveWindow(&rect); rectPage.bottom += cyDiff; rectPage.left = 0; rectPage.top = 0; rectPage.right = rectSheet.right; } AddAnchor(ID_WIZLINE, BOTTOM_LEFT, BOTTOM_RIGHT); if (IsWizard97()) // add header line for wizard97 dialogs AddAnchor(ID_WIZLINEHDR, TOP_LEFT, TOP_RIGHT); // hide tab control GetTabControl()->ShowWindow(SW_HIDE); // pre-calculate margins m_sizePageTL = rectPage.TopLeft() - rectSheet.TopLeft(); m_sizePageBR = rectPage.BottomRight() - rectSheet.BottomRight(); } else { // grow tab to the available sheet space if (cyDiff > 0) rectSheet.bottom = rectPage.bottom + cyDiff; if (GetStyle() & WS_CHILD) GetTabControl()->MoveWindow(&rectSheet); AddAnchor(AFX_IDC_TAB_CONTROL, TOP_LEFT, BOTTOM_RIGHT); } // add a callback for active page (which can change at run-time) m_nCallbackID = AddAnchorCallback(); // prevent flickering GetTabControl()->ModifyStyle(0, WS_CLIPSIBLINGS); }