2016-05-30 111 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 –

相關問題