我有一个包含CTabCtrl的可调整大小的对话框,标签控件有4个标签,点击它们会显示四个不同的CTreeCtrl之一。
我从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 :(得分:3)
不要只改变孩子的z顺序,而是完全隐藏除了顶级孩子之外的每个孩子。我在自定义CTabCtrl中使用相同的方法,它工作正常。
答案 1 :(得分:1)
现在修复了 - 问题来自于tabctrl的调整大小代码,我使用movewindow将子窗口移动到位 - 这改变了子窗口的zorder。
答案 2 :(得分:0)
这可以解决窗口或标签后的问题。尝试使用
这 - &GT; RedrawWindow();
在OnTabChanging()函数返回之前。