Mfc 当只有一页时,从CTabCtrl中删除选项卡栏

Mfc 当只有一页时,从CTabCtrl中删除选项卡栏,mfc,Mfc,我在CDockablePane中创建了一个CTabCtrl,并且只添加了一个页面,因此无需显示选项卡栏。 只有一页时,如何删除选项卡栏? 提前感谢:)您可以隐藏选项卡并使用CTabCtrl::AdjustRect重新定位子页面。例如: void CMyDialog::show_tab_bar(bool show) { tab.ShowWindow(show ? SW_SHOW : SW_HIDE); CRect r; tab.GetWindowRect(&r);

我在
CDockablePane
中创建了一个
CTabCtrl
,并且只添加了一个页面,因此无需显示选项卡栏。 只有一页时,如何删除选项卡栏?
提前感谢:)

您可以隐藏选项卡并使用
CTabCtrl::AdjustRect
重新定位子页面。例如:

void CMyDialog::show_tab_bar(bool show)
{
    tab.ShowWindow(show ? SW_SHOW : SW_HIDE);

    CRect r;
    tab.GetWindowRect(&r);
    ScreenToClient(&r);
    tab.AdjustRect(FALSE, &r);

    page1.SetWindowPos(0, r.left, r.top, r.Width(), r.Height(), SWP_HIDEWINDOW);
    page2.SetWindowPos(0, r.left, r.top, r.Width(), r.Height(), SWP_HIDEWINDOW);
    ...

    page1.ShowWindow(SW_SHOW);
}
或者,如果希望选项卡边框始终可见,可以使用
CTabCtrl::DeleteAllItems

void CMyDialog::show_tab_bar(bool show)
{
    tab.DeleteAllItems();
    if (show)
    {
        tab.InsertItem(0, L"Page 1");
        tab.InsertItem(1, L"Page 2");
        ...
    }

    CRect r;
    tab.GetWindowRect(&r);
    ScreenToClient(&r);
    tab.AdjustRect(FALSE, &r);

    page1.SetWindowPos(0, r.left, r.top, r.Width(), r.Height(), SWP_HIDEWINDOW);
    page2.SetWindowPos(0, r.left, r.top, r.Width(), r.Height(), SWP_HIDEWINDOW);
    ...

    page1.ShowWindow(SW_SHOW);
}

您可以在WinForms中通过捕获
TCM\u ADJUSTRECT
消息来完成此操作。不过,我不能让它在MFC中工作。不知道我做错了什么。我尝试了添加到对话框中的CTabCtrl子类。它从未处理过此消息,除非我手动发送。
TCM\u ADJUSTRECT
在MFC中工作。通常,您需要调用
CTabCtrl::AdjustRect
查找子页面的放置位置,这将生成
TCM\u AdjustRect
消息。我不认为该消息是在WinForm中自动生成的。但是这个解决方案太复杂了,很容易避免调用
CTabCtrl::AdjustRect
谢谢你的回答,但是当我隐藏
CTabCtrl
时,即使我使用
page1.ShowWindow(SW_SHOW)
页面也会隐藏。还有其他建议吗?感谢@Barmak shemirananiaply您创建了页面对话框作为选项卡控件的子项,这一点从一开始就错了。在这种情况下,请使用
tab.DeleteAllItems()
。我已经证明了这是另一种选择。但不要像我那样计算儿童窗户的位置。谢谢@Barmak Shemirani