C# Winforms 选项卡控制选项卡宽度错误

Posted

技术标签:

【中文标题】C# Winforms 选项卡控制选项卡宽度错误【英文标题】:C# Win Forms tab Control tab width error 【发布时间】:2011-05-03 08:16:48 【问题描述】:

我有自定义选项卡控件,其中 OnPaint 方法被覆盖。 然后出现奇怪的标签增长。标签越来越大(填充越来越大),它们的宽度取决于文本的长度。 当我使用默认选项卡控件时 - 填充是可以的。使用 UserPaint 时如何避免这种情况?

partial class Tab : TabControl

    public Tab()
    
        InitializeComponent();
        Init();
    

     private void Init()
    
        this.SetStyle(ControlStyles.UserPaint, true);
        this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
        this.SetStyle(ControlStyles.DoubleBuffer, true);
        this.SetStyle(ControlStyles.ResizeRedraw, true);
    
    protected override void OnPaint(PaintEventArgs e)
    
       DrawTabPane(e.Graphics);
    

    private void DrawTabPane(Graphics g)

       if (!Visible)
      return;

       // here we draw our tabs
       for (int i = 0; i < this.TabCount; i++)
         DrawTab(g, this.TabPages[i], i);
    
    internal void DrawTab(Graphics g, TabPage tabPage, int nIndex)
    
        Rectangle recBounds = this.GetTabRect(nIndex);
        RectangleF tabTextArea = recBounds;

        Point[] pt = new Point[4];
        pt[0] = new Point(recBounds.Left + 1, recBounds.Bottom);
        pt[1] = new Point(recBounds.Left + 1, recBounds.Top + 1);
        pt[2] = new Point(recBounds.Right - 1, recBounds.Top + 1);
        pt[3] = new Point(recBounds.Right - 1, recBounds.Bottom);

        Brush br = new SolidBrush(clr_tab_norm);
        g.FillPolygon(br, pt);
        br.Dispose();

        StringFormat stringFormat = new StringFormat();
        stringFormat.Alignment = StringAlignment.Center;
        stringFormat.LineAlignment = StringAlignment.Center;
        br = new SolidBrush(clr_txt);

        g.DrawString(tabPage.Text, Font, br, tabTextArea, stringFormat);
    

【问题讨论】:

请提供您覆盖的OnPaint方法的代码 什么时候变大?我没看到。你能附上你的意思的图片吗? 好的。请参阅原始消息中的图片 【参考方案1】:

为 Windows 中内置的控件(如 TabControl)打开 ControlStyles.UserPaint 不是正确的做法。我假设错误在 GetTabRect() 中,它在 sn-p 中不可见。

相反,您应该使用 TabControl.DrawMode 属性并实现 DrawItem 事件。 MSDN Library 中有一个很好的例子。

【讨论】:

绘制项目。这是一个很好的解决方案,但不适合我,因为出现了焦点矩形。【参考方案2】:

从图像中可以看出,您的代码将选项卡的大小设置为比它们需要的更宽。额外的填充出现在所有选项卡中,但在文本较长的选项卡中更明显。

我不能确定这是为什么,但我猜想计算标签大小的代码(基于字体度量)使用的字体与用于绘制标签的字体不同。

【讨论】:

以上是关于C# Winforms 选项卡控制选项卡宽度错误的主要内容,如果未能解决你的问题,请参考以下文章

在带有选项卡的 Winforms 的模型视图演示器中应该使用多少个演示器?

如何在powershell中使用winforms右键单击选项卡时捕获事件

再次按下时禁用所选选项卡的重新初始化

自定义 TabControl 以关闭单个选项卡

用户选择选项卡时如何重置 UITabBarController 的选项卡(或选项卡控制器)?

在每个选项卡错误处使用导航控制器从视图控制器转换到选项卡栏控制器