---------------------------更新: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的更多相关文章

  1. C# PDF Page操作——设置页面切换按钮 C# 添加、读取Word脚注尾注 C#为什么不能像C/C++一样的支持函数只读传参 web 给大家分享一个好玩的东西,也许你那块就用的到

    C# PDF Page操作——设置页面切换按钮   概述 在以下示例中,将介绍在PDF文档页面设置页面切换按钮的方法.示例中将页面切换按钮的添加分为了两种情况,一种是设置按钮跳转到首页.下页.上页或者 ...

  2. 分享一个快速设置背景的js 自动获取背景图的长宽

    我来分享一个快速设置背景的js (需要jq支持!) 快速切图铺页面用---就是不需要手动输入背景图的长宽 自动获取背景图的长宽 : <div class="wrap"> ...

  3. 分享一个Snackbar工具类 SnackbarUtils;

    分享一个Snackbar工具类,源代码也是在Github上面找的,自己做了一下修改: 功能如下: 1:设置Snackbar显示时间长短                 1.1:Snackbar.LEN ...

  4. 【微信支付】分享一个失败的案例 跨域405(Method Not Allowed)问题 关于IM的一些思考与实践 基于WebSocketSharp 的IM 简单实现 【css3】旋转倒计时 【Html5】-- 塔台管制 H5情景意识 --飞机 谈谈转行

    [微信支付]分享一个失败的案例 2018-06-04 08:24 by stoneniqiu, 2744 阅读, 29 评论, 收藏, 编辑 这个项目是去年做的,开始客户还在推广,几个月后发现服务器已 ...

  5. 分享一个非常好用又好看的终端工具--Hyper (支持windows、MacOS、Linux)

    分享一个非常好用又好看的终端工具--Hyper 官网地址: https://hyper.is/ 打开官网,选择对应版本安装即可:(可能网络原因,无法下载, 可以从我分享的链接下载 链接: https: ...

  6. 分享一个常用Adb命令

    分享一个常用Adb命令 首先 首先感谢@xuxu的常用adb命令,收益良多,但是已经不能满足于我,所以补充了下. 再者 好久没发帖了,最近论坛老司机们都在讨论/总结,我就用这个干货回报吧. 最后 基于 ...

  7. 【C#】分享一个弹出容器层,像右键菜单那样召即来挥则去

    适用于:.net2.0+ Winform项目 ------------------201508261813更新(源码有更新.Demo未更新)------------------ 重新绘制调整大小手柄( ...

  8. 福利到~分享一个基于jquery的智能提示控件intellSeach.js

    一.需求 我们经常会遇到[站内搜索]的需求,为了提高用户体验,我们希望能做到像百度那样的即时智能提示.例如:某公司人事管理系统,想搜索李XX,只要输入“李”,系统自然会提示一些姓李的员工,这样方便用户 ...

  9. 分享一个漂亮的ASP.NET MVC界面框架

    本文分享一个插件化的界面框架,该框架提供了用户.角色.权限管理功能,也提供了插件的管理和插件中心.下图是该界面框架的样式(全部源码和原理介绍下一篇分享,推荐越多,源码放的越早,呵呵). 要使用该界面框 ...

随机推荐

  1. 如何在IIS7/7.5上配置IISADMPWD

    问题 很多IIS用户还记得在早期的IIS版本上有一个web应用, IISADMPWD. 该应用是与IIS5 和IIS6一起发布的. 主要用于为域用户提供修改密码的功能, 同时也可以修改本机用户的密码. ...

  2. JavaScript思维导图—Window对象

    JavaScript思维导图-来自@王子墨http://julying.com/blog/the-features-of-javascript-language-summary-maps/

  3. .NET中Dictionary<TKey, TValue>浅析

    .NET中Dictionary<TKey, Tvalue>是非常常用的key-value的数据结构,也就是其实就是传说中的哈希表..NET中还有一个叫做Hashtable的类型,两个类型都 ...

  4. Spring-Context之八:一些依赖注入的小技巧

    Spring框架在依赖注入方面是非常灵活和强大的,多了解点一些注入的方式.方法,绝对能优化配置. idref idref属性可以传入一个bean的名称,虽然它是指向一个bean的引用,但是得到的是该b ...

  5. as3commons-bytecode 获取所有类的一个BUG

    下载了这个swc,号称可以反射出所有加载的类.已经用在了spring. 可是一运行就报错,说bytearray.uncompress出错.操. 下载整个源码,单独加载as3commons-byteco ...

  6. 与其他.Net异步模式和类型进行互操作

    返回该系列目录<基于Task的异步模式--全面介绍> Tasks和异步编程模型APM(Tasks and the Asynchronous Programming Model) 从APM到 ...

  7. MyBatis入门学习(二)

    在MyBatis入门学习(一)中我们完成了对MyBatis简要的介绍以及简单的入门小项目测试,主要完成对一个用户信息的查询.这一节我们主要来简要的介绍MyBatis框架的增删改查操作,加深对该框架的了 ...

  8. 爱上MVC~在Views的多级文件夹

    回到目录 在MVC里,你的控制器对应的视图一般是在Views目录,而如果希望在Views里再分几个模块文件夹默认是不允许的,我们需要做一下设置,就可以实现Views下的多次文件夹层次了,例如,我们有产 ...

  9. SQL SERVER 2005/2008 中关于架构的理解(二)

    本文上接SQL SERVER 2005/2008 中关于架构的理解(一)      架构的作用与示例 用户与架构(schema)分开,让数据库内各对象不再绑在某个用户账号上,可以解决SQL SERVE ...

  10. HTML中的title换行问题

    有时我们需要在html元素的title中换行显示信息.以下几种方法均可以实现: 直接在titile属性中使用换行,如下所示: asd">asdsadsad</a> 在tit ...