C# 如何在控件上绘制以使绘制不受影响';你不会消失吗?

C# 如何在控件上绘制以使绘制不受影响';你不会消失吗?,c#,winforms,image,controls,picturebox,C#,Winforms,Image,Controls,Picturebox,我想在PictureBox中显示图形文件,我有: private void btnLoad_Click(object sender, EventArgs e) { if (dgOpenFile.ShowDialog() == DialogResult.OK) { Bitmap img = new Bitmap(dgOpenFile.FileName); picture.Width = img.Height; picture.Heig

我想在PictureBox中显示图形文件,我有:

private void btnLoad_Click(object sender, EventArgs e)
{
    if (dgOpenFile.ShowDialog() == DialogResult.OK)
    {
        Bitmap img = new Bitmap(dgOpenFile.FileName);
        picture.Width = img.Height;
        picture.Height = img.Height;
        g.DrawImage(img, 0f, 0f);
    }
}
那是
g

private void Form1_Load(object sender, EventArgs e)
{
    g = picture.CreateGraphics();
}

但是当我把表格移到窗外时,我的照片就消失了。如何防止这种情况发生?

您应该在控件的
OnPaint
事件中执行任何自定义绘图,以使其持久化。这会导致每次绘制控件时都重新绘制图形

但是,在这种情况下,使用图片框会更容易:

picture.Image = img;

Windows使用“按需绘制”原则

因此,当它向控件发送WM_PAINT消息时,将调用OnPaint()。您应该准备好(再次)在重写的OnPaint()或Paint事件处理程序中绘制图像


但是一个图片盒可以帮你完成所有这些

为什么不把图片分配给PictureBox(
Image
-Property)?
g
到底从哪里来?看起来很不对。
g
是你的问题。取而代之的是从
OnPaint
方法中获取实例。将WM_PAIN更改为WM_PAINT,这是弗洛伊德的失误(如果有的话)!