// /// Overrides TFrameWindows virtual function. Sets the client window to the /// specified window. Users are responsible for destroying the old client window if /// they want to remove it. // /// Handle SetClientWindow() here to manage fixing up the layout metrics of /// all the children before & after the client is changed. // TWindow* TDecoratedFrame::SetClientWindow(TWindow* clientWnd) { TLayoutMetrics metrics; GetChildLayoutMetrics(*ClientWnd, metrics); if (!clientWnd) clientWnd = new TWindow(this, _T("\007")); // create dummy placeholder clientWnd->SetParent(this); SetChildLayoutMetrics(*clientWnd, metrics); TWindow* oldWnd = GetClientWindow(); // Make sure that all child metrics that were based on the old client window // get updated to the new client // TWindow* first = GetFirstChild(); if (first) { TWindow* child = first; do { if (GetChildLayoutMetrics(*child, metrics)) { if (metrics.X.RelWin == oldWnd) metrics.X.RelWin = clientWnd; if (metrics.Y.RelWin == oldWnd) metrics.Y.RelWin = clientWnd; if (metrics.Width.RelWin == oldWnd) metrics.Width.RelWin = clientWnd; if (metrics.Height.RelWin == oldWnd) metrics.Height.RelWin = clientWnd; SetChildLayoutMetrics(*child, metrics); } child = child->Next(); } while (child != first); } // Now let the TFrameWindow set the client. Then delete the old client if it // was our temporary place holder. Set a flag while the client is being set // so that RemoveChild() below knows that we are taking care of things. // SettingClient = true; oldWnd = TFrameWindow::SetClientWindow(clientWnd); SettingClient = false; if (oldWnd->GetCaption() && oldWnd->GetCaption()[0] == 007) { oldWnd->Destroy(); delete oldWnd; oldWnd = 0; } // Relayout the children to get the new client sized right // Layout(); return oldWnd; }
// /// Applies the specified 'action' function to each TPropertyPage child of the /// sheet. /// \note The logic here traverses the TPropertySheet's ChildList. Therefore /// we will miss any page that does not have an associated TPropertyPage /// inserted in the sheet's ChildList. void TPropertySheet::ForEachPage(TActionPageFunc action, void* paramList) { if (GetLastChild()) { TWindow* curChild; TWindow* nextChild = GetLastChild()->Next(); TPropertyPage* curPage; do { curChild = nextChild; nextChild = nextChild->Next(); curPage = TYPESAFE_DOWNCAST(curChild, TPropertyPage); if (curPage) action(curPage, paramList); } while (curChild != GetLastChild() && GetLastChild() != 0); } }
// /// Applies the specified 'test' function to each 'TPropertyPage' of the sheet and /// returns the first page which causes the 'test' function to return true. Returns /// '0' if no page meets the condition. // TPropertyPage* TPropertySheet::FirstPageThat(TCondPageFunc test, void* paramList) { if (GetLastChild()) { TWindow* curChild; TWindow* nextChild = GetLastChild()->Next(); TPropertyPage* curPage; do { curChild = nextChild; nextChild = nextChild->Next(); curPage = TYPESAFE_DOWNCAST(curChild, TPropertyPage); if (curPage) { if (test(curPage, paramList)) return curPage; } } while (curChild != GetLastChild() && GetLastChild() != 0); } return 0; }
// /// Give the decorations an opportunity to do pre-processing. Don't bother /// checking the client window since it is typically in the focus chain and /// will be given an opportunity to do pre-processing // bool TDecoratedFrame::PreProcessMsg(MSG& msg) { TWindow* firstChild = GetFirstChild(); if (firstChild) { TWindow* child = firstChild; do { if (child != ClientWnd && child->GetHandle() && (child->GetWindowLong(GWL_STYLE) & WS_VISIBLE) && child->PreProcessMsg(msg)) return true; child = child->Next(); } while (child != firstChild); } return TFrameWindow::PreProcessMsg(msg); }