Рисование в двух картинных боксах

Andrian Babii спросил: 28 апреля 2018 в 09:04 в: c#

Я создал два pictureBoxes в приложении для форм Windows. Я хочу использовать оба из них, используя FillEllipse (), но по какой-то причине я могу рисовать только в первом pictureBox. Я верю, проблема в том, что я не понимаю, как работают события. Вот код:

public Form1()
    {
        InitializeComponent();
        pictureBox1.Paint += new PaintEventHandler(this.pictureBox1_Paint);
        pictureBox2.Paint += new PaintEventHandler(this.pictureBox2_Paint);
    }    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        Graphics gr = e.Graphics;
        Point p1 = pictureBox1.Location;
        gr.FillEllipse(new SolidBrush(Color.Red), new Rectangle(p1.X + 40, p1.Y + 40, 20, 20));
        gr.FillEllipse(new SolidBrush(Color.Red), new Rectangle(p1.X + 40, p1.Y + 80, 20, 20));
        gr.FillEllipse(new SolidBrush(Color.Red), new Rectangle(p1.X + 80, p1.Y + 40, 20, 20));
        gr.FillEllipse(new SolidBrush(Color.Red), new Rectangle(p1.X + 80, p1.Y + 80, 20, 20));
    }    private void pictureBox2_Paint(object sender, PaintEventArgs e)
    {
        Graphics br = e.Graphics;
        Point p2 = pictureBox2.Location;
        br.FillEllipse(new SolidBrush(Color.Red), new Rectangle(p2.X + 40, p2.Y + 40, 20, 20));
        br.FillEllipse(new SolidBrush(Color.Red), new Rectangle(p2.X + 40, p2.Y + 80, 20, 20));
        br.FillEllipse(new SolidBrush(Color.Red), new Rectangle(p2.X + 80, p2.Y + 40, 20, 20));
        br.FillEllipse(new SolidBrush(Color.Red), new Rectangle(p2.X + 80, p2.Y + 80, 20, 20));
    }

2 ответа

bixarrio ответил: 28 апреля 2018 в 09:28

Вы рисуете pictureBox2. Ваша проблема заключается в том, что вы рисуете за пределами области просмотра, потому что вы рисуете на месте размещения изображения в форме, но внутри рамки. pictureBox2.Location дает позицию поля в форме. Если это поле находится в положении x = 240, y = 240, вы нарисовываете INSIDE поле в этих положениях. Если ваша ячейка только w = 50, h = 50, вы не увидите, что вы рисуете, потому что она waaaay справа и внизу

user2091374 ответил: 28 апреля 2018 в 09:25

Итак, это действительно неэффективно, вы рисуете все дважды, в результате чего в два раза больше нагрузки. То, что вам нужно сделать, - разбить один раз на растровое изображение и загрузить растровое изображение в два окна изображений.

https://docs.microsoft.com/en-us/dotnet/framework/winforms/advanced/

Однако, если работа с растровыми изображениями не позволит вам достичь того, что вы пытаетесь сделать, напишите настраиваемый элемент управления. Хотя это не улучшит производительность, он будет по крайней мере прекращать дублирование кода.

https://docs.microsoft.com/en-us/dotnet/framework/winforms/controls/creating-a-wf -контроль-дизайн-временные характеристики

Bitmap img= new Bitmap(100, 100);
Point p1 = pictureBox1.Location;
Graphics gr = Graphics.FromImage(img);
gr.FillEllipse(new SolidBrush(Color.Red), new Rectangle(p1.X + 40, p1.Y + 40, 20, 20));
gr.FillEllipse(new SolidBrush(Color.Red), new Rectangle(p1.X + 40, p1.Y + 80, 20, 20));
gr.FillEllipse(new SolidBrush(Color.Red), new Rectangle(p1.X + 80, p1.Y + 40, 20, 20));picturebox1.Image = img;
picturebox2.Image = img;
TaW ответил: 28 апреля 2018 в 09:43
Это все неправильно. Вы упускаете проблему, и ваши советы в лучшем случае сомнительны, особенно. так как мы действительно недостаточно знаем о том, где OP хочет пойти.
user2091374 ответил: 28 апреля 2018 в 10:05
На основе предоставленной информации это лучший ответ, который я мог бы предоставить. Что касается "сомнительного" совета, можете ли вы расширить его, пожалуйста?