2016-05-30 27 views
0

CTabCtrlCDockablePaneの内側に作成していて、1ページしか追加していない場合、タブバーを表示する必要はありません。 ページが1つしかないときにタブバーを削除するにはどうすればよいですか? ありがとうございます。1つのページしかないときにCTabCtrlからタブバーを削除する

+0

あなたは(http://stackoverflow.com/a/4409941/366904)[そのように]、 'TCM_ADJUSTRECT'メッセージを捕捉することによりリサイズでこれを行うことができます。私はそれを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 –

関連する問題