加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何在C#中绘制面板?

发布时间:2020-12-15 18:01:17 所属栏目:百科 来源:网络整理
导读:嘿,我需要在C#的面板上绘图,但是没有将我的绘图代码放在“panel1_Paint”中,我怎么能这样做? 顺便说一下,我正在使用WinForms. 更新:我忘记了清楚,我不需要将绘图代码放在绘图处理程序中,因为我需要根据按钮的事件开始绘图. 解决方法 通常,您在绘图事件处理
嘿,我需要在C#的面板上绘图,但是没有将我的绘图代码放在“panel1_Paint”中,我怎么能这样做?
顺便说一下,我正在使用WinForms.

更新:我忘记了清楚,我不需要将绘图代码放在绘图处理程序中,因为我需要根据按钮的事件开始绘图.

解决方法

通常,您在绘图事件处理程序中执行所有绘图.如果要进行任何更新(例如,如果用户单击面板),则必须推迟该操作:存储所需数据(用户单击的坐标)并强制重绘控件.这会导致paint事件被触发,然后您可以在其中绘制之前存储的内容.

另一种方法是(如果你真的想在’panel1_Paint’事件处理程序之外绘制)在缓冲区图像中绘制,并将图像复制到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,100,100);
        }

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

现在绘制的图像即使在重绘控件之后也不会丢失,因为它只绘制缓冲区(图像,保存在内存中).此外,只需绘制到缓冲区中,您就可以在事件发生时随时绘制内容.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读