如何修复带边框的 ToolStripStatusLabel 中的背景颜色溢出
Howto fix Backgroundcolor bleeding in bordered ToolStripStatusLabel
我遇到 ToolStripStatusLabel
的问题,当 BorderSides
设置为 All
并且我设置的背景颜色与拥有的 StatusStrip
背景颜色不同时会发生:ToolStripStatusLabels Backgroundcolor 在边界外溢出 - 看起来非常难看。我尝试将 BorderStyle
属性 设置为 Flat 以外的其他设置,但没有成功。
在下面添加的屏幕截图中,您看到了问题 - 蓝绿色示例使用 BorderStyle = Adjust
将边框绘制在矩形外。但不幸的是,边界完全消失了。
我想得到的是像这个手绘例子中那样完全没有流血。
是否可以通过设置或继承或覆盖 ToolStripStatusLabel
的特定方法来实现?我对编程解决方案持开放态度,但我不知道从哪里开始,所以欢迎任何提示。
通过结合以下 and 的答案实施了解决方案
由于我使用了多个答案使我走上了正确的轨道,所以我将最终的解决方案添加到问题中。
我扩展了 ToolStripStatusLabel
class 并覆盖了 OnPaint
方法。这使我有可能利用 classes 属性并绘制它,因为它会正常绘制但没有出血。
public partial class ToolStripStatusLabelWithoutColorBleeding : ToolStripStatusLabel
{
/// <summary>
/// Bugfix to prevent bleeding of background colors outside the borders.
/// </summary>
/// <param name="e"></param>
protected override void OnPaint(PaintEventArgs e)
{
Rectangle borderRectangle = new Rectangle(0, 0, Width - 1, Height - 1);
// Background
e.Graphics.FillRectangle(new SolidBrush(BackColor), borderRectangle);
// Border (if required)
if (BorderSides != ToolStripStatusLabelBorderSides.None)
ControlPaint.DrawBorder3D(e.Graphics, borderRectangle, BorderStyle, (Border3DSide)BorderSides);
// Draw Text if you need it
e.Graphics.DrawString(Text, Font, new SolidBrush(ForeColor), 0,0);
}
}
我不认为你的问题可以通过设置标签属性来解决。你必须做一些自定义绘图。
我不知道你到底想用你的标签做什么,但自定义绘图的最简单方法是使用标签的绘画事件:
private void toolStripStatusLabel1_Paint(object sender, PaintEventArgs e)
{
// Use the sender, so that you can use the same event handler for every label
ToolStripStatusLabel label = (ToolStripStatusLabel)sender;
// Background
e.Graphics.FillRectangle(new SolidBrush(label.BackColor), e.ClipRectangle);
// Border
e.Graphics.DrawRectangle(
new Pen(label.ForeColor), // use any Color here for the border
new Rectangle(e.ClipRectangle.Location,new Size(e.ClipRectangle.Width-1,e.ClipRectangle.Height-1))
);
// Draw Text if you need it
e.Graphics.DrawString(label.Text, label.Font, new SolidBrush(label.ForeColor), e.ClipRectangle.Location);
}
如果您将标签的背景颜色设置为品红色,将前景色设置为右侧灰色,这将为您提供手绘示例。
您还可以扩展 ToolStripStatusLabel class 并覆盖 onPaint 方法。代码几乎相同,但您在自定义 class 中有更多选项,例如添加 BorderColor 属性 或类似的东西。
我使用 ControlPaint.DrawBorder3D
玩了一下,发现它也有 BackColor 显示为底线和右线。
所以,与xfr41的回答类似,我尝试做所有者绘图。我的想法是使用系统的例程,但是在裁剪区域上扩大绘图矩形;这样错误的条纹就完全消失了..
private void toolStripStatusLabel1_Paint(object sender, PaintEventArgs e)
{
Rectangle r = e.ClipRectangle;
Rectangle r2 = new Rectangle(r.X, r.Y, r.Width + 1, r.Height + 1);
ControlPaint.DrawBorder3D(e.Graphics, r2 , Border3DStyle.SunkenInner);
}
我遇到 ToolStripStatusLabel
的问题,当 BorderSides
设置为 All
并且我设置的背景颜色与拥有的 StatusStrip
背景颜色不同时会发生:ToolStripStatusLabels Backgroundcolor 在边界外溢出 - 看起来非常难看。我尝试将 BorderStyle
属性 设置为 Flat 以外的其他设置,但没有成功。
在下面添加的屏幕截图中,您看到了问题 - 蓝绿色示例使用 BorderStyle = Adjust
将边框绘制在矩形外。但不幸的是,边界完全消失了。
我想得到的是像这个手绘例子中那样完全没有流血。
是否可以通过设置或继承或覆盖 ToolStripStatusLabel
的特定方法来实现?我对编程解决方案持开放态度,但我不知道从哪里开始,所以欢迎任何提示。
通过结合以下 and 的答案实施了解决方案
由于我使用了多个答案使我走上了正确的轨道,所以我将最终的解决方案添加到问题中。
我扩展了 ToolStripStatusLabel
class 并覆盖了 OnPaint
方法。这使我有可能利用 classes 属性并绘制它,因为它会正常绘制但没有出血。
public partial class ToolStripStatusLabelWithoutColorBleeding : ToolStripStatusLabel
{
/// <summary>
/// Bugfix to prevent bleeding of background colors outside the borders.
/// </summary>
/// <param name="e"></param>
protected override void OnPaint(PaintEventArgs e)
{
Rectangle borderRectangle = new Rectangle(0, 0, Width - 1, Height - 1);
// Background
e.Graphics.FillRectangle(new SolidBrush(BackColor), borderRectangle);
// Border (if required)
if (BorderSides != ToolStripStatusLabelBorderSides.None)
ControlPaint.DrawBorder3D(e.Graphics, borderRectangle, BorderStyle, (Border3DSide)BorderSides);
// Draw Text if you need it
e.Graphics.DrawString(Text, Font, new SolidBrush(ForeColor), 0,0);
}
}
我不认为你的问题可以通过设置标签属性来解决。你必须做一些自定义绘图。
我不知道你到底想用你的标签做什么,但自定义绘图的最简单方法是使用标签的绘画事件:
private void toolStripStatusLabel1_Paint(object sender, PaintEventArgs e)
{
// Use the sender, so that you can use the same event handler for every label
ToolStripStatusLabel label = (ToolStripStatusLabel)sender;
// Background
e.Graphics.FillRectangle(new SolidBrush(label.BackColor), e.ClipRectangle);
// Border
e.Graphics.DrawRectangle(
new Pen(label.ForeColor), // use any Color here for the border
new Rectangle(e.ClipRectangle.Location,new Size(e.ClipRectangle.Width-1,e.ClipRectangle.Height-1))
);
// Draw Text if you need it
e.Graphics.DrawString(label.Text, label.Font, new SolidBrush(label.ForeColor), e.ClipRectangle.Location);
}
如果您将标签的背景颜色设置为品红色,将前景色设置为右侧灰色,这将为您提供手绘示例。
您还可以扩展 ToolStripStatusLabel class 并覆盖 onPaint 方法。代码几乎相同,但您在自定义 class 中有更多选项,例如添加 BorderColor 属性 或类似的东西。
我使用 ControlPaint.DrawBorder3D
玩了一下,发现它也有 BackColor 显示为底线和右线。
所以,与xfr41的回答类似,我尝试做所有者绘图。我的想法是使用系统的例程,但是在裁剪区域上扩大绘图矩形;这样错误的条纹就完全消失了..
private void toolStripStatusLabel1_Paint(object sender, PaintEventArgs e)
{
Rectangle r = e.ClipRectangle;
Rectangle r2 = new Rectangle(r.X, r.Y, r.Width + 1, r.Height + 1);
ControlPaint.DrawBorder3D(e.Graphics, r2 , Border3DStyle.SunkenInner);
}