Как я могу дистиллировать панель в C#?

Эй, я должен сделать свой рисунок по панели в C#, но не помещая мой код для прорисовки внутри "panel1_Paint", как я могу сделать это?? BTW, я использую WinForms.

Обновление: Я забыл ясно давать понять что-то, я не должен помещать свой код для прорисовки в обработчике красок, потому что я должен начать тянуть в зависимости от событий кнопок.

6
задан Lisa 9 April 2010 в 23:51
поделиться

2 ответа

Обычно вы делаете все свои рисунки в обработчике событий рисования. Если вы хотите выполнить какое-либо обновление (например, если пользователь нажимает на панель), вы должны отложить это действие: вы сохраняете необходимые данные (координаты, где пользователь щелкнул) и принудительно перерисовываете элемент управления. Это приводит к срабатыванию события рисования, в котором вы можете рисовать то, что сохранили ранее.

Другой способ (если вы действительно хотите рисовать за пределами обработчика событий 'panel1_Paint') рисовать внутри буферного изображения и копировать изображение в графический объект управления в обработчике событий рисования.

Обновление:

Пример:

public class Form1 : Form
{
    private Bitmap buffer;

    public Form1()
    {
        InitializeComponent();

        // Initialize buffer
        panel1_Resize(this, null);
    }

    private void panel1_Resize(object sender, EventArgs e)
    {
        // Resize the buffer, if it is growing
        if (buffer == null || 
            buffer.Width < panel1.Width || 
            buffer.Height < panel1.Height)
        {
            Bitmap newBuffer = new Bitmap(panel1.Width, panel1.Height);
            if (buffer != null)
                using (Graphics bufferGrph = Graphics.FromImage(newBuffer))
                    bufferGrph.DrawImageUnscaled(buffer, Point.Empty);
            buffer = newBuffer;
        }
    }

    private void panel1_Paint(object sender, PaintEventArgs e)
    {
        // Draw the buffer into the panel
        e.Graphics.DrawImageUnscaled(buffer, Point.Empty);
    }



    private void button1_Click(object sender, EventArgs e)
    {
        // Draw into the buffer when button is clicked
        PaintBlueRectangle();
    }

    private void PaintBlueRectangle()
    {
        // Draw blue rectangle into the buffer
        using (Graphics bufferGrph = Graphics.FromImage(buffer))
        {
            bufferGrph.DrawRectangle(new Pen(Color.Blue, 1), 1, 1, 100, 100);
        }

        // Invalidate the panel. This will lead to a call of 'panel1_Paint'
        panel1.Invalidate();
    }
}

Теперь нарисованные изображения не будут потеряны даже после перерисовки элемента управления, поскольку он только вытягивает буфер (изображение, сохраненное в памяти). Кроме того, вы можете рисовать вещи в любое время, когда происходит событие,просто рисуя в буфер.

13
ответ дан 8 December 2019 в 17:19
поделиться

Попробуйте следующее: что произойдет, когда вы вернетесь в свое приложение после использования другого приложения, которое закрывает часть или все ваше окно ?

Что вам нужно сделать, так это отрисовать то, что вам нужно, во внеэкранном растровом изображении, называемом буфером. Вы будете визуализировать изображение, когда захотите, в ответ на все, что меняет то, что изображение должно отображать. Затем из события рисования панели вы скопируете из этого буфера на панель.

Графическое программирование - это очень весело. Может показаться, что нужно учесть много деталей, но их не так много, как только вы их узнаете. Но это та область, где небрежный подход проявится и может сделать приложение очень ненадежным и непрофессиональным.

1
ответ дан 8 December 2019 в 17:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: