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. linux安装eclipse运行web,Linux安装Tomcat,运行Eclipse,web项目
  2. python2.7读写xls
  3. 数字经济时代,险企如何构建数字化经营体系实现突围?
  4. html fmt转换日期格式,js通用时间格式转换函数
  5. java中的集合和数组
  6. 段错误 php,如何解决php扩展出现段错误的问题
  7. 树莓派4B开机自动挂载移动硬盘,以及遇到the root account is locked问题
  8. Mysql密码加密方式
  9. linux命令应用大词典.pdf,Linux命令应用大词典
  10. 数据结构C语言版稀疏矩阵实验报告,数据结构稀疏矩阵基本运算实验报告..doc
  11. [Pa2013]Iloczyn
  12. html anki编辑器,打造你的专属单词本——Anki 初探(无痛入门)
  13. 如何快速掌握一门新的技术?
  14. 键盘定位板图纸_看看199的机械键盘可以有多酷
  15. 服务器维护表格,服务器维护表格
  16. 《我的野蛮女友》主题,乔治·温斯顿《卡农变奏曲》,帕卡贝尔的《D大调卡农》...
  17. Android --- IjkPlayer 阅读native层源码之解码成功后的音频数据如何发送回Android播放(九)
  18. 北极寒流带来《后天》享受(组图)零下50度美国城市成灾区出门都犯法
  19. C语言输入三个数字判断大小
  20. 腾讯宣布五年5000亿投入计划,发力新基建

热门文章

  1. tp5 批量更新多条记录_TP5数据库操作——更新
  2. 守护永恒服务器维护,3月27日0点-9点停服维护公告客户端更新
  3. PHP接入微信公众号(一)
  4. 计算机英语作文150字,英语作文150字
  5. 2022年最新MCN网红KOL报价(共200份)
  6. ESB集成系统,轻量级的企业总线平台
  7. centos6 搭建hdwiki
  8. Gerber投板详解--AD
  9. MySQL数据库数据对比工具——Mysqldbcompare
  10. BQ40Z80 7串电池应用方法