【问题标题】:C# tabControl DrawFixedC# tabControl DrawFixed
【发布时间】:2012-08-26 19:56:28
【问题描述】:

我正在使用 TabControl 并且我有 DrawFixed。我只想绘制标签而不是它下面的面板。

如何删除它?

另外我想问一下,我可以更改标签大小吗?我有很长的文本,如果它被选中,我希望看到它,但如果它不活跃,我希望看到它被裁剪。

我在 draw 事件中关注,但它总是以相同的大小绘制选项卡。

if (e.State == DrawItemState.Selected)
{
    e.Graphics.FillRectangle(Brushes.White, e.Bounds.Left, e.Bounds.Top, e.Bounds.Width, e.Bounds.Height);
}
else
{
    e.Graphics.FillRectangle(Brushes.LightGray, e.Bounds.Left, e.Bounds.Top, e.Bounds.Width, e.Bounds.Height);
    text = text.Length > 10 ? text.Substring(0, 10) + "..." : text;
}

e.Graphics.DrawString(text, e.Font, Brushes.Black, e.Bounds.Left + 17, e.Bounds.Top + 3);

提前致谢。

【问题讨论】:

  • 可以问一下使用 OwnerDrawFixed 的意图吗? TabControl 是一个难以调整的控件,它使用传统的绘图方法并且有已知的错误启动。您是继承和自定义 TabControl 还是按原样使用它?
  • @JCollins 我在上面画了一些图像。是聊天窗口。有用户可用性,名称,它通过消息图标和橙色背景指示新消息。我只有自己的 TabPages。 TabControl 没有变化。
  • 您要覆盖的抽奖事件到底在哪里?如果您要覆盖 TabControl 并创建自己的继承控件,则可以在构造函数中使用 SetStyle(ControlStyles.UserPaint, True) 然后覆盖 OnPaint 和/或 OnPaintBackground 然后您将拥有完全的控制权。不过,您将负责绘制标签。
  • @JCollins 如果你的意思是这个,我正在为 TabControl 使用 DrawItem 事件。我没有自己的 TabControl,我想如果我真的想这样做,那会很复杂。我可以问你我的问题的第 2 部分:如何调整已裁剪文本的非活动标签的大小?你知道一些在 Draw 事件中显示一些样式的网站吗?我想使用默认的选项卡样式,但我也想要自己的绘图。所以一些如何设置标签样式的灵感。
  • 如果我没记错的话,您是在问为什么标签没有针对可变长度文本调整大小? TabControls 对标签大小的控制很少,要么像您的情况一样固定,要么系统自动设置大小。基本上没有办法,无论是否继承,都可以覆盖该行为。关于绘图,您要么完全控制,要么将其留给系统。我花了很多时间尝试自定义选项卡控件,这非常痛苦。没有具体的链接,但对于人们完成的项目,我会使用 sourceforge。

标签: c# winforms .net-3.5 tabs tabcontrol


【解决方案1】:

按时间顺序在您的问题中,您已询问如何摆脱顶部的那个栏。如果您坚持使用选项卡仅控制固定控件集的内容的“人造”选项卡页,那么将选项卡控件的高度缩小到不可见的点可能是可接受的解决方案。我刚刚尝试过,经过一些调整,它看起来主要是我认为你所追求的。作为记录,我建议按预期实际使用选项卡页,即作为控件的主机,即使您制作了一个自定义控件,它将所有您希望可见的控件汇集在一起​​。这将更适合标签范式。

对于第二点,您想调整选项卡的大小。不可能的。该框架为DrawStyle 提供了两个选项,Normal 和OwnerDrawFixedNormal 允许 Windows 根据文本和字体设置选项卡大小,OwnerDrawFixed 表示选项卡大小完全固定。对此没有更多的控制权。 OwnerDrawFixed 但是,您可以访问 OnDrawItem 事件,这是您想要用于绘制标签本身的事件。

现在看来您已经咬紧牙关,将 UserPaint 设置为 True,这意味着您现在正在完成所有绘图。我建议此时将DrawStyle 设置回Normal,然后您可以混合一些幕后文本以让Windows 自动控制选项卡宽度。我会警告这不会很健壮,因为每个人都有不同的字体设置和几个像素,所以什么都不会正确。

所以在这里我将指出TabControl.GetTabRect(index As Integer),您可以使用该方法来获取给定选项卡的边界矩形。我在所有选项卡索引的循环中使用它,然后在每个选项卡提供的矩形内为选项卡执行我需要的所有绘图。这意味着我不需要使用 OwnerDrawFixed 来获得要在其中绘制的边界。

但是,如果您想要更好的控制,您有 80% 的方法来实现您想要看到的任何控制,从 ControlUserControl 开始。类似的外观可以通过重叠按钮实现,并带有一些逻辑来绘制和布局它们。然后你也可以获得你想要的所有文本外观。我自己也考虑过,但没有因为我仍然托管TabPages。既然你摆脱了它,那就更容易了......

【讨论】:

  • 你用什么方法遍历所有选项卡并进行绘图?
【解决方案2】:

只需使用页面文本默认属性,它会根据文本大小为您自动修复标签大小..然后自行绘制文本..如果您仍需要额外空间来绘制图像或其他内容,请使用填充这是选项卡控件而不是选项卡页的属性。希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    相关资源
    最近更新 更多