BOOL CMainTabDlg::OnInitDialog() { CRect r; TC_ITEM item; CString strTab; UINT nTabID[3]= {IDS_TAB_MAIN_CONFIGURE,IDS_TAB_MAIN_HISTORY,IDS_TAB_MAIN_PREFERENCES}; CDialog::OnInitDialog(); memset (&item, 0, sizeof (item)); item.mask = TCIF_TEXT|TCIF_IMAGE; item.cchTextMax = 32; item.iImage = -1; CTabCtrl * ptab = (CTabCtrl * )GetDlgItem(IDC_TAB1); ASSERT(ptab); ptab->GetWindowRect (r); ScreenToClient (r); m_dlgPadding.cx = r.left; m_dlgPadding.cy = r.top; CButton* pButton1= (CButton*)GetDlgItem(IDC_BUTTON1); ASSERT (pButton1); pButton1->GetWindowRect (r); ScreenToClient (r); m_buttonPadding.cx = r.right; m_buttonPadding.cy = r.bottom; int nTab = 2; #if defined (OIDSK) nTab = 2; #endif for (int i=0; i<nTab; i++) { strTab.LoadString (nTabID [i]); item.pszText = (LPTSTR)(LPCTSTR)strTab; ptab->InsertItem (i, &item); } if (m_pCurDlg) m_pCurDlg->ShowWindow (SW_HIDE); CTabCtrl* pTab = (CTabCtrl*) GetDlgItem(IDC_TAB1); int nsel = pTab->GetCurSel(); switch (nsel) { case PANE_CONFIG: if (!m_pConfigDlg) { m_pConfigDlg = new CConfigDlg(pTab); m_pConfigDlg->Create(IDD_CONFIG,pTab); } m_pCurDlg= m_pConfigDlg; break; case PANE_HISTORY: if (!m_pHistDlg) { m_pHistDlg = new CHistDlg(pTab); m_pHistDlg->Create(IDD_HISTORY,pTab); } m_pCurDlg= m_pHistDlg; break; case PANE_PREFERENCES: if (!m_pPrefDlg) { m_pPrefDlg = new CPrefDlg(pTab); m_pPrefDlg->Create(IDD_PREFERENCES,pTab); } m_pCurDlg= m_pPrefDlg; break; } if (m_pCurDlg) { CRect r; pTab->GetClientRect (r); pTab->AdjustRect (FALSE, r); m_pCurDlg->MoveWindow(r); m_pCurDlg->ShowWindow(SW_SHOW); } SHOSTINFO CurInfo; VCBFGetHostInfos(&CurInfo); CStatic* pStatic = (CStatic*)GetDlgItem(IDC_STATIC_NAME_INSTALL); pStatic->SetWindowText((LPCTSTR)CurInfo.ii_installation_name); pStatic = (CStatic*)GetDlgItem(IDC_STATIC_INSTALL); pStatic->SetWindowText((LPCTSTR)CurInfo.ii_installation); pStatic = (CStatic*)GetDlgItem(IDC_STATIC_IISYSTEM_NAME); pStatic->SetWindowText((LPCTSTR)CurInfo.ii_system_name); pStatic = (CStatic*)GetDlgItem(IDC_STATIC_II_SYSTEM); pStatic->SetWindowText((LPCTSTR)CurInfo.ii_system); pStatic = (CStatic*)GetDlgItem(IDC_STATIC_HOST); pStatic->SetWindowText((LPCTSTR)CurInfo.host); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }
void CInstrumentEditDlg::InsertPane(CInstrumentEditPanel *pPanel, bool Show) { CRect Rect, ParentRect; CTabCtrl *pTabControl = static_cast<CTabCtrl*>(GetDlgItem(IDC_INST_TAB)); pPanel->SetInstrumentManager(m_pInstManager); // // // pTabControl->GetWindowRect(&ParentRect); pTabControl->InsertItem(m_iPanels, pPanel->GetTitle()); pPanel->Create(pPanel->GetIDD(), this); pPanel->GetWindowRect(&Rect); Rect.MoveToXY(ParentRect.left - Rect.left + DPI::SX(1), ParentRect.top - Rect.top + DPI::SY(21)); Rect.bottom -= DPI::SY(2); Rect.right += DPI::SX(1); pPanel->MoveWindow(Rect); pPanel->ShowWindow(Show ? SW_SHOW : SW_HIDE); if (Show) { pTabControl->SetCurSel(m_iPanels); pPanel->SetFocus(); m_pFocusPanel = pPanel; } m_pPanels[m_iPanels++] = pPanel; }
BOOL OptionsDialog::OnInitDialog() { CPropertySheet::OnInitDialog(); // Enable context sensitive help ModifyStyleEx(0,WS_EX_CONTEXTHELP); // Create the font to use m_font.CreateFontIndirect(&m_logFont); // Set the font for the property pages ChangeDialogFont(this,&m_font); CPropertyPage* page = GetActivePage(); for (int i = 0; i < GetPageCount(); i++) { SetActivePage(i); CPropertyPage* page = GetActivePage(); ChangeDialogFont(page,&m_font); } SetActivePage(page); // Resize the property page CTabCtrl* tab = GetTabControl(); tab->GetWindowRect(&m_page); ScreenToClient(&m_page); tab->AdjustRect(FALSE,&m_page); page->MoveWindow(&m_page); return TRUE; }
void CViewStatistics::SizePropSheet(CWnd* pParent, CPropertySheet* pPSheet, CRect rcNewPos) { ASSERT_VALID( pParent ); ASSERT_VALID( pPSheet ); CTabCtrl* pTabCtrl = pPSheet->GetTabControl(); ASSERT(pTabCtrl != NULL); CRect rcTabCtrl; pTabCtrl->GetWindowRect(&rcTabCtrl); pParent->ScreenToClient(&rcTabCtrl); CRect rcPSheet; pPSheet->GetWindowRect(&rcPSheet); pParent->ScreenToClient(&rcPSheet); int dcx = rcPSheet.Width() - rcTabCtrl.Width(); int dcy = rcPSheet.Height() - rcTabCtrl.Height(); pPSheet->MoveWindow(rcNewPos.left, rcNewPos.top, rcNewPos.Width(), rcNewPos.Height()); pTabCtrl->SetWindowPos(NULL, 0, 0, rcNewPos.Width() - dcx, rcNewPos.Height() - dcy, SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE); int nCurrentPage = pPSheet->GetActiveIndex(); //for(int i = 0; i < pPSheet->GetPageCount(); ++i) // pPSheet->SetActivePage(i); pPSheet->SetActivePage(nCurrentPage); }
BOOL CCustomPropSheet::OnInitDialog(void) { __super::OnInitDialog(); // get the font for the first active page CPropertyPage* pCurPage = GetActivePage(); ASSERT(pCurPage != NULL); // change the font for the sheet ChangeDialogFont(this, &m_fontPage, CDF_CENTER); // change the font for each page for (int i = 0, cPages = GetPageCount(); i < cPages; ++i) { CPropertyPage* pPage = GetPage(i); ASSERT(pPage != NULL); #if !defined(_BUGFIX_) ChangeDialogFont(pPage, &m_fontPage, CDF_CENTER); #else ChangeDialogFont(pPage, &m_fontPage, CDF_TOPLEFT); #endif // _BUGFIX_ } // set and save the size of the page CTabCtrl* pTab = GetTabControl(); ASSERT(pTab != NULL); if ((m_psh.dwFlags & PSH_WIZARD) != 0) { pTab->ShowWindow(SW_HIDE); #if !defined(_BUGFIX_) GetClientRect(&m_rcPage); CWnd* pButton = GetDlgItem(ID_WIZBACK); ASSERT(pButton != NULL); CRect rectButton; pButton->GetWindowRect(rectButton); ScreenToClient(rectButton); m_rcPage.bottom = rectButton.top - 2; #else CRect rectDivider; CWnd* pDivider = GetDlgItem(0x3026); ASSERT(pDivider != NULL); pDivider->GetWindowRect(rectDivider); ScreenToClient(rectDivider); m_rcPage.bottom = rectDivider.top - 2; #endif // _BUGFIX_ } else { pTab->GetWindowRect(&m_rcPage); ScreenToClient(&m_rcPage); pTab->AdjustRect(FALSE, &m_rcPage); } // resize the page pCurPage->MoveWindow(&m_rcPage); return (TRUE); }
BOOL CResizableSheet::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(m_hWnd, 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 // 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; }
BOOL CMyPropertySheet::OnInitDialog() { BOOL bResult = CPropertySheet::OnInitDialog(); //计算属性页的矩形,扩大属性表并将属性页其移至右侧 CRect rect, rectPage, rectTab; GetPage(0)->GetWindowRect(&rectPage); GetWindowRect(&rect); rect.right += 150; int nWidth = rectPage.Width(); rectPage.right = rect.right - 20; rectPage.left = rect.right - nWidth; ScreenToClient(&rectPage); m_rectPage = rectPage; MoveWindow(&rect); GetPage(0)->MoveWindow(&rectPage); //隐藏属性页原来的TabControl CTabCtrl *pTab = GetTabControl() ; pTab->GetWindowRect(&rectTab); ScreenToClient(&rectTab); if(!pTab->ShowWindow(SW_HIDE)) return FALSE; //创建列表控件并用一个CImageList对象与之关联 if(!m_wndList.Create(WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_NOCOLUMNHEADER , CRect(10 ,rectTab.top,150,rectPage.bottom ),this,0xFFFF)) return FALSE; m_wndList.SetExtendedStyle(LVS_EX_FULLROWSELECT); m_wndList.SetImageList(&m_imgList, LVSIL_SMALL); InitList(); //这一步是为了扩大行高度 CFont font; font.CreatePointFont(240,_T("宋体")); m_wndList.SetFont(&font); CString strCaption; GetPage(0)->GetWindowText(strCaption); _tcscpy(m_szCaption, strCaption.GetBuffer(strCaption.GetLength())); return bResult; }
//-----------------------------------------------------------------------------/ void CQTabbedDialog::MoveDlgSheet(CPropertySheet* pSheet, CRect rcNewPos) { TRACE("CQTabbedDialog::MoveDlgSheet(1)\n"); ASSERT_VALID(pSheet); // 0 - get the currently active page and set redraw to false. This // will keep the dialog box from flashing when it's resized int nCurrentPage = pSheet->GetActiveIndex(); pSheet->SetRedraw(FALSE); // 1 - Get current coordinates of tab control // and property sheet window CTabCtrl* pTabCtrl = pSheet->GetTabControl(); ASSERT(pTabCtrl != NULL); CRect rcTabCtrl; pTabCtrl->GetWindowRect(&rcTabCtrl); ScreenToClient(&rcTabCtrl); CRect rcPSheet; pSheet->GetWindowRect(&rcPSheet); ScreenToClient(&rcPSheet); // 2 - Calculate margin between property sheet // and tab control int dcx = rcPSheet.Width() - rcTabCtrl.Width(); int dcy = rcPSheet.Height() - rcTabCtrl.Height(); // 3 - Move and resize property sheet window // (also moves the tab window because it is a child // of the property sheet window) pSheet->MoveWindow(rcNewPos.left, rcNewPos.top, rcNewPos.Width(), rcNewPos.Height()); // 4 - Resize tab control window to restore // right / bottom margins pTabCtrl->SetWindowPos(NULL, 0, 0, rcNewPos.Width() - dcx, rcNewPos.Height() - dcy, SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE ); // 5 - turn the drawing back on now, and invalidate the whole dialog pSheet->SetRedraw(TRUE); Invalidate(); // now reset the active page pSheet->SetActivePage(nCurrentPage); }
BOOL CResizableSheetEx::CalcSizeExtra(HWND /*hWndChild*/, CSize sizeChild, CSize &sizeExtra) { CTabCtrl* pTab = GetTabControl(); if (!pTab) return FALSE; // get margins of tabcontrol CRect rectMargins; if (!GetAnchorMargins(pTab->m_hWnd, sizeChild, rectMargins)) return FALSE; // get margin caused by tabcontrol CRect rectTabMargins(0,0,0,0); // 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(TRUE, &rectTabMargins); pTab->MoveWindow(rectSave, FALSE); pTab->SetRedraw(TRUE); // add non-client size ::AdjustWindowRectEx(&rectTabMargins, GetStyle(), !(GetStyle() & WS_CHILD) && ::IsMenu(GetMenu()->GetSafeHmenu()), GetExStyle()); // compute extra size sizeExtra = rectMargins.TopLeft() + rectMargins.BottomRight() + rectTabMargins.Size(); return TRUE; }
BOOL CResizableSheet::ArrangeLayoutCallback(LayoutInfo &layout) { if (layout.nCallbackID != 1) // we only added 1 callback return CResizableLayout::ArrangeLayoutCallback(layout); // set layout info for active page layout.hWnd = GetActivePage()->GetSafeHwnd(); // set margins if (IsWizard()) // wizard mode { // use pre-calculated margins layout.sizeMarginTL = m_sizePageTL; layout.sizeMarginBR = m_sizePageBR; } else // tab mode { CRect rectPage, rectSheet; GetTotalClientRect(&rectSheet); CTabCtrl* pTab = GetTabControl(); pTab->GetWindowRect(&rectPage); pTab->AdjustRect(FALSE, &rectPage); ScreenToClient(&rectPage); // use tab control layout.sizeMarginTL = rectPage.TopLeft() - rectSheet.TopLeft(); layout.sizeMarginBR = rectPage.BottomRight() - rectSheet.BottomRight(); } // set anchor types layout.sizeTypeTL = TOP_LEFT; layout.sizeTypeBR = BOTTOM_RIGHT; // use this layout info return TRUE; }
void CXTPColorDialog::CalculateRects() { CRect rcBtnOK; CRect rcBtnCancel; CRect rcTabCtrl; CRect rcItem; // get the tab control size. CTabCtrl* pTabCtrl = GetTabControl(); pTabCtrl->GetWindowRect(&rcTabCtrl); ScreenToClient(&rcTabCtrl); // get the size of the first tab item. pTabCtrl->GetItemRect(0, &rcItem); // get the OK button size. CButton* pBtnOK = (CButton*)GetDlgItem(IDOK); pBtnOK->GetWindowRect(&rcBtnOK); ScreenToClient(&rcBtnOK); // get the Cancel button size. CButton* pBtnCancel = (CButton*)GetDlgItem(IDCANCEL); pBtnCancel->GetWindowRect(&rcBtnCancel); ScreenToClient(&rcBtnCancel); rcBtnCancel.OffsetRect(-15, 0); // resize the tab control rcTabCtrl.right = rcBtnCancel.left - 5; rcTabCtrl.bottom = rcBtnCancel.top - 15; pTabCtrl->MoveWindow(&rcTabCtrl); // reposition the OK button. rcBtnOK = rcBtnCancel; rcBtnOK.top = rcTabCtrl.top + rcItem.Height() + 1; rcBtnOK.bottom = rcBtnOK.top + rcBtnCancel.Height(); pBtnOK->MoveWindow(&rcBtnOK); // reposition the Cancel button. rcBtnCancel = rcBtnOK; rcBtnCancel.top = rcBtnOK.bottom + 5; rcBtnCancel.bottom = rcBtnCancel.top + rcBtnOK.Height(); pBtnCancel->MoveWindow(&rcBtnCancel); // reposition the hex display if (::IsWindow(m_wndHexEdit.m_hWnd)) { CRect rcWnd; rcWnd = rcBtnCancel; rcWnd.top = rcBtnCancel.bottom + 5; rcWnd.bottom = rcWnd.top + 18; m_wndHexEdit.MoveWindow(&rcWnd); } // reposition the eye dropper. if (::IsWindow(m_wndEyeDropper.m_hWnd)) { CRect rcWnd; m_wndEyeDropper.GetWindowRect(&rcWnd); CSize size = rcWnd.Size(); rcWnd.right = rcBtnOK.right; rcWnd.left = rcBtnOK.right - size.cx; rcWnd.bottom = rcTabCtrl.bottom; rcWnd.top = rcTabCtrl.bottom - size.cy; m_wndEyeDropper.MoveWindow(&rcWnd); } // resize the property sheet. CXTPWindowRect rcWindow(this); ClientToScreen(&rcTabCtrl); rcWindow.bottom = rcTabCtrl.bottom + 10; rcWindow.right -= 15; MoveWindow(&rcWindow); }
BOOL CTreePropSheet::OnInitDialog() { if (m_bTreeViewMode) { // be sure, there are no stacked tabs, because otherwise the // page caption will be to large in tree view mode EnableStackedTabs(FALSE); // Initialize image list. if (m_DefaultImages.GetSafeHandle()) { IMAGEINFO ii; m_DefaultImages.GetImageInfo(0, &ii); if (ii.hbmImage) DeleteObject(ii.hbmImage); if (ii.hbmMask) DeleteObject(ii.hbmMask); m_Images.Create(ii.rcImage.right-ii.rcImage.left, ii.rcImage.bottom-ii.rcImage.top, ILC_COLOR32|ILC_MASK, 0, 1); } else m_Images.Create(16, 16, ILC_COLOR32|ILC_MASK, 0, 1); } // perform default implementation BOOL bResult = CPropertySheet::OnInitDialog(); if (!m_bTreeViewMode) // stop here, if we would like to use tabs return bResult; // Get tab control... CTabCtrl *pTab = GetTabControl(); if (!IsWindow(pTab->GetSafeHwnd())) { ASSERT(FALSE); return bResult; } // ... and hide it pTab->ShowWindow(SW_HIDE); pTab->EnableWindow(FALSE); // Place another (empty) tab ctrl, to get a frame instead CRect rectFrame; pTab->GetWindowRect(rectFrame); ScreenToClient(rectFrame); m_pFrame = CreatePageFrame(); if (!m_pFrame) { ASSERT(FALSE); AfxThrowMemoryException(); } m_pFrame->Create(WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS, rectFrame, this, 0xFFFF); m_pFrame->ShowCaption(m_bPageCaption); // Lets make place for the tree ctrl const int nTreeWidth = m_nPageTreeWidth; const int nTreeSpace = 5; CRect rectSheet; GetWindowRect(rectSheet); rectSheet.right+= nTreeWidth; SetWindowPos(NULL, -1, -1, rectSheet.Width(), rectSheet.Height(), SWP_NOZORDER|SWP_NOMOVE); CenterWindow(); MoveChildWindows(nTreeWidth, 0); // Lets calculate the rectangle for the tree ctrl CRect rectTree(rectFrame); rectTree.right = rectTree.left + nTreeWidth - nTreeSpace; // calculate caption height CTabCtrl wndTabCtrl; wndTabCtrl.Create(WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS, rectFrame, this, 0x1234); wndTabCtrl.InsertItem(0, _T("")); CRect rectFrameCaption; wndTabCtrl.GetItemRect(0, rectFrameCaption); wndTabCtrl.DestroyWindow(); m_pFrame->SetCaptionHeight(rectFrameCaption.Height()); // if no caption should be displayed, make the window smaller in // height if (!m_bPageCaption) { // make frame smaller m_pFrame->GetWnd()->GetWindowRect(rectFrame); ScreenToClient(rectFrame); rectFrame.top+= rectFrameCaption.Height(); m_pFrame->GetWnd()->MoveWindow(rectFrame); // move all child windows up MoveChildWindows(0, -rectFrameCaption.Height()); // modify rectangle for the tree ctrl rectTree.bottom-= rectFrameCaption.Height(); // make us smaller CRect rect; GetWindowRect(rect); rect.top+= rectFrameCaption.Height()/2; rect.bottom-= rectFrameCaption.Height()-rectFrameCaption.Height()/2; if (GetParent()) GetParent()->ScreenToClient(rect); MoveWindow(rect); } // finally create tht tree control const DWORD dwTreeStyle = TVS_SHOWSELALWAYS|TVS_TRACKSELECT|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS; m_pwndPageTree = CreatePageTreeObject(); if (!m_pwndPageTree) { ASSERT(FALSE); AfxThrowMemoryException(); } ((CWnd*)m_pwndPageTree)->CreateEx( WS_EX_CLIENTEDGE|WS_EX_NOPARENTNOTIFY, _T("SysTreeView32"), _T("PageTree"), WS_TABSTOP|WS_CHILD|WS_VISIBLE|dwTreeStyle, rectTree, this, s_unPageTreeId); //// MFC7-support here (Thanks to Rainer Wollgarten) //#if _MFC_VER >= 0x0700 //{ // m_pwndPageTree->CreateEx( // WS_EX_CLIENTEDGE|WS_EX_NOPARENTNOTIFY, // WS_TABSTOP|WS_CHILD|WS_VISIBLE|dwTreeStyle, // rectTree, this, s_unPageTreeId); //} //#else //{ // m_pwndPageTree->CreateEx( // WS_EX_CLIENTEDGE|WS_EX_NOPARENTNOTIFY, // _T("SysTreeView32"), _T("PageTree"), // WS_TABSTOP|WS_CHILD|WS_VISIBLE|dwTreeStyle, // rectTree, this, s_unPageTreeId); //} //#endif if (m_bTreeImages) { m_pwndPageTree->SetImageList(&m_Images, TVSIL_NORMAL); m_pwndPageTree->SetImageList(&m_Images, TVSIL_STATE); } // Fill the tree ctrl RefillPageTree(); // Select item for the current page if (pTab->GetCurSel() > -1) SelectPageTreeItem(pTab->GetCurSel()); // Expand all tree items HTREEITEM hCurrent = m_pwndPageTree->GetNextItem(NULL, TVGN_FIRSTVISIBLE); while (hCurrent != NULL) { m_pwndPageTree->Expand(hCurrent, TVE_EXPAND); hCurrent = m_pwndPageTree->GetNextItem(hCurrent, TVGN_NEXT); } return bResult; }
BOOL CTreePropSheet::OnInitDialog() { if (m_bTreeViewMode) { // be sure, there are no stacked tabs, because otherwise the // page caption will be to large in tree view mode EnableStackedTabs(FALSE); // Initialize image list. if (m_DefaultImages.GetSafeHandle()) { IMAGEINFO ii; m_DefaultImages.GetImageInfo(0, &ii); m_Images.Create(ii.rcImage.right - ii.rcImage.left, ii.rcImage.bottom - ii.rcImage.top, ILC_COLOR32 | ILC_MASK, 0, 1); } else m_Images.Create(16, 16, ILC_COLOR32 | ILC_MASK, 0, 1); } // perform default implementation BOOL bResult = CPropertySheet::OnInitDialog(); if (!m_bTreeViewMode) // stop here, if we would like to use tabs return bResult; // Get tab control... CTabCtrl* pTab = GetTabControl(); if (!IsWindow(pTab->GetSafeHwnd())) { ASSERT(FALSE); return bResult; } HighColorTab::UpdateImageList(*this); // ... and hide it pTab->ShowWindow(SW_HIDE); pTab->EnableWindow(FALSE); // Place another (empty) tab ctrl, to get a frame instead CRect rectFrame; pTab->GetWindowRect(rectFrame); ScreenToClient(rectFrame); m_pFrame = CreatePageFrame(); if (!m_pFrame) { ASSERT(FALSE); AfxThrowMemoryException(); } m_pFrame->Create(WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS, rectFrame, this, 0xFFFF); m_pFrame->ShowCaption(m_bPageCaption); // Lets make place for the tree ctrl const int nTreeWidth = m_nPageTreeWidth; const int nTreeSpace = 5; CRect rectSheet; GetWindowRect(rectSheet); rectSheet.right += nTreeWidth; SetWindowPos(NULL, 0, 0, rectSheet.Width(), rectSheet.Height(), SWP_NOZORDER | SWP_NOMOVE); CenterWindow(); MoveChildWindows(nTreeWidth, 0); // Lets calculate the rectangle for the tree ctrl CRect rectTree(rectFrame); rectTree.right = rectTree.left + nTreeWidth - nTreeSpace; // calculate caption height CTabCtrl wndTabCtrl; wndTabCtrl.Create(WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS, rectFrame, this, 0x1234); wndTabCtrl.InsertItem(0, _T("")); CRect rectFrameCaption; wndTabCtrl.GetItemRect(0, rectFrameCaption); wndTabCtrl.DestroyWindow(); m_pFrame->SetCaptionHeight(rectFrameCaption.Height()); // if no caption should be displayed, make the window smaller in // height if (!m_bPageCaption) { // make frame smaller m_pFrame->GetWnd()->GetWindowRect(rectFrame); ScreenToClient(rectFrame); rectFrame.top+= rectFrameCaption.Height(); m_pFrame->GetWnd()->MoveWindow(rectFrame); // move all child windows up MoveChildWindows(0, -rectFrameCaption.Height()); // modify rectangle for the tree ctrl rectTree.bottom-= rectFrameCaption.Height(); // make us smaller CRect rect; GetWindowRect(rect); rect.top+= rectFrameCaption.Height()/2; rect.bottom-= rectFrameCaption.Height()-rectFrameCaption.Height()/2; if (GetParent()) GetParent()->ScreenToClient(rect); MoveWindow(rect); // Need to center window again to reflect the missing caption bar (noticeable on 640x480 resolutions) CenterWindow(); } // finally create the tree control //const DWORD dwTreeStyle = TVS_SHOWSELALWAYS/*|TVS_TRACKSELECT*/|TVS_HASLINES/*|TVS_LINESATROOT*/|TVS_HASBUTTONS; // As long as we don't use sub pages we apply the 'TVS_FULLROWSELECT' style for a little more user convinience. const DWORD dwTreeStyle = TVS_SHOWSELALWAYS | TVS_FULLROWSELECT | TVS_NOHSCROLL; m_pwndPageTree = CreatePageTreeObject(); if (!m_pwndPageTree) { ASSERT(FALSE); AfxThrowMemoryException(); } // MFC7-support here (Thanks to Rainer Wollgarten) #if _MFC_VER >= 0x0700 { // Using 'CTreeCtrl::CreateEx' (and it's indeed a good idea to call this one), results in // flawed window styles (border is missing) when running under WinXP themed.. ??? //m_pwndPageTree->CreateEx( // WS_EX_CLIENTEDGE|WS_EX_NOPARENTNOTIFY, // WS_TABSTOP|WS_CHILD|WS_VISIBLE|dwTreeStyle, // rectTree, this, s_unPageTreeId); // Feel free to explain to me why we need to call CWnd::CreateEx to get the proper window style // for the tree view control when running under WinXP. Look at CTreeCtrl::CreateEx and CWnd::CreateEx to // see the (minor) difference. However, this could create problems in future MFC versions.. m_pwndPageTree->CWnd::CreateEx( WS_EX_CLIENTEDGE|WS_EX_NOPARENTNOTIFY, WC_TREEVIEW, _T("PageTree"), WS_TABSTOP|WS_CHILD|WS_VISIBLE|dwTreeStyle, rectTree, this, s_unPageTreeId); } #else { m_pwndPageTree->CreateEx( WS_EX_CLIENTEDGE|WS_EX_NOPARENTNOTIFY, _T("SysTreeView32"), _T("PageTree"), WS_TABSTOP|WS_CHILD|WS_VISIBLE|dwTreeStyle, rectTree, this, s_unPageTreeId); } #endif // This treeview control was created dynamically, thus it does not derive the font // settings from the parent dialog. Need to set the font explicitly so that it fits // to the font which is used for the property pages. m_pwndPageTree->SendMessage(WM_SETFONT, (WPARAM)AfxGetMainWnd()->GetFont()->m_hObject, TRUE); m_pwndPageTree->SetItemHeight(m_pwndPageTree->GetItemHeight() + 6); if (m_bTreeImages) { m_pwndPageTree->SetImageList(&m_Images, TVSIL_NORMAL); m_pwndPageTree->SetImageList(&m_Images, TVSIL_STATE); } // Fill the tree ctrl RefillPageTree(); // Select item for the current page if (pTab->GetCurSel() > -1) SelectPageTreeItem(pTab->GetCurSel()); return bResult; }
//**************************************************************************************** BOOL CBCGPropertySheet::OnInitDialog() { BOOL bResult = CPropertySheet::OnInitDialog(); BOOL bReposButtons = FALSE; const int nVertMargin = 5; const int nHorzMargin = 5; CWnd* pWndNavigator = InitNavigationControl (); CRect rectClient; GetClientRect (rectClient); if (m_wndTab.GetSafeHwnd () != NULL) { CTabCtrl* pTab = GetTabControl (); ASSERT_VALID (pTab); CRect rectTab; pTab->GetWindowRect (rectTab); ScreenToClient (rectTab); rectTab.InflateRect (2, 0); if (pTab->GetItemCount () > 0) { CRect rectTabsNew; m_wndTab.GetTabsRect (rectTabsNew); CRect rectTabsOld; pTab->GetItemRect (0, rectTabsOld); const int nOldHeight = rectTabsOld.Height (); const int nNewHeight = rectTabsNew.Height (); if (nNewHeight > nOldHeight) { rectClient.bottom += nNewHeight - nOldHeight + nVertMargin; rectTab.bottom += nNewHeight - nOldHeight; SetWindowPos (NULL, -1, -1, rectClient.Width (), rectClient.Height (), SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE); } } m_wndTab.MoveWindow (rectTab); pTab->ModifyStyle (WS_TABSTOP, 0); pTab->ShowWindow (SW_HIDE); if (pTab->GetItemCount () > 0) { m_wndTab.SetActiveTab (0); } bReposButtons = TRUE; } else if (pWndNavigator != NULL) { CTabCtrl* pTab = GetTabControl (); ASSERT_VALID (pTab); pTab->ModifyStyle (WS_TABSTOP, 0); CRect rectTabItem; pTab->GetItemRect (0, rectTabItem); pTab->MapWindowPoints (this, &rectTabItem); const int nTabsHeight = rectTabItem.Height () + nVertMargin; SetWindowPos (NULL, -1, -1, rectClient.Width () + m_nBarWidth, rectClient.Height () - nTabsHeight + 4 * nVertMargin, SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE); GetClientRect (rectClient); pTab->MoveWindow (m_nBarWidth, -nTabsHeight, rectClient.right, rectClient.bottom - 2 * nVertMargin); CRect rectTab; pTab->GetWindowRect (rectTab); ScreenToClient (rectTab); CRect rectNavigator = rectClient; rectNavigator.right = rectNavigator.left + m_nBarWidth; rectNavigator.bottom = rectTab.bottom; rectNavigator.DeflateRect (1, 1); pWndNavigator->SetWindowPos (&wndTop, rectNavigator.left, rectNavigator.top, rectNavigator.Width (), rectNavigator.Height (), SWP_NOACTIVATE); SetActivePage (GetActivePage ()); bReposButtons = TRUE; } if (bReposButtons) { int ids[] = { IDOK, IDCANCEL, ID_APPLY_NOW, IDHELP }; int nTotalButtonsWidth = 0; for (int iStep = 0; iStep < 2; iStep++) { for (int i = 0; i < sizeof (ids) / sizeof (ids [0]); i++) { CWnd* pButton = GetDlgItem (ids[i]); if (pButton != NULL) { if (ids [i] == IDHELP && (m_psh.dwFlags & PSH_HASHELP) == 0) { continue; } if (ids [i] == ID_APPLY_NOW && (m_psh.dwFlags & PSH_NOAPPLYNOW)) { continue; } CRect rectButton; pButton->GetWindowRect (rectButton); ScreenToClient (rectButton); if (iStep == 0) { // Align buttons at the bottom pButton->SetWindowPos (&wndTop, rectButton.left, rectClient.bottom - rectButton.Height () - nVertMargin, -1, -1, SWP_NOSIZE | SWP_NOACTIVATE); nTotalButtonsWidth = rectButton.right; } else { // Right align the buttons pButton->SetWindowPos (&wndTop, rectButton.left + rectClient.right - nTotalButtonsWidth - nHorzMargin, rectButton.top, -1, -1, SWP_NOSIZE | SWP_NOACTIVATE); } } } } } return bResult; }
void CComPropertySheet::OnActivated(CPropertyPage* pPage) { if(!pPage) return; CRect bounds(30000,30000,-30000,-30000); CRect wr, cr; GetWindowRect(wr); GetClientRect(cr); CSize ws = wr.Size(), cs = cr.Size(); CRect twr, tcr; CTabCtrl* pTC = (CTabCtrl*)GetDlgItem(AFX_IDC_TAB_CONTROL); pTC->GetWindowRect(twr); pTC->GetClientRect(tcr); CSize tws = twr.Size(), tcs = tcr.Size(); if(CWnd* pChild = pPage->GetWindow(GW_CHILD)) { pChild->ModifyStyle(WS_CAPTION|WS_THICKFRAME, 0); pChild->ModifyStyleEx(WS_EX_DLGMODALFRAME, WS_EX_CONTROLPARENT); for(CWnd* pGrandChild = pChild->GetWindow(GW_CHILD); pGrandChild; pGrandChild = pGrandChild->GetNextWindow()) { if(!(pGrandChild->GetStyle()&WS_VISIBLE)) continue; CRect r; pGrandChild->GetWindowRect(&r); pChild->ScreenToClient(r); bounds |= r; } } bounds |= CRect(0,0,0,0); bounds.SetRect(0, 0, bounds.right + max(bounds.left, 4), bounds.bottom + max(bounds.top, 4)); CRect r = CRect(CPoint(0,0), bounds.Size()); pTC->AdjustRect(TRUE, r); r.SetRect(twr.TopLeft(), twr.TopLeft() + r.Size()); ScreenToClient(r); pTC->MoveWindow(r); pTC->ModifyStyle(TCS_MULTILINE, TCS_SINGLELINE); CSize diff = r.Size() - tws; if(!bounds.IsRectEmpty()) { if(CWnd* pChild = pPage->GetWindow(GW_CHILD)) pChild->MoveWindow(bounds); CRect r = twr; pTC->AdjustRect(FALSE, r); ScreenToClient(r); pPage->MoveWindow(CRect(r.TopLeft(), bounds.Size())); } int _afxPropSheetButtons[] = { IDOK, IDCANCEL, ID_APPLY_NOW, IDHELP }; for(int i = 0; i < countof(_afxPropSheetButtons); i++) { if(CWnd* pWnd = GetDlgItem(_afxPropSheetButtons[i])) { pWnd->GetWindowRect(r); ScreenToClient(r); pWnd->MoveWindow(CRect(r.TopLeft() + diff, r.Size())); } } MoveWindow(CRect(wr.TopLeft(), ws + diff)); Invalidate(); }
BOOL CTreePropSheetBase::OnInitDialog() { if (m_bTreeViewMode && !IsWizardMode() ) { // Fix suggested by Przemek Miszczuk // http://www.codeproject.com/property/TreePropSheetEx.asp?msg=1024928#xx1024928xx TreePropSheet::CIncrementScope RefillingPageTreeContentGuard(m_nRefillingPageTreeContent ); // be sure, there are no stacked tabs, because otherwise the // page caption will be to large in tree view mode EnableStackedTabs(FALSE); // Initialize image list. if (m_DefaultImages.GetSafeHandle()) { IMAGEINFO ii; m_DefaultImages.GetImageInfo(0, &ii); if (ii.hbmImage) DeleteObject(ii.hbmImage); if (ii.hbmMask) DeleteObject(ii.hbmMask); m_Images.Create(ii.rcImage.right-ii.rcImage.left, ii.rcImage.bottom-ii.rcImage.top, ILC_COLOR32|ILC_MASK, 0, 1); } else m_Images.Create(16, 16, ILC_COLOR32|ILC_MASK, 0, 1); } // perform default implementation BOOL bResult = CPropertySheet::OnInitDialog(); // If in wizard mode, stop here. if( IsWizardMode() ) return bResult; // Get tab control... CTabCtrl *pTab = GetTabControl(); if (!IsWindow(pTab->GetSafeHwnd())) { ASSERT(FALSE); return bResult; } // HighColorTab::UpdateImageList to change the internal image list to 24 bits colors) HighColorTab::UpdateImageList( *this ); // If not in tree mode, stop here. if (!m_bTreeViewMode) // stop here, if we would like to use tabs return bResult; // ... and hide it pTab->ShowWindow(SW_HIDE); pTab->EnableWindow(FALSE); // Place another (empty) tab ctrl, to get a frame instead CRect rectFrame; pTab->GetWindowRect(rectFrame); ScreenToClient(rectFrame); m_pFrame = CreatePageFrame(); if (!m_pFrame) { ASSERT(FALSE); AfxThrowMemoryException(); } m_pFrame->Create(WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS, rectFrame, this, 0xFFFF); m_pFrame->ShowCaption(m_bPageCaption); // Lets make place for the tree ctrl const int nTreeWidth = m_nPageTreeWidth; CRect rectSheet; GetWindowRect(rectSheet); rectSheet.right+= nTreeWidth; SetWindowPos(NULL, -1, -1, rectSheet.Width(), rectSheet.Height(), SWP_NOZORDER|SWP_NOMOVE); CenterWindow(); MoveChildWindows(nTreeWidth, 0); // Lets calculate the rectangle for the tree ctrl CRect rectTree(rectFrame); rectTree.right = rectTree.left + nTreeWidth - m_nSeparatorWidth; // calculate caption height CTabCtrl wndTabCtrl; wndTabCtrl.Create(WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS, rectFrame, this, 0x1234); wndTabCtrl.InsertItem(0, _T("")); CRect rectFrameCaption; wndTabCtrl.GetItemRect(0, rectFrameCaption); wndTabCtrl.DestroyWindow(); m_pFrame->SetCaptionHeight(rectFrameCaption.Height()); // if no caption should be displayed, make the window smaller in // height if (!m_bPageCaption) { // make frame smaller m_pFrame->GetWnd()->GetWindowRect(rectFrame); ScreenToClient(rectFrame); rectFrame.top+= rectFrameCaption.Height(); m_pFrame->GetWnd()->MoveWindow(rectFrame); // move all child windows up MoveChildWindows(0, -rectFrameCaption.Height()); // modify rectangle for the tree ctrl rectTree.bottom-= rectFrameCaption.Height(); // make us smaller CRect rect; GetWindowRect(rect); rect.top+= rectFrameCaption.Height()/2; rect.bottom-= rectFrameCaption.Height()-rectFrameCaption.Height()/2; if (GetParent()) GetParent()->ScreenToClient(rect); MoveWindow(rect); CenterWindow(); } // finally create the tree control const DWORD dwTreeStyle = TVS_SHOWSELALWAYS|TVS_TRACKSELECT|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS; m_pwndPageTree = CreatePageTreeObject(); if (!m_pwndPageTree) { ASSERT(FALSE); AfxThrowMemoryException(); } // MFC7-support here (Thanks to Rainer Wollgarten) // YT: Cast tree control to CWnd and calls CWnd::CreateEx in all cases (VC 6 and7). ((CWnd*)m_pwndPageTree)->CreateEx( WS_EX_CLIENTEDGE|WS_EX_NOPARENTNOTIFY, _T("SysTreeView32"), _T("PageTree"), WS_TABSTOP|WS_CHILD|WS_VISIBLE|dwTreeStyle, rectTree, this, s_unPageTreeId); if (m_bTreeImages) { m_pwndPageTree->SetImageList(&m_Images, TVSIL_NORMAL); m_pwndPageTree->SetImageList(&m_Images, TVSIL_STATE); } // TreePropSheetEx: Fix refresh problem. // Fill the tree ctrl { TreePropSheet::CWindowRedrawScope WindowRedrawScope( m_pwndPageTree, true ); // Populate the tree control. RefillPageTree(); // Expand the tree if necessary. if( IsAutoExpandTree() ) { ExpandTreeItem( m_pwndPageTree, m_pwndPageTree->GetRootItem(), TVE_EXPAND ); } // Select item for the current page if (pTab->GetCurSel() > -1) SelectPageTreeItem(pTab->GetCurSel()); } return bResult; }