Как я могу нарисовать над панелью в C #? - PullRequest
6 голосов
/ 10 апреля 2010

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

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

Ответы [ 2 ]

13 голосов
/ 10 апреля 2010

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

Другим способом (если вы действительно хотите рисовать вне обработчика события '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();
    }
}

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

1 голос
/ 10 апреля 2010

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

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

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

...