c#如何连续无延迟地调用onpaint
c# how to call onpaint continuously without lag
我正在制作自定义用户控件,但是当我覆盖 OnPaint()
时,它不会连续调用。
这是我的代码:
[ToolboxData("<{0}:ColoredProgressBar runat=server></{0}:ColoredPorgressBar>")]
public class ColoredProgressBar : ProgressBar
{
public Timer timer;
public ColoredProgressBar()
{
timer = new Timer();
timer.Interval = 1000;
timer.Tick += new EventHandler(timer_Tick);
timer.Start();
SetStyle(ControlStyles.DoubleBuffer, true);
SetStyle(ControlStyles.UserPaint, true);
}
public void timer_Tick(object sender , EventArgs e)
{
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
// Call methods of the System.Drawing.Graphics object.
e.Graphics.DrawString(Text, Font, new SolidBrush(ForeColor), ClientRectangle);
Console.WriteLine("???");
}
}
我等了 10 秒,消息“???”应该不断出现在我的控制台中,
bug 我只看到 12 条消息出现。我试过了Invalidate(true);
虽然消息不断出现,但表格很滞后。
e.Graphics.DrawString
不是一个非常昂贵的方法,对吧?
我怎样才能不延迟地连续调用 OnPaint()
?
您的代码中的所有内容都可以正常工作。 WinForms 只是 WinApi 和 GDI+ 之上的框架,因此您必须首先了解一些有关 windows 内部消息泵及其发送的消息的知识,您可以阅读 here.
如您所见,WinForms 使用 WM_PAINT
消息重新绘制控件。
每个 OnPaint
事件在您的应用程序收到 WM_PAINT
消息后调用。您当然可以使用 Invalidate()
which will not force painting routine synchronously as stated on msdn page, and you would have to call Update()
之类的方法来强制显示此消息,之后应将其用作:
this.Invalidate();
this.Update();
或者您可以直接调用 Refresh()
方法,这将强制重绘您的控件及其所有子控件。
我正在制作自定义用户控件,但是当我覆盖 OnPaint()
时,它不会连续调用。
这是我的代码:
[ToolboxData("<{0}:ColoredProgressBar runat=server></{0}:ColoredPorgressBar>")]
public class ColoredProgressBar : ProgressBar
{
public Timer timer;
public ColoredProgressBar()
{
timer = new Timer();
timer.Interval = 1000;
timer.Tick += new EventHandler(timer_Tick);
timer.Start();
SetStyle(ControlStyles.DoubleBuffer, true);
SetStyle(ControlStyles.UserPaint, true);
}
public void timer_Tick(object sender , EventArgs e)
{
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
// Call methods of the System.Drawing.Graphics object.
e.Graphics.DrawString(Text, Font, new SolidBrush(ForeColor), ClientRectangle);
Console.WriteLine("???");
}
}
我等了 10 秒,消息“???”应该不断出现在我的控制台中,
bug 我只看到 12 条消息出现。我试过了Invalidate(true);
虽然消息不断出现,但表格很滞后。
e.Graphics.DrawString
不是一个非常昂贵的方法,对吧?
我怎样才能不延迟地连续调用 OnPaint()
?
您的代码中的所有内容都可以正常工作。 WinForms 只是 WinApi 和 GDI+ 之上的框架,因此您必须首先了解一些有关 windows 内部消息泵及其发送的消息的知识,您可以阅读 here.
如您所见,WinForms 使用 WM_PAINT
消息重新绘制控件。
每个 OnPaint
事件在您的应用程序收到 WM_PAINT
消息后调用。您当然可以使用 Invalidate()
which will not force painting routine synchronously as stated on msdn page, and you would have to call Update()
之类的方法来强制显示此消息,之后应将其用作:
this.Invalidate();
this.Update();
或者您可以直接调用 Refresh()
方法,这将强制重绘您的控件及其所有子控件。