C# 是否确实要删除此自定义ProgressBar类中闪烁的文本?
这就是我让字符串显示在工具栏上的方法:C# 是否确实要删除此自定义ProgressBar类中闪烁的文本?,c#,text,progress-bar,flicker,C#,Text,Progress Bar,Flicker,这就是我让字符串显示在工具栏上的方法: public class ProgressBarWithText : ProgressBar { const int WmPaint = 15; SizeF TextSize; PointF TextPos; public ProgressBarWithText() { this.DoubleBuffered = true; this.TextChanged += ProgressB
public class ProgressBarWithText : ProgressBar
{
const int WmPaint = 15;
SizeF TextSize;
PointF TextPos;
public ProgressBarWithText()
{
this.DoubleBuffered = true;
this.TextChanged += ProgressBarWithText_TextChanged;
this.SizeChanged += ProgressBarWithText_SizeChanged;
}
public override string Text
{
get { return base.Text; }
set { base.Text = value; }
}
void RecalcTextPos()
{
if (string.IsNullOrEmpty(base.Text))
return;
using (var graphics = Graphics.FromHwnd(this.Handle))
{
TextSize = graphics.MeasureString(base.Text, this.Font);
TextPos.X = (this.Width / 2) - (TextSize.Width / 2);
TextPos.Y = (this.Height / 2) - (TextSize.Height / 2);
}
}
void ProgressBarWithText_SizeChanged(object sender, EventArgs e)
{
RecalcTextPos();
}
void ProgressBarWithText_TextChanged(object sender, EventArgs e)
{
RecalcTextPos();
}
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
switch (m.Msg)
{
case WmPaint:
using (var graphics = Graphics.FromHwnd(Handle))
graphics.DrawString(base.Text, base.Font, Brushes.Black, TextPos.X, TextPos.Y);
break;
}
}
}
这是可行的,但文本只是在闪烁。
图灵这个。双缓冲到真没有帮助。
还有其他想法吗?可能我需要在不同的消息或不同的图形中绘制文本?将此CreateParams覆盖放置在您的类中,它将解决此问题:
protected override CreateParams CreateParams
{
get
{
CreateParams result = base.CreateParams;
result.ExStyle |= 0x02000000; // WS_EX_COMPOSITED
return result;
}
}
将此CreateParams重写放置在类中,它将解决它:
protected override CreateParams CreateParams
{
get
{
CreateParams result = base.CreateParams;
result.ExStyle |= 0x02000000; // WS_EX_COMPOSITED
return result;
}
}
为什么不直接重写OnPaint?有什么理由我不想处理绘图条进度本身。或者OnPaint根本就没有调用过。这可能会对您有所帮助,但我希望能找到一些较小的解决方案来修复我的代码。代码越少=解决的麻烦就越少,这就是我所想的。Sriram发布的链接有什么问题?它简单明了,易于实现。为什么不直接重写OnPaint?有什么理由我不想处理绘图条进度本身。或者OnPaint根本就没有调用过。这可能会对您有所帮助,但我希望能找到一些较小的解决方案来修复我的代码。代码越少=解决的麻烦就越少,这就是我所想的。Sriram发布的链接有什么问题?这是直截了当,易于实施。真棒!非常感谢你。这就是我所需要的。太棒了!非常感谢你。这就是我所需要的。