C# Winform实现在Pancel上绘制矩形

 更新时间:2025年01月26日 10:09:23   作者:VipSoft  
在C#的WinForms应用程序中,Panel控件本身不直接支持绘图功能,但可以通过在Panel上覆盖OnPaint方法或者使用Graphics对象来在Panel上绘制图形,下面我们就来看看具体实现方法吧

在C#的WinForms应用程序中,Panel控件本身不直接支持绘图功能,因为它不是一个绘图控件。不过,你可以通过在Panel上覆盖(override)OnPaint方法或者使用Graphics对象来在Panel上绘制图形。下面是如何实现这两种方法的示例:

方法1:覆盖OnPaint方法

可以通过重写Panel的OnPaint方法来绘制图形。这种方法允许你在每次需要重绘时调用自定义的绘图代码。

namespace VipSoft.ClientForm
{
    public partial class DemoFrm : Form
    {
        public DemoFrm()
        {
            InitializeComponent();
        }

        private void Demo_Load(object sender, EventArgs e)
        {
            ChartControl pnlControl = new ChartControl();
            pnlControl.Dock = DockStyle.Fill;
            pnlControl.Size = new Size(this.Width, this.Height);
            pnlControl.DrawChart();
            pnlDemo.Controls.Add(pnlControl);
        }
    }
}



public partial class ChartControl : UserControl
{
    public ChartControl()
    {
        DrawGrids();
    }
	
     //绘制网格
    private void DrawGrids()
    {
        //先加的控件,显示在最外面
        this.Controls.Add(new Label()
        {
            AutoSize = true,
            Top = 10,
            Left = 20,
            Text = "asdf",
            ForeColor = Color.BlueViolet,
            Font = new System.Drawing.Font("宋体", 36F)
        });


        this.BackColor = Color.Red; 
        Panel pnlGrid = new Panel();
        //pnlGrid.BackColor = Color.Green;
        pnlGrid.Dock = DockStyle.Fill;
        pnlGrid.Paint += new PaintEventHandler(this.CustomPanel_Paint);
        this.Controls.Add(pnlGrid);
    }

    private void CustomPanel_Paint(object sender, PaintEventArgs e)
    {
        Graphics g = e.Graphics;
        // 示例:绘制一个红色的矩形
        g.FillRectangle(Brushes.Blue, 50, 50, 100, 100);
    }
}

效果如下 

方法2:使用Graphics对象直接绘制

如果你需要在代码中动态地在Panel上绘制,你可以通过访问Panel的CreateGraphics方法来获取一个Graphics对象,并使用它来绘制。但这种方法通常用于临时绘图或在窗体关闭前绘图,因为它依赖于窗体的当前状态。对于需要频繁重绘的场景,最好使用第一种方法。

private void DrawOnPanel(Panel panel)
{
    using (Graphics g = panel.CreateGraphics())
    {
        // 示例:绘制一个蓝色的椭圆
        g.FillEllipse(Brushes.Blue, 25, 25, 150, 100);
    }
}

使用双缓冲减少闪烁

为了减少绘图时的闪烁问题,你可以使用双缓冲技术。这可以通过在Panel上重写OnPaint方法时设置一个局部的位图缓冲区来实现。

private Bitmap offscreenBitmap; // 用于双缓冲的位图
private void CustomPanel_Paint(object sender, PaintEventArgs e)
{
    if (offscreenBitmap == null) // 初始化位图缓冲区
    {
        offscreenBitmap = new Bitmap(this.Width, this.Height);
    }
    using (Graphics g = Graphics.FromImage(offscreenBitmap)) // 使用位图创建Graphics对象
    {
        g.Clear(this.BackColor); // 清除背景色
        // 在这里绘制你的图形,例如:
        g.FillRectangle(Brushes.Green, 50, 50, 100, 100); // 示例:绘制一个绿色的矩形
    }
    e.Graphics.DrawImage(offscreenBitmap, Point.Empty); // 将位图绘制到控件上
}

效果如下

方法3:先画一个背景,再在它的基础上画其它

private void Demo_Load(object sender, EventArgs e)
{
    pnlDemo.Controls.Clear();

    EcgGridChartControl overviewControl = new EcgGridChartControl();
    overviewControl.Dock = DockStyle.Fill;
    overviewControl.DrawChart();
    overviewControl.Size=new Size(this.Width, this.Height);
    pnlDemo.Controls.Add(overviewControl);
}
public partial class ChartControl : UserControl
{

	protected override void OnLoad(EventArgs e)
	{
		DrawGrids();
	}

