手动更新TabControl.DisplayRectangle

时间:2013-09-04 07:25:24

标签: c# .net gdi+ tabcontrol rectangles

我正在用C#编写一个自定义绘制的TabControl类。

我的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使用两个矩形表面;

  • 包含整个控件的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;
}

我遇到的问题是,当TabControl重新调整大小时,DisplayRectangle会起作用并相应地重新调整大小,但是当父窗体最大化/最小化时(从而更改控件)尺寸),显示矩形不会更新。

我该如何解决这个问题?是否有任何手动管理显示矩形的指南?

1 个答案:

答案 0 :(得分: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!
}