Как исправить фоновое цветное кровотечение в окаймленном инструменте ToolStripStatusLabel
У меня проблема с ToolStripStatusLabel
что происходит, когда BorderSides
установлен в All
и я установил цвет фона, отличный от StatusStrip
Цвет фона: ToolStripStatusLabels Backgroundcolor выделяется за пределами границы, что выглядит довольно некрасиво. Я пытался установить BorderStyle
Свойство с другими настройками, чем квартира без успеха.
На скриншоте, добавленном ниже, вы видите проблему - пример с BorderStyle = Adjust
чтобы нарисовать границу за пределами прямоугольника. Но, к сожалению, граница исчезает полностью.
То, что я хотел бы получить, это вовсе не кровотечение, как в этом рисованном примере.
Возможно ли это сделать с помощью параметра или путем наследования или переопределения определенного метода ToolStripStatusLabel
? Я открыт для программных решений, но я не знаю, с чего начать, поэтому любые советы будут приветствоваться.
Реализовано решение путем объединения ответов x4rf41 и TaW ниже
Поскольку я использовал несколько ответов, которые привели меня на правильный путь, я добавил окончательное решение вопроса.
Я продлил ToolStripStatusLabel
класс и преодолеть OnPaint
метод. Это дало мне возможность использовать свойства классов и нарисовать их так, как бы они рисовали себя нормально, но без кровотечения.
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);
}
}
2 ответа
Я не думаю, что ваша проблема может быть решена путем установки свойств меток. Вы должны сделать несколько пользовательских рисунков.
Я не знаю точно, что вы пытаетесь сделать со своими ярлыками, но самый простой способ для пользовательского рисования - это использовать событие рисования ярлыка:
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);
}
это даст вам нарисованный от руки пример, если вы установите BackColor метки в пурпурный цвет, а ForeColor в правый серый.
Вы также можете расширить класс ToolStripStatusLabel и переопределить метод onPaint. Код был бы почти таким же, но у вас есть больше опций в пользовательском классе, например, добавление свойства 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);
}