[编程相关] Winform窗体圆角以及描边完美解决方案
作者:CC下载站 日期:2024-03-29 09:16:50 浏览:3 分类:编程开发
圆角
项目中需要把窗体的四角改为圆角,winform窗体的圆角不是很好设置或者说绘制。在网上查找了很多方案,最终找到了一种完美解决方案。
在网上资料中常用的是都是重绘窗体四角。但是采用的方式不一样最后的效果也不一样同时代码量带来的体力劳动也是不一样的。
第一种方案:重写OnPaint或者再窗体的Paint事件中实现重绘。
这种方案有一个明显的缺点是软件运行时会引起窗体的闪烁,这种方案绘制的圆角有一定的纹刺,圆角不光滑。
第二种方案:采用Win32 API重绘
这种方案是比较完美的方案,没有方案一中的缺点。代码如下。
public partial class FrmLogin : Form, ILoginView { private ILog _log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); public FrmLogin() { InitializeComponent(); Load += FrmLogin_Load; SetFormRoundRectRgn(this, 5); //设置圆角 } private void FrmLogin_Load(object sender, EventArgs e) { this.BackColor = ColorTranslator.FromHtml("#FF5DB3AB"); //171, 179, 93 BackgroundImage = ImageHelper.GetImage("Login\login_bg.png"); }}
/// <summary> /// 设置窗体的圆角矩形 /// </summary> /// <param name="form">需要设置的窗体</param> /// <param name="rgnRadius">圆角矩形的半径</param> public static void SetFormRoundRectRgn(Form form, int rgnRadius) { int hRgn = 0; hRgn = Win32.CreateRoundRectRgn(0, 0, form.Width + 1, form.Height + 1, rgnRadius, rgnRadius); Win32.SetWindowRgn(form.Handle, hRgn, true); Win32.DeleteObject(hRgn); }
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; namespace UClass.View.Login { public class Win32 { #region Window Const public const int WM_ERASEBKGND = 0x0014; public const int WM_LBUTTONDOWN = 0x0201; public const int WM_LBUTTONUP = 0x0202; public const int WM_LBUTTONDBLCLK = 0x0203; public const int WM_WINDOWPOSCHANGING = 0x46; public const int WM_PAINT = 0xF; public const int WM_CREATE = 0x0001; public const int WM_ACTIVATE = 0x0006; public const int WM_NCCREATE = 0x0081; public const int WM_NCCALCSIZE = 0x0083; public const int WM_NCPAINT = 0x0085; public const int WM_NCACTIVATE = 0x0086; public const int WM_NCLBUTTONDOWN = 0x00A1; public const int WM_NCLBUTTONUP = 0x00A2; public const int WM_NCLBUTTONDBLCLK = 0x00A3; public const int WM_NCMOUSEMOVE = 0x00A0; public const int WM_NCHITTEST = 0x0084; public const int HTLEFT = 10; public const int HTRIGHT = 11; public const int HTTOP = 12; public const int HTTOPLEFT = 13; public const int HTTOPRIGHT = 14; public const int HTBOTTOM = 15; public const int HTBOTTOMLEFT = 0x10; public const int HTBOTTOMRIGHT = 17; public const int HTCAPTION = 2; public const int HTCLIENT = 1; public const int WM_FALSE = 0; public const int WM_TRUE = 1; #endregion #region Public extern methods [DllImport("gdi32.dll")] public static extern int CreateRoundRectRgn(int x1, int y1, int x2, int y2, int x3, int y3); [DllImport("user32.dll")] public static extern int SetWindowRgn(IntPtr hwnd, int hRgn, Boolean bRedraw); [DllImport("gdi32.dll", EntryPoint = "DeleteObject", CharSet = CharSet.Ansi)] public static extern int DeleteObject(int hObject); [DllImport("user32.dll")] public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam); [DllImport("user32.dll")] public static extern bool ReleaseCapture(); #endregion } }
窗体和控件描边
实现思路:在现有的窗体和控件的基础之上画一个比原来窗体和控件范围大1的矩形,描边的宽度和颜色可以通过pen设置。具体代码如下
private void FrmFirstView_Paint(object sender, PaintEventArgs e) { ControlBorder_Paint(sender,e.Graphics,ColorTranslator.FromHtml("#D1D1D1")); }
private void ControlBorder_Paint(object sender, Graphics g, Color color) { Pen pen = new Pen(Color.FromArgb(255, color), 1f); foreach (System.Windows.Forms.Control ctr in this.pnlContent.Controls) { if (ctr is Control.Controls.TextBoxs.TextBoxEx || ctr is ComboBox) { g.DrawRectangle(pen, new Rectangle(new Point(ctr.Location.X - 1, ctr.Location.Y - 1), new Size(ctr.Size.Width + 1, ctr.Size.Height + 1))); } } pen.Dispose(); }
猜你还喜欢
- 03-29 [编程相关] Winform窗体圆角以及描边完美解决方案
- 03-29 [前端问题] has been blocked by CORS policy跨域问题解决
- 03-29 [编程相关] GitHub Actions 入门教程
- 03-29 [编程探讨] CSS Grid 网格布局教程
- 10-12 [编程相关] python实现文件夹所有文件编码从GBK转为UTF8
- 10-11 [编程算法] opencv之霍夫变换:圆
- 10-11 [编程算法] OpenCV Camshift算法+目标跟踪源码
- 10-11 [Python] python 创建 Telnet 客户端
- 10-11 [编程相关] Python 基于 Yolov8 + CPU 实现物体检测
- 03-15 [脚本工具] 使用go语言开发自动化脚本 - 一键定场、抢购、预约、捡漏
- 01-08 [编程技术] 秒杀面试官系列 - Redis zset底层是怎么实现的
- 01-05 [编程技术] 《Redis设计与实现》pdf
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[实用工具] 语音叫号器
[书籍] 通玄断易大全 [上、中、下] [全][PDF]
[美食] 老北京特色烤鸭为什么如此出名?美味在哪里呢?
[美食] 抓住春天长高好时机,多给孩子喝6种“助长汤”,补钙发育长高个
[涨姿势] 餐饮管理故事:对不起,我订错了雅间,怎么办?(附解决方案)
[美食] 冰滴咖啡还能这样做?教你在家自制“冰滴壶”~
[美食] 春天多吃糯米好处多,教你8个神仙吃法,一补气色,二健脾又养胃
[音乐] 群星 - 国语经典101(6CD)【16bit 44.1kHZ Flac】
[文章资料] 知乎文大合集(书单排行榜+付费文合集)
[远程管理] PuTTY中文版(linux远程工具SSH客户端)0.81
[资料] [大学期末救急课] 猴博士+高斯课堂+斐多课堂,全集视频合集
[云资源] 价值2万元的老男孩Python教程
[书库] 史上最全摄影书推荐(附700本PDF版打包下载)
[云资源] 花了一千多元买的私人健身教程
[下载工具] Internet Download Manager 6.42.7 (IDM)
[影视] 灌篮高手 WEB-DL版下载/Slam Dunk/スラムダンク/灌篮高手:THE FIRST/灌篮高手电影版 2022 The First Slam Dunk 61.35G
[即时通讯] 腾讯QQ PC版9.7.22.29315去广告绿色纯净版
[开发环境] PhpStorm2023中文激活版v2023.3.3 正式版
[资料] 3000 套电影电视剧 LOGO 宣传片常用音效合集包
[安卓软件] 酷我音乐APP_v10.7.6.4 去广告破解豪华VIP版
[云资源] 价值2万元的老男孩Python教程
[影视] 灌篮高手 WEB-DL版下载/Slam Dunk/スラムダンク/灌篮高手:THE FIRST/灌篮高手电影版 2022 The First Slam Dunk 61.35G
[云资源] 花了一千多元买的私人健身教程
[书库] 史上最全摄影书推荐(附700本PDF版打包下载)
[资料] 抗战阵亡将士资料+续编
[电视剧] 三体 (2024) 全8集 网飞版本 中文字幕 合集
[剧集] 繁花 (2023)[全30集][打包]
[影视] 三大队 WEB-DL版下载/Endless Journey/请转告局长,三大队任务完成了 2023 三大队 6.7G
[纪录片] 河西走廊【10集 国语 中文字幕 1080P 10.8G MP4】
[安卓软件] OfficeSuite中文版APP v14.2.50872.0破解版
- 最新评论
-
谢谢楼主xiaoqi 评论于:04-12 勿在线解压,勿手机解压,请在电脑上用最新款压缩软件解压!推荐360压缩或者好压CC下载站 评论于:04-10 无法解压啊,客服能不能给个解压教程ravengrey 评论于:04-10 谢谢支持!!CC下载站 评论于:03-26 很棒的资源,感谢分享云体风身 评论于:03-26 感谢分享,好东西云体风身 评论于:03-26 谢谢支持!CC下载站 评论于:03-14 央视精品,感谢付出提供。qwer9009 评论于:03-14 谢谢支持!!!CC下载站 评论于:03-13 谢谢分享!Ypc9182 评论于:03-12
- 热门tag