C# 在面板中绘制一些形状,而不使用Panel1_Paint()事件

C# 在面板中绘制一些形状,而不使用Panel1_Paint()事件,c#,winforms,panel,paint,C#,Winforms,Panel,Paint,我正在画一些东西,让我们假设一个图像在Windows窗体的面板上。 我可以按照以下步骤绘制: 1) 将面板添加到表单中 2) 使用以下代码: private void panel1_Paint(object sender, PaintEventArgs e) { e.Graphics.DrawImage(im, leftTop); } 这是唯一一种在面板上画画的方法吗 我有一个不参加这次活动的计划 我尝试了下面的代码,结果是否定的 this.panel1.Cre

我正在画一些东西,让我们假设一个图像在Windows窗体的面板上。 我可以按照以下步骤绘制:

1) 将面板添加到表单中 2) 使用以下代码:

private void panel1_Paint(object sender, PaintEventArgs e)
    {
        e.Graphics.DrawImage(im, leftTop);
    }
这是唯一一种在面板上画画的方法吗

我有一个不参加这次活动的计划 我尝试了下面的代码,结果是否定的

this.panel1.CreateGraphics().DrawImage(im, leftTop);
在这两种情况下,im都是图像


。。我会画画吗

是的,您可以绘制它,但是如果引发
Paint
事件,将重新绘制默认内容,并且您绘制的所有内容都将被覆盖/擦除/清除

因此,要绘制图像,最好的方法是在
Paint
事件处理程序中添加绘制代码,就像您发布的第一个代码那样

否则,您必须周期性地绘制图像,这是不高效的,因为我们只需要在需要时重新绘制图像。系统提供了
Paint
事件,以便在需要重新绘制控件时(在默认图形旁边)进行通知

以下是使用计时器定期绘制图像的方法,但不建议这样做,仅用于演示目的:

 Timer t = new Timer();
 t.Interval = 10;
 Graphics g = null;
 panel1.HandleCreated += (s,e) => {
   g = panel1.CreateGraphics();
 };
 t.Tick += (s,e) => {
    if(g == null) return;
    g.DrawImage(im,leftPoint);
 };
 //
 t.Start();
事实上,当
WM_Paint
发送到
面板时,会引发
Paint
事件,您可以捕获此消息来绘制图像,而不是在引发
Paint
时绘制图像

public class MyPanel : Panel {
  Graphics g;
  public MyPanel(){
     HandleCreated += (s,e) => {
       g = panel1.CreateGraphics();
     };
  }
  protected override void WndProc(ref Message m){
     base.WndProc(ref m);
     if(m.Msg == 0xf&&g!=null)//WM_PAINT = 0xf
        g.DrawImage(im,leftTop);
  }
  //.... suppose somehow you pass im and leftTop in...
}