WinForm删除边框、圆角边框

  • WinForm删除边框

WinForm删除边框

最近使用WinForm做界面美化,需要修改边框样式,但是原生控件边框样式难以扩展。上网没有搜到满意的边框样式修改资料,自行解决后记录下。

主要代码如下

protected override void WndProc(ref System.Windows.Forms.Message m)
{//重绘消息WM_PAINTif (m.Msg == 0xF){base.WndProc(ref m);//获取设备环境IntPtr hDC = GetWindowDC(m.HWnd);if (hDC != IntPtr.Zero){//获取画布Graphics g = Graphics.FromHdc(hDC);//消锯齿g.SmoothingMode = SmoothingMode.AntiAlias;//边框路径GraphicsPath borderPath = CreateBorderPath(new Rectangle(0, 0, this.Width - 1, this.Height - 1), Radius * 2);   //新边框路径borderPath.AddRectangle(new Rectangle(0, 0, this.Width - 1, this.Height - 1));  //原边框路径borderPath.CloseAllFigures();   //封闭路径//使用背景色覆盖边框区域g.DrawPath(new Pen(BackColor), borderPath); //覆盖边框g.FillPath(new SolidBrush(BackColor), borderPath);  //覆盖边框包含区域//绘制新边框、如果只是删除边框的话,不绘制即可g.DrawPath(new Pen(CurrentBorderColor), CreateBorderPath(new Rectangle(0, 0, this.Width - 1, this.Height - 1), Radius * 2));g.Dispose();ReleaseDC(m.HWnd, hDC);}}else{base.WndProc(ref m);}
}

基本思想就是在界面重绘后,使用背景色覆盖边框区域,再重新绘制边框。下面是以此实现的圆角时间选择控件,以供参考

public class RoundedDateTimePicker : DateTimePicker
{/// <summary>/// 当前边框颜色/// </summary>private Color CurrentBorderColor;/// <summary>/// 边框颜色/// </summary>public Color BorderColor { get; set; } = Color.FromArgb(230, 230, 230);/// <summary>/// 边框颜色_鼠标进入控件/// </summary>public Color EnterBorderColor { get; set; } = Color.FromArgb(0, 0, 0);/// <summary>/// 边框颜色_获取焦点/// </summary>public Color FocusBorderColor { get; set; } = Color.FromArgb(62, 123, 250);/// <summary>/// 边框圆角半径/// </summary>public int Radius { get; set; } = 8;public RoundedDateTimePicker(){InitializeComponent();this.CurrentBorderColor = this.BorderColor;}protected override void WndProc(ref System.Windows.Forms.Message m){//重绘消息WM_PAINTif (m.Msg == 0xF){base.WndProc(ref m);//获取设备环境IntPtr hDC = GetWindowDC(m.HWnd);if (hDC != IntPtr.Zero){//获取画布Graphics g = Graphics.FromHdc(hDC);//消锯齿g.SmoothingMode = SmoothingMode.AntiAlias;//边框路径GraphicsPath borderPath = CreateBorderPath(new Rectangle(0, 0, this.Width - 1, this.Height - 1), Radius * 2);   //新边框路径borderPath.AddRectangle(new Rectangle(0, 0, this.Width - 1, this.Height - 1));  //原边框路径borderPath.CloseAllFigures();   //封闭路径//使用背景色覆盖边框区域g.DrawPath(new Pen(BackColor), borderPath); //覆盖边框g.FillPath(new SolidBrush(BackColor), borderPath);  //覆盖边框包含区域//绘制新边框g.DrawPath(new Pen(CurrentBorderColor), CreateBorderPath(new Rectangle(0, 0, this.Width - 1, this.Height - 1), Radius * 2));g.Dispose();ReleaseDC(m.HWnd, hDC);}}else{base.WndProc(ref m);}}[DllImport("User32.dll")]private static extern IntPtr GetWindowDC(IntPtr hWnd);[DllImport("User32.dll")]private static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);private void InitializeComponent(){this.SuspendLayout();// // RoundedDateTimePicker// this.Enter += new System.EventHandler(this.OnEntered);this.Leave += new System.EventHandler(this.OnLeft);this.MouseEnter += new System.EventHandler(this.OnMouseEntered);this.MouseLeave += new System.EventHandler(this.OnMouseLeft);this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.OnMouseMove);this.ResumeLayout(false);}private GraphicsPath CreateBorderPath(Rectangle rect, int diameter){GraphicsPath path = new GraphicsPath();path.AddArc(rect.Left, rect.Top, diameter, diameter, 180, 90);path.AddLine(rect.Left + diameter, rect.Top, rect.Right - diameter, rect.Top);path.AddArc(rect.Right - diameter, rect.Top, diameter, diameter, 270, 90);path.AddLine(rect.Right, rect.Top + diameter, rect.Right, rect.Bottom - diameter);path.AddArc(rect.Right - diameter, rect.Bottom - diameter, diameter, diameter, 0, 90);path.AddLine(rect.Right - diameter, rect.Bottom, rect.Left + diameter, rect.Bottom);path.AddArc(rect.Left, rect.Bottom - diameter, diameter, diameter, 90, 90);path.AddLine(rect.Left, rect.Bottom - diameter, rect.Left, rect.Top + diameter);path.CloseAllFigures();return path;}private void RefreshBorder(){if (this.Focused)this.CurrentBorderColor = FocusBorderColor;else if (this.RectangleToScreen(this.ClientRectangle).Contains(MousePosition))this.CurrentBorderColor = EnterBorderColor;elsethis.CurrentBorderColor = BorderColor;}private void OnMouseEntered(object sender, EventArgs e){this.RefreshBorder();}private void OnMouseLeft(object sender, EventArgs e){this.RefreshBorder();}private void OnEntered(object sender, EventArgs e){this.RefreshBorder();}private void OnLeft(object sender, EventArgs e){this.RefreshBorder();}private void OnMouseMove(object sender, MouseEventArgs e){this.RefreshBorder();}
}

