2013-08-05 34 views
0

我正在绘制一些东西,让我们假设在Windows窗体中的面板上的图像。 我能画我我遵循以下步骤:在不使用Panel1_Paint()事件的情况下在面板中绘制一些形状

1)添加面板到表单 2)用下面的代码:

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

这是绘制在面板的唯一途径。

我有一个计划,不使用此事件绘制 我试过了下面的代码,结果为负数。

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

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

..我可以画画。 ?

回答

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(); 

事实上,当WM_PAINT是被提出的Paint事件发送到您的Panel,您可以捕获此消息来绘制图像,而不是在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... 
} 
相关问题