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, 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); 方法二: 复制代码 代码如下: 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; dc = GetDC(this.Handle); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |