是的,你可以绘制它,但是如果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...
}