Winforms吸引了问题(我缺少什么明显的事情)



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

  • 我以正确的顺序收到消息。
  • 我尝试删除每个base.onpaint(),但这无法解决。
  • 我尝试了双缓冲区;没想到它会改变任何东西,也没有。

我知道我缺少一些很明显的东西。(P.S.该表格除了我添加的mypicturebox以外没有其他控件。)

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

不要在OnPaint方法内创建新的图形对象;使用PaintEvents参数中提供的一种。正如@jimi指出的那样...

Control.CREATEGRAPHICS();用于特定的,定义的情况(主要是用于测量内容)。不要使用它来绘制,也不要存储它(一旦对控件重新粉刷,它将不断发生 - 这种情况会不断发生)。始终使用提供的图形对象(如PaintEventargs)中的覆盖onpaint()方法或油漆事件处理程序(或drawitem and Friends)绘制。

相关内容

  • 没有找到相关文章

最新更新