2016-05-30 110 views
0

我在CDockablePane内创建了一个CTabCtrl,并且我只添加了一个页面,则不需要显示标签栏。 当只有一个页面时,我该如何删除标签栏? 在此先感谢:)当只有一个页面时,从CTabCtrl中删除标签栏

+0

您可以在WinForms中通过捕获'TCM_ADJUSTRECT'消息[像这样](http://stackoverflow.com/a/4409941/366904)执行此操作。不过,我无法在MFC中使用它。不知道我做错了什么。我尝试了一个已经添加到对话框中的CTabCtrl的子类。它从来没有处理过这个消息,除非我手动发送它。 –

+0

'TCM_ADJUSTRECT'在MFC中可以正常工作。通常情况下,您需要调用'CTabCtrl :: AdjustRect'来找出放置子页面的位置,这会生成'TCM_ADJUSTRECT'消息。我不认为这个消息是在WinForm中自动生成的。但是这个解决方案太复杂了,更容易避免调用'CTabCtrl :: AdjustRect' –

回答

1

您可以隐藏选项卡并使用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); 
} 
+0

感谢您的回答, 但是当我隐藏'CTabCtrl'时,即使使用'page1.ShowWindow(SW_SHOW)'也隐藏页面。 还有其他建议吗? 谢谢你@Barmak Shemirani –

+0

显然你已经创建了页面对话框作为选项卡控制的子项,这是错误的开始。在这种情况下使用'tab.DeleteAllItems()'。我已经表明,作为替代。但不要像我那样计算孩子窗位置。 –

+0

谢谢@Barmak Shemirani –

相关问题