C# WinForms绘图问题(我遗漏了什么明显的东西)

C# WinForms绘图问题(我遗漏了什么明显的东西),c#,winforms,graphics,C#,Winforms,Graphics,当我运行以下代码时,我在MyPictureBox对象中加载的图像会短暂闪烁,但随后表单会立即被标准Windows背景色覆盖 我收到的信息的顺序似乎是正确的 我已尝试删除base.OnPaint()中的每一个,但这无法修复它 我尝试了双重缓冲;没想到它会改变什么,也没有 我知道我错过了一些非常明显的东西。(请注意,除了我添加的MyPictureBox之外,表单没有其他控件。) 不要在OnPaint方法中创建新的图形对象;使用PaintEvents参数中提供的参数。正如@Jimi在上面指出的那样

当我运行以下代码时,我在MyPictureBox对象中加载的图像会短暂闪烁,但随后表单会立即被标准Windows背景色覆盖

  • 我收到的信息的顺序似乎是正确的
  • 我已尝试删除base.OnPaint()中的每一个,但这无法修复它
  • 我尝试了双重缓冲;没想到它会改变什么,也没有
我知道我错过了一些非常明显的东西。(请注意,除了我添加的MyPictureBox之外,表单没有其他控件。)


不要在OnPaint方法中创建新的图形对象;使用PaintEvents参数中提供的参数。正如@Jimi在上面指出的那样

CreateGraphics()控件;用于特定的、定义好的情况(主要用于测量材料)。不要使用它来绘制,也不要存储它(一旦控件重新绘制,它将无效-这种情况经常发生)。始终使用提供的图形对象(如PaintEventArgs)在重写的OnPaint()方法或绘制事件处理程序(或DrawItem和friends)中绘制


您是否尝试过在加载方法中设置图像?
Control.CreateGraphics()用于特定的、已定义的情况(主要用于度量内容)。不要使用它来绘制,也不要存储它(一旦控件重新绘制,它将无效-这种情况经常发生)。始终使用提供的图形对象(如PaintEventArgs)在重写的
OnPaint()
方法或绘制事件处理程序(或DrawItem和friends)中绘制。另一个重要用途是绘制非持久性的内容,如橡皮筋线或矩形等。。
using System;
using System.Drawing;
using System.Windows.Forms;

namespace Outlines {

    public partial class Form1 : Form {

        public MyPictureBox MPB;

        public Form1() {
            InitializeComponent();
            MPB = new MyPictureBox("Benny.png");
            this.Controls.Add(MPB);
        }

        private void Form1_Load(object sender, EventArgs e) {
            Console.WriteLine("Form1:Load");
        }

        protected override void OnResizeEnd(EventArgs e) {
            Console.WriteLine("Form1:ResizeEnd");
            base.OnResizeEnd(e);
            MPB.Size = new Size(this.ClientRectangle.Width, this.ClientRectangle.Height);
            this.Invalidate(true);
        }

        protected override void OnClick(EventArgs e) {
            Console.WriteLine("Form1:OnClick");
            base.OnClick(e);
            this.Invalidate(true);
        }

        protected override void OnPaint(PaintEventArgs e) {
            Console.WriteLine("Form1:OnPaint");
            base.OnPaint(e);
        }

    }

    public class MyPictureBox : PictureBox {

        private Bitmap _bitmap;

        public MyPictureBox(string pathName) {
            _bitmap = new Bitmap(pathName);
            this.Size = new Size(500, 500);
            this.Enabled = true;
            this.Visible = true;
        }

        protected override void OnPaint(PaintEventArgs pe) {
            Console.WriteLine("MPB:OnPaint");
            base.OnPaint(pe);
            var graphics = this.CreateGraphics();
            graphics.Clear(Color.Gray);
            if (_bitmap == null)
                return;
            graphics.DrawImage(_bitmap, new Point(0, 0));
            graphics.Dispose();
        }

        protected override void OnResize(EventArgs e) {
            Console.WriteLine("MPB:OnResize");
            base.OnResize(e);
        }

    }

}