0

我正在画一些东西,让我们假设面板上的图像以 Windows 形式显示。我可以画我按照以下步骤操作:

1)在表格中添加面板 2)使用以下代码:

private void panel1_Paint(object sender, PaintEventArgs e)
    {
        e.Graphics.DrawImage(im, leftTop);
    }

这是在面板上绘制的唯一方法。

我有一个计划在不使用这个事件的情况下进行绘制,我通过下面的代码尝试过,结果是否定的。

this.panel1.CreateGraphics().DrawImage(im, leftTop);

在这两种情况下,im 都是图像。

..我可以画画吗??

4

1 回答 1

1

是的,您可以绘制它,但是如果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();

实际上,当发送到您的Paint时会引发该事件,您可以捕获此消息来绘制图像,而不是在引发时绘制它。WM_PAINTPanelPaint

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...
}
于 2013-08-05T09:11:11.663 回答