1

TabControlC# でカスタム描画クラスを作成しています。

InitializeComponentコントロールをカスタム描画するために、私のメソッド(コンストラクターによって呼び出されます)は次のように動作します。

private void InitializeComponent()
{
    this.SetStyle(ControlStyles.UserPaint, true);
    this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
    this.SetStyle(ControlStyles.ResizeRedraw, true);
    this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
    this.UpdateStyles();
    this.DrawMode = TabDrawMode.OwnerDrawFixed;
}

TabControl は 2 つの長方形の表面を使用します。

  • コントロールClientRectangle全体を含む
  • コンテンツを表示するコントロールのDisplayRectangle部分ですTabPage

を調整したいのでDisplayRectangle、そのプロパティをオーバーライドしました(これは取得のみです):

public override Rectangle DisplayRectangle
{
    get
    {
        return this.displayRectangle; // points to a local rectangle, rather than base.DisplayRectangle
    }
}

OnSizeChanged次に、表示長方形のサイズを更新するためにオーバーライドしました。

protected override void OnSizeChanged(EventArgs e)
{
    base.OnSizeChanged(e);
    this.displayRectangle = this.ClientRectangle;
    this.displayRectangle.Y += this.ItemSize.Height + 4;
    this.displayRectangle.Height -= this.ItemSize.Height + 4;
}

私が遭遇している問題は、サイズが変更されると、それに応じTabControlDisplayRectangle動作し、サイズが変更されますが、親フォームが最大化/最小化されると (したがってコントロールのサイズが変更されると)、表示長方形が更新されません。

これを修正するにはどうすればよいですか?表示長方形を手動で管理するためのガイドラインはありますか?

4

1 に答える 1

0

この問題を解決するのに役立ついくつかのことを発見しました。彼らです; OnResize メソッドのオーバーライドを使用して表示四角形のサイズを変更し、表示四角形のサイズ変更が完了したら、タブ コントロールの各タブの境界を設定します。例:

protected override void OnResize(EventArgs e)
{
    base.OnResize(e);
    this.displayRectangle = this.ClientRectangle;
    this.displayRectangle.Y += this.ItemSize.Height + 4;
    this.displayRectangle.Height -= this.ItemSize.Height + 4;
    foreach(TabPage page in this.TabPages)
    {
        page.SetBounds(
            this.DisplayRectangle.X, 
            this.DisplayRectangle.Y, 
            this.DisplayRectangle.Width, 
            this.DisplayRectangle.Height, 
            SpecifiedBounds.All
        );
    }
    this.Refresh();  // Can optimize this!
}
于 2014-01-03T16:40:52.423 に答える