Проблема с рисованием в WinForms (что я пропускаю) - PullRequest
0 голосов
/ 19 марта 2019

Когда я запускаю следующий код, изображение, загруженное в объект MyPictureBox, кратковременно мигает, но затем форма немедленно перезаписывается стандартным цветом фона Windows.

  • Я получаю сообщения в правильном порядке.
  • Я попытался удалить все базы. 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);
        }

    }

}

1 Ответ

1 голос
/ 19 марта 2019

Не создавайте новый графический объект внутри метода OnPaint;используйте тот, который указан в аргументе PaintEvents.Как @Jimi указывает выше ...

Control.CreateGraphics ();используется в определенных, определенных ситуациях (в основном для измерения материала).Не используйте его для рисования и никогда не сохраняйте его (он станет недействительным, как только элемент управления будет перекрашен - это происходит постоянно).Всегда рисуйте в переопределенном методе OnPaint () или обработчике события Paint (или DrawItem и друзья), используя предоставленный объект Graphics (как PaintEventArgs).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...