WinForm删除边框、圆角边框相关推荐

  1. QGroupBox 显示边框 圆角边框 linux环境

    QGroupBox{ border-width:2px; border-style:solid; border-radius: 10px; border-color:gray; margin-top: ...

  2. Flutter学习笔记-使用decoration对Container装饰边框(圆角边框)

  3. css圆角框四周阴影,css3圆角边框,边框阴影

    border-radius向元素添加圆角边框,css3中的.IE9+ chrome safari5+ firefox4+ 现在都支持.可以向input div等设置边框.与border相似,可以四个角 ...

  4. html网页中圆角边框的编写,Html实现边框圆角的实例详解

    这篇文章主要为大家详细介绍了html轻松实现圆角矩形的方法,告诉大家如何通过p+css以及定位来实现圆角矩形?感兴趣的小伙伴们可以参考一下 问题:如何通过p+css以及定位来实现圆角矩形? 解决方法概 ...

  5. html圆角边框怎么做,CSS圆角边框制作指南与实例

    使用 CSS 制作圆角边框可能是网页前端设计师们最头痛的问题之一. 圆角边框看似简单, 但实现起来却很不简单, 可能需要复杂的页面结构或大量的边角图片, 方法很多, 但无论哪一种都是难以维护的. CS ...

  6. 一个常用的自定义弹框封装(适配 AndroidX),加载 ProgressDialog,状态显示的 StatusDialog 和自定义 Toast,全部支持背景颜色,圆角,边框和文字的自定义,构建者模

    MNProgressHUD 项目地址:maning0303/MNProgressHUD  简介: 一个常用的自定义弹框封装(适配 AndroidX),加载 ProgressDialog,状态显示的 S ...

  7. CSS盒子模型(border、padding、margin、圆角边框、盒子阴影、文字阴影、新闻列表综合案例、新浪导航栏案例)

    1. 网页布局的本质 首先利用CSS设置好盒子的大小,然后摆放盒子的位置. 最后把网页元素比如文字图片等等,放入盒子里面. 以上两步 就是网页布局的本质 2. 盒子模型(Box Model) 盒子模型 ...

  8. html圆角边框只有左边,border-radius以外的CSS圆角边框制作方法

    CSS3的border-radius利用DIV+CSS生成圆角边框,在很多情况下都会用到,目前DIV+CSS的圆角边框,一种是利用CSS3,一种是利用布局模拟出圆角. 先说第一种,利用CSS3,前提是 ...

  9. Border-radius属性--设置圆角边框

    border-radius:该属性允许您为元素添加圆角边框! div {border:2px solid;border-radius:25px; -moz-border-radius:25px; /* ...

最新文章

  1. SQL Server各种日期计算方法
  2. rbac 一个用户对应多个账号_电商后台系统:管理后台之账号管理(一)
  3. Android教程之android数据库编程
  4. Material Design控件使用学习 TabLayout+SwipeRefreshlayout
  5. 信息系统项目管理师-信息文档与配置管理核心知识点思维脑图
  6. LRU原理及其实现(C++)
  7. ajax提交手机号去数据库验证并返回状态值
  8. ethtool如何让接口闪灯_如何解决专业家庭影院与卡拉OK的声学问题?
  9. C语言课后习题(19)
  10. 前端开发中的调试技巧
  11. freecplus框架-文件操作
  12. Vue项目—请求函数的封装
  13. python中math.log注意点
  14. Objective-C 与JAVA的SHA1/HmacSHA1加密算法实现
  15. c语言寻找丑数,C语言程序设计100例之(14):丑数
  16. java 移动平均_移动平均(转载)
  17. Ubuntu安装apex教程
  18. [BX]、loop、inc、dec指令
  19. 不定高垂直居中的三种方法
  20. 怎么调用接口发国际验证码和通知短信?

热门文章

  1. CDH6.3.2离线安装教程——超级详细版-附带安装包地址
  2. 名悦集团:新司机买第一辆车有哪些注意事项
  3. ikun必学!python 画一个简单的只因
  4. Python 练习实例100例—2
  5. c语言cad实验报告,1.电子线路CAD实验报告实验
  6. VBA: 什么是多维数组:从4维数组说起。兼3维数组和数组嵌套的区别
  7. java code review 工具_两款好用的代码Review工具 | 学步园
  8. adb interface找不到驱动程序_打印机驱动程序无法使用怎么办 打印机驱动安装方法【介绍】...
  9. win8修复计算机u盘,联想一键恢复8.0专用WIN8PE
  10. ORB-SLAM2源码笔记(1)——框架结构