	//绘制网格
	private void DrawGrids()
	{
	    //先加的控件,显示在最外面
	    this.Controls.Add(new Label()
	    {
	        AutoSize = true,
	        Top = 10,
	        Left = 20,
	        Text = "asdf",
	        ForeColor = Color.BlueViolet,
	        Font = new System.Drawing.Font("宋体", 36F)
	    });


	    //this.BackColor = Color.LightSkyBlue;

	    //作为背景
	    Panel pnlGrid = new Panel();
	    //pnlGrid.BackColor = Color.Green;
	    pnlGrid.Dock = DockStyle.Fill;
	    pnlGrid.Paint += new PaintEventHandler(this.CustomPanel_Paint); 
	    this.Controls.Add(pnlGrid);

	    Panel pnlLine = new Panel();
	    pnlLine.BackColor = Color.Transparent;//将Panel设为透明
	    pnlLine.Dock = DockStyle.Fill;
	    pnlLine.Paint += new PaintEventHandler(this.CustomPanelBitmap_Paint);
	    pnlLine.Parent = picBox; //将panel父控件设为背景图片控件
	    pnlLine.BringToFront();//将panel放在前面

	    pnlGrid.Controls.Add(pnlLine);
	}

	private void CustomPanel_Paint(object sender, PaintEventArgs e)
	{
	    Graphics g = e.Graphics;

	    using (Pen pen = new Pen(Color.Black, 2))
	    {
	        g.DrawLine(pen, 10, 230, this.Width-10, 230); 
	    }
	}

	private Bitmap offscreenBitmap; // 用于双缓冲的位图
	private void CustomPanelBitmap_Paint(object sender, PaintEventArgs e)
	{
	    if (offscreenBitmap == null) // 初始化位图缓冲区
	    {
	        offscreenBitmap = new Bitmap(this.Width, this.Height);
	    }
	    using (Graphics g = Graphics.FromImage(offscreenBitmap)) // 使用位图创建Graphics对象
	    {
	        //g.Clear(this.BackColor); // 清除背景色
	        // 在这里绘制你的图形,例如:
	        g.FillRectangle(Brushes.Yellow, 200, 200, 100, 100); // 示例:绘制一个绿色的矩形
	    }
	    e.Graphics.DrawImage(offscreenBitmap, Point.Empty); // 将位图绘制到控件上
	}

}

效果如下

到此这篇关于C# Winform实现在Pancel上绘制矩形的文章就介绍到这了,更多相关C# Winform Pancel绘制矩形内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C# SESSION丢失问题的解决办法

    C# SESSION丢失问题的解决办法

    这篇文章主要为大家详细介绍了C# SESSION丢失问题的解决办法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • 详解C#如何使用消息队列MSMQ

    详解C#如何使用消息队列MSMQ

    消息队列 (MSMQ Microsoft Message Queuing)是MS提供的服务,也就是Windows操作系统的功能,下面就跟随小编一起了解一下C#中是如何使用消息队列MSMQ的吧
    2024-01-01
  • C# wpf Brush转Hex字符串的实例代码

    C# wpf Brush转Hex字符串的实例代码

    这篇文章主要介绍了C# wpf Brush转Hex字符串的实例代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • XAML如何获取元素的位置

    XAML如何获取元素的位置

    这篇文章主要为大家详细介绍了XAML如何获取元素的位置,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • C#实现Excel表数据导入Sql Server数据库中的方法

    C#实现Excel表数据导入Sql Server数据库中的方法

    这篇文章主要介绍了C#实现Excel表数据导入Sql Server数据库中的方法,结合实例形式详细分析了C#读取Excel表数据及导入Sql Server数据库的具体操作步骤与相关操作技巧,需要的朋友可以参考下
    2017-05-05
  • C#使用ping命令的两个例子

    C#使用ping命令的两个例子

    这篇文章主要介绍了C#使用ping命令的两个例子,本文给出了调用CMD命令和使用C# ping类的两个例子,需要的朋友可以参考下
    2014-08-08
  • 在多线程中调用winform窗体控件的实现方法

    在多线程中调用winform窗体控件的实现方法

    这篇文章主要介绍了在多线程中调用winform窗体控件的实现方法,需要的朋友可以参考下
    2014-08-08
  • C#图片切割、图片压缩、缩略图生成代码汇总

    C#图片切割、图片压缩、缩略图生成代码汇总

    这篇文章主要为大家汇总了C#图片切割、图片压缩、缩略图生成代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • C# 调用C++写的dll的实现方法

    C# 调用C++写的dll的实现方法

    C#调用C++的非托管类的dll其实很简单基本就是固定的调用格式,有需要的朋友可以参考一下
    2013-10-10
  • 基于C#实现电脑系统挂机锁

    基于C#实现电脑系统挂机锁

    这篇文章主要为大家详细介绍了如何利用C#实现电脑系统挂机锁,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12

最新评论