2010-09-10 69 views
2

我有一個包含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

+0

代碼在你的問題幫助我調整CTabCtrl childs正確,謝謝!) – Steed 2013-04-06 15:19:15

回答

1

它現在修復 - 問題來自於在tabctrl調整大小代碼的事實,我使用movewindow移動子窗口到位 - 這是改變子窗口的zorder。

0

後你的窗口或標籤apears這個問題會得到解決。嘗試使用

this-> RedrawWindow();

在OnTabChanging()函數返回之前。

3

而不是隻改變你的孩子的Z順序,完全隱藏除了頂部的每個孩子。我在自定義CTabCtrl中使用相同的方法,它工作正常。