c#如何连续不停地调用onpaint

时间:2017-04-04 07:36:21

标签: c# override onpaint paintevent

我正在制作自定义用户控件,但是当我覆盖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秒,留言“???”应该不断出现在我的控制台中, 我只看到12条消息显示错误。我试过Invalidate(true);虽然消息不断出现,但表格却很滞后。

e.Graphics.DrawString不是一种非常昂贵的方法,对吗?

如何连续不停地致电OnPaint()

1 个答案:

答案 0 :(得分:1)

代码中的所有内容都可以正常运行。 WinForms只是WinApi和GDI +之上的框架,因此您必须先了解一下Windows内部消息泵及其发送的消息,您可以阅读here。 正如您所看到的那样,有一条WM_PAINT消息,然后由WinForms用于重新绘制控件。

在您的应用程序收到OnPaint消息后,将调用每个WM_PAINT事件。您当然可以使用像Invalidate()这样的方法强制执行此消息,这些方法不会像msdn页面上所述同步强制绘制例程,并且您必须调用Update(),之后应该用作:

this.Invalidate();
this.Update();

或者你可以直接调用Refresh()方法,这会强制重绘你的控件及其所有孩子。