我有一個包含CTabCtrl的可調整大小的對話框,選項卡控件有4個選項卡,當單擊時顯示四個不同的CTreeCtrls中的一個。win32 CTabctrl:在活動選項卡中繪製「子」窗口
我都源自CTabCtrl,一類像這樣保存了它的「孩子」的控制軌跡:
...
class Container: public CTabCtrl {
vector<CWnd*> _children;
....
int Container::AddTab(CWnd* Child) {
CString txt;Child->GetWindowText(txt);
_children.push_back(Child);
int idx = this->InsertItem(this->GetItemCount(), txt, 0);
if(idx == 0) {
CRect c;
this->GetWindowRect(&c);
GetParent()->ScreenToClient(&c);
this->AdjustRect(FALSE, c);
Child->SetWindowPos(&wndTop, c.left, c.top, c.Width(), c.Height(), SWP_SHOWWINDOW);
this->SetCurSel(idx);
} else Child->ShowWindow(SW_HIDE);
return idx;
}
我試圖繪製子控件,像這樣:
void Container::OnTabChanging(NMHDR*, LRESULT* pResult) { // hide the changed from tab
int selected = this->GetCurSel();
if(selected != -1)
{
// move old window to bottom of the zorder and hide
_children[selected]->SetWindowPos(&wndBottom, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE|SWP_HIDEWINDOW);
ASSERT(!_children[selected]->IsWindowVisible());
}
*pResult = 0;
}
// show the child for the tab being changed to
void CNodeContainer::OnTabChanged(NMHDR* pNMHDR, LRESULT* pResult) {
int selected = this->GetCurSel();
ASSERT(selected!=-1);
CRect c;
this->GetWindowRect(&c);
GetParent()->ScreenToClient(&c);
this->AdjustRect(FALSE, c);
_children[selected]->SetWindowPos(&wndTop, c.left, c.top, c.Width(), c.Height(), SWP_SHOWWINDOW|SWP_FRAMECHANGED);
*pResult = 0;
}
然而孩子控制,雖然他們出現,並不總是正確繪製,他們混合他們的內容在一起,只顯示正確的內容,當我點擊它們(實際的樹控制)。
這是在zorder中繪製和移動窗口的最佳方式,我錯過了什麼?
非常感謝
BG
代碼在你的問題幫助我調整CTabCtrl childs正確,謝謝!) – Steed 2013-04-06 15:19:15