win32 CTabctrl: рисование «дочерних» окон на активной вкладке - PullRequest
2 голосов
/ 10 сентября 2010

У меня есть диалоговое окно с изменяемым размером, которое содержит 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;
}

Однако дочерние элементы управления, хотя они и появляются, не всегда рисуются правильно, они как бы смешивают свое содержимое вместе и показывают правильное содержимое только тогда, когда я нажимаю на них (фактические элементы управления дерева).

Это лучший способ рисования и перемещения окон в зордер, чего мне не хватает?

Большое спасибо

BG

Ответы [ 3 ]

3 голосов
/ 10 сентября 2010

Вместо того, чтобы просто изменять z-порядок своих детей, полностью скрывайте каждого ребенка, кроме самого верхнего. Я использую тот же подход в пользовательском CTabCtrl, и он отлично работает.

1 голос
/ 25 октября 2010

Теперь это исправлено - проблема возникла из-за того, что в коде изменения размера для tabctrl я использовал movewindow для перемещения дочерних окон на свои места - это изменило порядок дочерних окон.

0 голосов
/ 10 сентября 2010

Это может решить проблему после появления окна или вкладки. Попробуйте использовать

this-> RedrawWindow ();

В функции OnTabChanging () перед возвратом.

...