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

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

发布时间:2020-12-15 05:51:41 所属栏目:百科 来源:网络整理
导读:最近在做卡片视图的程序,要求将控件做成带有圆角的效果,下面是我在网上查找的资料,经过测试,确定可以实现功能。其中方法三既适应于控件,也适应于窗体。 先上传效果图: 方法一: 增加命名空间:using System.Drawing.Drawing2D; 添加方法如下:当然各角的

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

先上传效果图:

方法一:

增加命名空间: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,
            new Point(sender.Width,sender.Height - sender.Height / 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,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,this.Width - 3,this.Height - 2);
            EndPath(dc);
            region = PathToRegion(dc);
            SetWindowRgn(this.Handle,region,false);
        }

(编辑:李大同)

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

    推荐文章
      热点阅读