【C#】分享一个可灵活设置边框的Panel
---------------------------更新:2014-05-19---------------------------
优化了一下逻辑,就是既然可以通过设置BorderSide=None来不显示边框,那么再设计一个BorderMode.None就显得多余,即BorderMode枚举只需要2个元素即可(Single和ThreeD),而与其弄一个只有2个元素的枚举还不如干脆不要这个枚举,改为给PanelEx加一个布尔属性BorderIsSingleMode(之所以这样命名是考虑把与边框相关的属性都以Border开头,方便在设计器中使用),为true则代表单色模式,否则为三维模式,而显不显示、显示哪些边则完全交给BorderSide控制,同时把BorderSide的默认值设为None,即默认不显示边框。修改后的代码如下:
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms; namespace AhDung.Controls
{
/// <summary>
/// 可设置边框样式的Panel
/// </summary>
public class PanelEx : Panel
{
private Color borderColor;
private Border3DStyle border3DStyle;
private ToolStripStatusLabelBorderSides borderSide;
private bool borderIsSingleMode; [DefaultValue(true), Description("指定边框是否为单色模式。false代表三维模式")]
public bool BorderIsSingleMode
{
get { return borderIsSingleMode; }
set
{
if (borderIsSingleMode == value) { return; }
borderIsSingleMode = value;
this.Invalidate();
}
} [DefaultValue(typeof(Color), "Black"), Description("边框颜色。仅当边框为单色模式时有效")]
public Color BorderColor
{
get { return borderColor; }
set
{
if (borderColor == value) { return; }
borderColor = value;
this.Invalidate();
}
} [DefaultValue(Border3DStyle.Etched), Description("边框三维样式。仅当边框为三维模式时有效")]
public Border3DStyle Border3DStyle
{
get { return border3DStyle; }
set
{
if (border3DStyle == value) { return; }
border3DStyle = value;
this.Invalidate();
}
} //之所以不直接用Border3DSide是因为这货不被设计器支持,没法灵活选择位置组合
[DefaultValue(ToolStripStatusLabelBorderSides.None), Description("边框位置。可自由启用各个方位的边框")]
public ToolStripStatusLabelBorderSides BorderSide
{
get { return borderSide; }
set
{
if (borderSide == value) { return; }
borderSide = value;
this.Invalidate();
}
} public PanelEx()
{
this.borderIsSingleMode = true;
this.borderColor = Color.Black;
this.border3DStyle = System.Windows.Forms.Border3DStyle.Etched;
this.borderSide = ToolStripStatusLabelBorderSides.None;
} protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
if (this.BorderStyle != System.Windows.Forms.BorderStyle.None
|| BorderSide == ToolStripStatusLabelBorderSides.None)
{ return; } using (Graphics g = e.Graphics)
{
//单色模式
if (this.BorderIsSingleMode)
{
using (Pen pen = new Pen(BorderColor))
{
//若是四条边都启用,则直接画矩形
if (BorderSide == ToolStripStatusLabelBorderSides.All)
{
g.DrawRectangle(pen, , , this.Width - , this.Height - );
}
else //否则分别绘制线条
{
if ((BorderSide & ToolStripStatusLabelBorderSides.Top) == ToolStripStatusLabelBorderSides.Top)
{
g.DrawLine(pen, , , this.Width - , );
} if ((BorderSide & ToolStripStatusLabelBorderSides.Right) == ToolStripStatusLabelBorderSides.Right)
{
g.DrawLine(pen, this.Width - , , this.Width - , this.Height - );
} if ((BorderSide & ToolStripStatusLabelBorderSides.Bottom) == ToolStripStatusLabelBorderSides.Bottom)
{
g.DrawLine(pen, , this.Height - , this.Width - , this.Height - );
} if ((BorderSide & ToolStripStatusLabelBorderSides.Left) == ToolStripStatusLabelBorderSides.Left)
{
g.DrawLine(pen, , , , this.Height - );
}
}
}
}
else //三维模式
{
ControlPaint.DrawBorder3D(g, this.ClientRectangle, this.Border3DStyle, (Border3DSide) BorderSide); //这儿要将ToolStripStatusLabelBorderSides转换为Border3DSide
}
}
}
}
}
---------------------------原文:2014-05-14---------------------------
注:此乃Winform控件,开发环境为.net 2.0
工作需要,我对自带Panel进行了一下呈现上的扩展,方便设置边框效果。先看效果:

说明:
* 只有当原有属性BorderStyle为None时才能应用样式,此时可通过BorderMode设置【不显示、单色、三维】三种边框模式;这是因为BorderStyle为FixedSingle或Fixed3D时,自带边框似乎不属于Panel的一部分,不能控制或清除,我猜应该是底层API负责绘制的,所以唯有在None时才能自由发挥;
* 无论单色或是三维模式,均可通过BorderSide自由启用/禁用各个方位的边框;
* 在单色模式下,可通过BorderColor设置边框颜色,此时设置三维样式(Border3DStyle)无效;
* 在三维模式下,可通过Border3DStyle设置三维样式,此时设置边框颜色(BorderColor)无效;
代码在此:
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms; namespace AhDung.Controls
{
/// <summary>
/// 边框模式(无、单色、三维)
/// </summary>
public enum BorderMode { None, Single, ThreeD } /// <summary>
/// 可设置边框样式的Panel
/// </summary>
public class PanelEx : Panel
{
private Color borderColor;
private Border3DStyle border3DStyle;
private ToolStripStatusLabelBorderSides borderSide;
private BorderMode borderMode; [DefaultValue(BorderMode.None), Description("边框模式。可设置单色模式或三维模式")]
public BorderMode BorderMode
{
get { return borderMode; }
set
{
if (borderMode == value) { return; }
borderMode = value;
this.Invalidate();
}
} [DefaultValue(typeof(Color), "Black"), Description("边框颜色。仅当边框为单色模式时有效")]
public Color BorderColor
{
get { return borderColor; }
set
{
if (borderColor == value) { return; }
borderColor = value;
this.Invalidate();
}
} [DefaultValue(Border3DStyle.Etched), Description("边框三维样式。仅当边框为三维模式时有效")]
public Border3DStyle Border3DStyle
{
get { return border3DStyle; }
set
{
if (border3DStyle == value) { return; }
border3DStyle = value;
this.Invalidate();
}
} //之所以不直接用Border3DSide是因为这货不被设计器支持,没法灵活选择位置组合
[DefaultValue(ToolStripStatusLabelBorderSides.All), Description("边框位置。可自由启用各个方位的边框")]
public ToolStripStatusLabelBorderSides BorderSide
{
get { return borderSide; }
set
{
if (borderSide == value) { return; }
borderSide = value;
this.Invalidate();
}
} public PanelEx()
{
this.borderMode = BorderMode.None;
this.borderColor = Color.Black;
this.border3DStyle = System.Windows.Forms.Border3DStyle.Etched;
this.borderSide = ToolStripStatusLabelBorderSides.All;
} protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
if (this.BorderStyle != System.Windows.Forms.BorderStyle.None
|| BorderMode == BorderMode.None
|| BorderSide == ToolStripStatusLabelBorderSides.None)
{ return; } using (Graphics g = e.Graphics)
{
//三维模式
if (this.BorderMode == BorderMode.ThreeD)
{
ControlPaint.DrawBorder3D(g, this.ClientRectangle, this.Border3DStyle, (Border3DSide)BorderSide);//这儿要将ToolStripStatusLabelBorderSides转换为Border3DSide
}
else //单色模式
{
using (Pen pen = new Pen(BorderColor))
{
//若是四条边都启用,则直接画矩形
if (BorderSide == ToolStripStatusLabelBorderSides.All)
{
g.DrawRectangle(pen, , , this.Width - , this.Height - );
}
else //否则分别绘制线条
{
if ((BorderSide & ToolStripStatusLabelBorderSides.Top) == ToolStripStatusLabelBorderSides.Top)
{ g.DrawLine(pen, , , this.Width - , ); } if ((BorderSide & ToolStripStatusLabelBorderSides.Right) == ToolStripStatusLabelBorderSides.Right)
{ g.DrawLine(pen, this.Width - , , this.Width - , this.Height - ); } if ((BorderSide & ToolStripStatusLabelBorderSides.Bottom) == ToolStripStatusLabelBorderSides.Bottom)
{ g.DrawLine(pen, , this.Height - , this.Width - , this.Height - ); } if ((BorderSide & ToolStripStatusLabelBorderSides.Left) == ToolStripStatusLabelBorderSides.Left)
{ g.DrawLine(pen, , , , this.Height - ); }
}
}
}
}
}
}
}
-文毕-
【C#】分享一个可灵活设置边框的Panel的更多相关文章
- C# PDF Page操作——设置页面切换按钮 C# 添加、读取Word脚注尾注 C#为什么不能像C/C++一样的支持函数只读传参 web 给大家分享一个好玩的东西,也许你那块就用的到
C# PDF Page操作——设置页面切换按钮 概述 在以下示例中,将介绍在PDF文档页面设置页面切换按钮的方法.示例中将页面切换按钮的添加分为了两种情况,一种是设置按钮跳转到首页.下页.上页或者 ...
- 分享一个快速设置背景的js 自动获取背景图的长宽
我来分享一个快速设置背景的js (需要jq支持!) 快速切图铺页面用---就是不需要手动输入背景图的长宽 自动获取背景图的长宽 : <div class="wrap"> ...
- 分享一个Snackbar工具类 SnackbarUtils;
分享一个Snackbar工具类,源代码也是在Github上面找的,自己做了一下修改: 功能如下: 1:设置Snackbar显示时间长短 1.1:Snackbar.LEN ...
- 【微信支付】分享一个失败的案例 跨域405(Method Not Allowed)问题 关于IM的一些思考与实践 基于WebSocketSharp 的IM 简单实现 【css3】旋转倒计时 【Html5】-- 塔台管制 H5情景意识 --飞机 谈谈转行
[微信支付]分享一个失败的案例 2018-06-04 08:24 by stoneniqiu, 2744 阅读, 29 评论, 收藏, 编辑 这个项目是去年做的,开始客户还在推广,几个月后发现服务器已 ...
- 分享一个非常好用又好看的终端工具--Hyper (支持windows、MacOS、Linux)
分享一个非常好用又好看的终端工具--Hyper 官网地址: https://hyper.is/ 打开官网,选择对应版本安装即可:(可能网络原因,无法下载, 可以从我分享的链接下载 链接: https: ...
- 分享一个常用Adb命令
分享一个常用Adb命令 首先 首先感谢@xuxu的常用adb命令,收益良多,但是已经不能满足于我,所以补充了下. 再者 好久没发帖了,最近论坛老司机们都在讨论/总结,我就用这个干货回报吧. 最后 基于 ...
- 【C#】分享一个弹出容器层,像右键菜单那样召即来挥则去
适用于:.net2.0+ Winform项目 ------------------201508261813更新(源码有更新.Demo未更新)------------------ 重新绘制调整大小手柄( ...
- 福利到~分享一个基于jquery的智能提示控件intellSeach.js
一.需求 我们经常会遇到[站内搜索]的需求,为了提高用户体验,我们希望能做到像百度那样的即时智能提示.例如:某公司人事管理系统,想搜索李XX,只要输入“李”,系统自然会提示一些姓李的员工,这样方便用户 ...
- 分享一个漂亮的ASP.NET MVC界面框架
本文分享一个插件化的界面框架,该框架提供了用户.角色.权限管理功能,也提供了插件的管理和插件中心.下图是该界面框架的样式(全部源码和原理介绍下一篇分享,推荐越多,源码放的越早,呵呵). 要使用该界面框 ...
随机推荐
- FusionCharts简单教程(六)------加载外部Logo
一.加载外部文件Logo 在使用FusionCharts时,我们可能需要在加载图像的时候需要在图表中显示标识.图片等等.这里我们可以使用logoURL属性来实现.如: <chart ...
- [ZigBee] 4、ZigBee基础实验——中断
前言 上一篇介绍了CC2530的IO的基础知识,并用LED的控制来展示如何配置并控制GPIO的输出,用KEY状态的读取实验来展示如何读取GPIO的状态.从上一节的KEY状态读取的代码看出是采用轮训方式 ...
- Hello Mybatis 02 mybatis generator
接着上一篇文章通过Mybatis完成了一个User的CRUD的功能之后,这篇开始还需要建立一个Blog类,这样就可以模拟一个简单的微博平台的数据库了. 数据库准备 首先我们,还是需要在数据库中新建一个 ...
- WebApi系列~在WebApi中实现Cors访问
回到目录 说在前 Cors是个比较热的技术,这在蒋金楠的博客里也有体现,Cors简单来说就是“跨域资源访问”的意思,这种访问我们指的是Ajax实现的异步访问,形象点说就是,一个A网站公开一些接口方法, ...
- EF架构~XMLRepository仓储的实现~续(XAttribute方式)
回到目录 之前我写过关于XMLRepository仓储的实现的文章,主要是针对XElement方式的,对于XML的结构,一般来说有两种,一是使用节点方式的,我习惯称为XElement方式,别一种是属性 ...
- fir.im Weekly - 聊聊让人向往的远程开发工作
6月30 日,苹果开发者后台贴出一封关于广电总局的醒目通知,申报一个游戏 APP 上架AppStore,你需要文网文+ICP证+软著+版号,审批难度将越来越大,不禁让人感慨中国独立开发者的成长 &qu ...
- jquery 插件开发
一.$.extend() 这种方式用来定义一些辅助方法是比较方便的 $.extend({ sayHello:function(name){ console.log('Hello:'+name); } ...
- 贪心算法-最小生成树Kruskal算法和Prim算法
Kruskal算法: 不断地选择未被选中的边中权重最轻且不会形成环的一条. 简单的理解: 不停地循环,每一次都寻找两个顶点,这两个顶点不在同一个真子集里,且边上的权值最小. 把找到的这两个顶点联合起来 ...
- 深入理解CSS元素可见性visibility
× 目录 [1]定义 [2]属性 [3]display[4]JS[5]transition [6]API[7]DEMO 前面的话 visibility属性常见于与display属性的比较中.但实际上, ...
- kubernetes
项目主页:http://kubernetes.io/ docker仅能在单机上部署容器,而kubernetes可以统一管理各类容器,形成集群.Kubernetes作为Docker生态圈中重要一员,是G ...