C#のタブコントロールでタブを非表示にする

C#でフォームアプリを作成するときの画面遷移の方法のひとつとして、表示するフォームはそのままに中身だけを変えたいことがあります。
そんなとき、タブコントロールでもできます。
普通のタブコントロールは上にタブのページ切り替えがついていますが、それを非表示にすることで実現します。

まずは項目の追加でコンポーネントを作成します。
TablessControlとしておきます。
生成されたTablessControl.csを開きます。
ベースクラスをTabControlに置き換え、下記のように追加します。

public partial class TablessControl : TabControl
{
    ...(省略)...

    private const int TCM_ADJUSTRECT = 0x1328;

    protected override void WndProc(ref Message m)
    {
        if ((m.Msg == TCM_ADJUSTRECT) && (!this.DesignMode))
        {
            m.Result = (IntPtr)1;
        }
        else
        {
            base.WndProc(ref m);
        }
    }
}

WindowMessageの0x1328が来た場合に1を返すというものです。
表示領域の計算のメッセージです。
DesignModeの判定を入れることで、デザイナで表示中はページ切り替え可能、実行中はページ切り替え非表示という動きになります。

実行中はページ切り替えが表示されないので、コードで切り替える必要があります。
例えば下記はボタンをクリックするとタブのページを順番に切り替える処理になります。

private void ButtonClick(object sender, EventArgs e)
{
    this.tablessControl1.SelectedIndex = (this.tablessControl1.SelectedIndex + 1) % this.tablessControl1.TabCount;
}

この方法は知っていると意外と使えます。

スポンサーリンク