【发布时间】:2015-07-15 00:08:03
【问题描述】:
以下是在进度条上绘制文本的 C# 代码。它用于向进度条添加文本,显示剩余时间倒计时。我使用 Graphics 类来绘制字符串而不是 Windows 窗体标签,因为标签背景在放置在进度条上时无法设置为透明。
但是,使用此代码,文本在每次更新时都会闪烁(此方法在每秒计时一次的计时器内调用),因此它几乎一直在闪烁并且无法使用。
/// <summary>
/// Adds time remaining text into a System.Windows.Forms.ProgressBar
/// </summary>
/// <param name="target">The target progress bar to add text into</param>
/// <param name="remainingTimeText">The text to add into the progress bar.</param>
private void set_progress_bar_text( System.Windows.Forms.ProgressBar target, string remainingTimeText )
{
// Make sure we do not have a null progress bar.
if( target == null )
{
throw new ArgumentException( "Null Target" );
}
// Use the progress bar label font and size.
Font textFont = new Font( labelProgress.Font.Name, labelProgress.Font.Size );
// gr will be the graphics object we use to draw on the progress bar.
using( Graphics gr = target.CreateGraphics() )
{
gr.DrawString( remainingTimeText,
textFont,
new SolidBrush( Color.Black ), // The brush we will use to draw the string, using a black colour.
// The position on the progress bar to put the text.
new PointF(
// X location of text, to be placed at the centre of the progress bar.
progressBar.Width / 2 - ( gr.MeasureString( remainingTimeText,
textFont ).Width / 2.0F ),
// Y Location
progressBar.Height / 2 - ( gr.MeasureString( remainingTimeText,
textFont ).Height / 2.0F ) ) );
}
}
我已尝试按照 Stack Overflow 上相关问题的建议在此方法中设置 DoubleBuffered = true,但它并不能防止闪烁。我无法减少文本更新的次数,因为文本是一个必须每秒更新一次的倒计时时钟。有没有办法通过双缓冲来防止闪烁,或者有其他潜在的解决方案吗?
【问题讨论】:
-
您应该从该进度条的绘制事件内部调用 set_progress_bar_text 并绘制到通过 EventArgs 提供给您的图形对象上。然后优化的绘画有机会工作。您的计时器应该只触发 ProgressBar 的重绘。
-
据我所知@Ralf,进度条没有自己的绘制事件。
-
看过另一个问题后,那里的解决方案根本无法显示我的文本。 CreateParams 阻止所有文本显示在进度条上,我是否缺少某些步骤?谢谢@MatthewWatson
-
嗯,你必须在绘画事件中进行绘画,而不是像现在这样。
标签: c# winforms windows-forms-designer flicker text-rendering