我如何调用绘画事件?

我的程序在其面板上绘制文本,但是如果我想删除文本,我必须重新绘制。

我如何手动(举起)油漆事件?

Invalidate()方法将导致重绘。

MSDN链接

在你的Form或者Control的方法中,你有3个select:

this.Invalidate(); // request a delayed Repaint by the normal MessageLoop system this.Update(); // forces Repaint of invalidated area this.Refresh(); // Combines Invalidate() and Update() 

通常,您只需调用Invalidate() ,让系统将其与其他屏幕更新结合使用。 如果你很急,你应该调用Refresh()但是由于其他控件(尤其是父类)的失效,将会连续重绘几次。

Windows(Win32和WinForms.Net)处理这个问题的正常方法是等待MessageQueue空运行,然后处理所有无效的屏幕区域。 这是有效的,因为当某些变化通常会级联成其他事物(控制)时也是如此。

Update()最常见的情况是在for循环中更改一个属性(比如label1.Text,这会使标签无效),并且该循环暂时阻止了Message-Loop。 每当你使用它,你应该问自己,如果你不应该使用线程。 但答案并不总是是的。

我发现Invalidate()创build太多的闪烁。 这是我的情况。 我正在开发的自定义控件通过处理Paint事件来绘制其全部内容

 this.Paint += this.OnPaint; 

这个处理程序调用一个自定义例程来完成实际的绘画。

 private void OnPaint(object sender, PaintEventArgs e) { this.DrawFrame(e.Graphics); } 

为了模拟滚动,我想在每次光标移动的同时按下鼠标左键来重新绘制我的控件。 我的第一个select是使用Invalidate() ,如下所示。

 private void RedrawFrame() { var r = new Rectangle( 0, 0, this.Width, this.Height); this.Invalidate(r); this.Update(); } 

控制旋转确定,但闪烁远远超出任何舒适的水平。 所以我决定,而不是重绘控件,直接调用我的自定义DrawFrame()方法后,处理MouseMove事件。 这产生了平滑的滚动,没有闪烁。

 private void RedrawFrame() { var g = Graphics.FromHwnd(this.Handle); this.DrawFrame(g); } 

这种做法可能并不适用于所有情况,但到目前为止,这种做法很适合我。

我想你也可以调用Refresh()

调用control.invalidate和绘制事件将被引发。

刷新可能会使更多的可读代码,取决于上下文。

使用Control.InvokePaint你也可以用它来手动双缓冲