win32 CTabctrl: рисование "дочерних" окон на активной вкладке
У меня есть диалоговое окно с изменяемым размером, которое содержит CTabCtrl, элемент управления вкладками имеет 4 вкладки, при нажатии на которые отображается один из четырех различных CTreeCtrls.
Я получил класс от 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;
}
Однако дочерние элементы управления, несмотря на то, что они появляются, не всегда рисуются правильно, они как бы смешивают свое содержимое вместе и отображают правильное содержимое только тогда, когда я нажимаю на них (фактические элементы управления дерева).
Это лучший способ рисовать и перемещать окна в Зордер, чего мне не хватает?
Большое спасибо
Б.Г.
3 ответа
Теперь это исправлено - проблема возникла из-за того, что в коде изменения размера для tabctrl я использовал movewindow, чтобы переместить дочерние окна на место - это изменило порядок дочерних окон.
Вместо того, чтобы просто изменять z-порядок своих детей, полностью скрывайте каждого ребенка, кроме верхнего. Я использую тот же подход в пользовательском CTabCtrl, и он отлично работает.
Это может решить проблему после появления окна или вкладки. Попробуй использовать
этом->RedrawWindow();
В функции OnTabChanging() до ее возврата.