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

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

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

2 ответов


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

другим способом было бы (если вы действительно хотите рисовать вне обработчика событий panel1_Paint) рисовать внутри буферизуйте изображение и скопируйте его в объект controls graphics в обработчике событий 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();
    }
}

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


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

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

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