我正在编写一个编辑歌曲元数据的应用程序。要做到这一点,我有一个选择了歌曲标签的窗口,你可以选择旧的和新的。我有一个自定义控件,每个标签框中有3个图片框。左帽有一个图片框,一个用于中间,一个用于右帽。然后我覆盖了OnPaint,UserControl将文本绘制到控件上。这工作正常,除非我尝试在其中包含图像的图片框顶部使用白色文本。白色似乎变得半透明。我在下面附上照片来证明这一点。
黑色文字
Image of Black Text http://bentrengrove.com.au/blackText.PNG
白色文字
Image of White Text http://bentrengrove.com.au/WhiteText.PNG
以下是我的OnPaint方法的代码
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Graphics g = e.Graphics;
Brush b;
Font f;
if (_isSelected && this.Enabled) //Determines if the tag has the boxes visible, i.e is a selected tag
{
b = new SolidBrush(Color.White);
f = new System.Drawing.Font("Segoe UI", 8, FontStyle.Regular);
}
else
{
b = new SolidBrush(Color.Gray);
f = new System.Drawing.Font("Segoe UI", 8, FontStyle.Regular);
}
var textSize = g.MeasureString(_text, f); //We will resize the tag boxes based on the size of the text
StringFormat drawFormat = new StringFormat();
drawFormat.Alignment = StringAlignment.Near;
RectangleF layoutRectangle = new RectangleF(leftCap.Width, 1, textSize.Width, 16);
if (textSize.Width >= 105)
_text = String.Format("{0}...", _text.Substring(0, 15)); //There is only so much room to display text
middle.Width = (int)textSize.Width + rightCap.Width;
rightCap.Left = middle.Left + middle.Width - rightCap.Width;
g.DrawString(_text, f, b, layoutRectangle, drawFormat); //Draw the string for this control based on what has been set to text
//Clean up
g.Dispose();
b.Dispose();
f.Dispose();
}
如果有人有任何想法我为什么不能用白色绘画,请帮助我们。非常感谢。
答案 0 :(得分:1)
我自己解决了这个问题。问题是由于订单项在表单上绘制。因为我在控件OnPaint方法中绘制了一个图片框,所以首先调用OnPaint。即使base.OnPaint是我的onPaint方法中的第一个项目,也会在此方法完成后绘制控件的绘制。通过删除中间图片框并在OnPaint中绘制其图像,文本正确绘制白色。我仍然不确定为什么这个问题只出现在白色文本上,而不会出现在其他颜色上。
答案 1 :(得分:0)
你绝对确定你最终使用的画笔是白色的吗?您可以验证_isSelected
和this.Enabled
都是true
吗?检查调试器以查看值。
我在Gray
背景上添加了一些DimGray
文字,它看起来与现在的情况类似。
protected override void OnPaint(PaintEventArgs pe)
{
using (Font f = new Font(this.Font.FontFamily, 8f, FontStyle.Regular))
{
pe.Graphics.DrawString(
"Foo",
f,
Brushes.Black,
new PointF(5, 5),
new StringFormat
{
Alignment = StringAlignment.Near,
});
pe.Graphics.DrawString(
"Bar",
f,
Brushes.Gray,
new PointF(5, 20),
new StringFormat
{
Alignment = StringAlignment.Near,
});
pe.Graphics.DrawString(
"Bar",
f,
Brushes.White,
new PointF(5, 35),
new StringFormat
{
Alignment = StringAlignment.Near,
});
}
}