C# 开发圆角控件(窗体)的具体实现

 更新时间:2014年02月28日 15:45:01   作者:  
这篇文章主要介绍了C# 开发圆角控件的具体实现,需要的朋友可以参考下

最近在做卡片视图的程序,要求将控件做成带有圆角的效果,下面是我在网上查找的资料,经过测试,确定可以实现功能。其中方法三既适应于控件,也适应于窗体。

先上传效果图:

方法一:

增加命名空间:using System.Drawing.Drawing2D; 
添加方法如下:当然各角的点可根据需要确定.

复制代码 代码如下:

private void Type(Control sender, int p_1, double p_2)
        {
            GraphicsPath oPath = new GraphicsPath();
            oPath.AddClosedCurve(
                new Point[] {
            new Point(0, sender.Height / p_1),
            new Point(sender.Width / p_1, 0),
            new Point(sender.Width - sender.Width / p_1, 0),
            new Point(sender.Width, sender.Height / p_1),
            new Point(sender.Width, sender.Height - sender.Height / p_1),
            new Point(sender.Width - sender.Width / p_1, sender.Height),
            new Point(sender.Width / p_1, sender.Height),
            new Point(0, sender.Height - sender.Height / p_1) },

                (float)p_2);

            sender.Region = new Region(oPath);
        }

在窗体的paint和resize事件中增加:Type(this,20,0.1); 
参数20和0.1也可以根据自己的需要调整到最佳效

方法二:

复制代码 代码如下:

public void SetWindowRegion()
        {

            System.Drawing.Drawing2D.GraphicsPath FormPath;

            FormPath = new System.Drawing.Drawing2D.GraphicsPath();

            Rectangle rect = new Rectangle(0, 22, this.Width, this.Height - 22);//this.Left-10,this.Top-10,this.Width-10,this.Height-10);                

            FormPath = GetRoundedRectPath(rect, 30);

            this.Region = new Region(FormPath);

        }

        private GraphicsPath GetRoundedRectPath(Rectangle rect, int radius)
        {

            int diameter = radius;

            Rectangle arcRect = new Rectangle(rect.Location, new Size(diameter, diameter));

            GraphicsPath path = new GraphicsPath();

            //   左上角  

            path.AddArc(arcRect, 180, 90);

            //   右上角  

            arcRect.X = rect.Right - diameter;

            path.AddArc(arcRect, 270, 90);

            //   右下角  

            arcRect.Y = rect.Bottom - diameter;

            path.AddArc(arcRect, 0, 90);

            //   左下角  

            arcRect.X = rect.Left;

            path.AddArc(arcRect, 90, 90);

            path.CloseFigure();

            return path;

        }


在窗体的resize事件中增加:SetWindowRegion(); 

方法三:通过Window系统API行数,修改控件和窗体为椭圆形状。代码如下所示:

复制代码 代码如下:

[System.Runtime.InteropServices.DllImport("gdi32")]
        private static extern IntPtr BeginPath(IntPtr hdc);
        [System.Runtime.InteropServices.DllImport("gdi32")]
        private static extern int SetBkMode(IntPtr hdc, int nBkMode);
        const int TRANSPARENT = 1;
        [System.Runtime.InteropServices.DllImport("gdi32")]
        private static extern IntPtr EndPath(IntPtr hdc);
        [System.Runtime.InteropServices.DllImport("gdi32")]
        private static extern IntPtr PathToRegion(IntPtr hdc);
        [System.Runtime.InteropServices.DllImport("gdi32")]
        private static extern int Ellipse(IntPtr hdc, int x1, int y1, int x2, int y2);
        [System.Runtime.InteropServices.DllImport("user32")]
        private static extern IntPtr SetWindowRgn(IntPtr hwnd, IntPtr hRgn, bool bRedraw);
        [System.Runtime.InteropServices.DllImport("user32")]
        private static extern IntPtr GetDC(IntPtr hwnd);

复制代码 代码如下:

protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);

            IntPtr dc;
            IntPtr region;

            dc = GetDC(this.Handle);
            BeginPath(dc);
            SetBkMode(dc, TRANSPARENT);
            Ellipse(dc, 0, 0, this.Width - 3, this.Height - 2);
            EndPath(dc);
            region = PathToRegion(dc);
            SetWindowRgn(this.Handle, region, false);
        }

相关文章

  • C#并发实战记录之Parallel.ForEach使用

    C#并发实战记录之Parallel.ForEach使用

    这篇文章主要给大家介绍了关于C#并发实战记录之Parallel.ForEach使用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • C#判断指定分区是否是ntfs格式的方法

    C#判断指定分区是否是ntfs格式的方法

    这篇文章主要介绍了C#判断指定分区是否是ntfs格式的方法,涉及C#中DriveFormat属性的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • C#使用oledb导出数据到excel的方法

    C#使用oledb导出数据到excel的方法

    这篇文章主要介绍了C#使用oledb导出数据到excel的方法,结合实例形式分析了C#操作oledb导出数据的相关技巧与注意事项,需要的朋友可以参考下
    2016-06-06
  • C#生成exe可执行文件的常用方法

    C#生成exe可执行文件的常用方法

    这篇文章主要介绍了C#生成exe可执行文件的两种常用方法,通过图文结合的方式讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-07-07
  • C#编程调用Cards.dll实现图形化发牌功能示例

    C#编程调用Cards.dll实现图形化发牌功能示例

    这篇文章主要介绍了C#编程调用Cards.dll实现图形化发牌功能,结合实例形式分析了C#动态链接库调用及图形操作技巧,需要的朋友可以参考下
    2017-06-06
  • 深入了解c#多线程编程

    深入了解c#多线程编程

    这篇文章主要介绍了c#多线程编程的相关资料,文中讲解非常细致,帮助大家更好的理解和学习c# 多线程,感兴趣的朋友可以了解下
    2020-08-08
  • C#利用雪花算法实现生成ID工具类

    C#利用雪花算法实现生成ID工具类

    雪花算法表示生成的ID如雪花般独一无二,该算法源自Twitter,主要用于解决分布式系统的唯一Id生成问题,本文主要介绍了C#如何利用利用雪花算法实现生成ID,需要的可以参考下
    2023-12-12
  • C#开发WinForm清空DataGridView控件绑定的数据

    C#开发WinForm清空DataGridView控件绑定的数据

    本文详细讲解了C#开发WinForm清空DataGridView控件绑定数据的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • C#简单嵌套flash读取数据的实现代码

    C#简单嵌套flash读取数据的实现代码

    这篇文章主要介绍了C#简单嵌套flash读取数据的实现代码,有需要的朋友可以参考一下
    2013-11-11
  • c#简单读取文本的实例方法

    c#简单读取文本的实例方法

    c#简单读取文本的实例方法,需要的朋友可以参考一下
    2013-04-04

最新评论