2

CTabCtrl を含むサイズ変更可能なダイアログがあります。タブ コントロールには 4 つのタブがあり、クリックすると 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;
}

ただし、子コントロールは、表示されている間は常に正しく描画されるとは限りません。コンテンツを混同し、クリックすると正しいコンテンツのみが表示されます(実際のツリーコントロール)。

これは、zorder でウィンドウを描画して移動する最良の方法ですか?何が欠けていますか?

どうもありがとう

BG

4

3 に答える 3

3

子の z オーダーを変更するだけでなく、上の子を除くすべての子を完全に非表示にします。カスタム CTabCtrl で同じアプローチを使用すると、正常に動作します。

于 2010-09-10T13:55:25.663 に答える
1

現在は修正されています - 問題は、tabctrl のサイズ変更コードで、movewindow を使用して子ウィンドウを所定の位置に移動していたという事実から発生しました - これにより、子ウィンドウの zorder が変更されていました。

于 2010-10-24T21:41:19.603 に答える
0

これにより、ウィンドウまたはタブが表示された後に問題が解決する場合があります。使ってみて

this->RedrawWindow();

戻る前に OnTabChanging() 関数で。

于 2010-09-10T13:50:47.510 に答える