SkinControls:带有内置样式的按钮、复选框和单选按钮控件






2.63/5 (29投票s)
2005年12月7日
2分钟阅读

166442

6709
自定义绘制的按钮、复选框和单选按钮控件。
引言
我已经完成了我的项目 dotnetskin,它可以自动为 .NET WinForms 应用程序设置表单和控件的皮肤。 我在这篇文章中展示了一些来自该项目中的代码和图像。 SkinControls 库包含四个组件,提供具有三种内置样式的蒙皮按钮、复选框和单选按钮。 这是一个创建自定义绘制控件的绝佳示例。
使用代码
为了在您的项目中使用的库,请将其添加到您的 VS 工具箱
- 右键单击工具箱中的“常规”选项卡。
- 选择“添加/删除项...”
- 在“.NET Framework 组件”选项卡上,按“浏览...”按钮并找到 DotNetSkin.SkinControl.dll。
这将向“常规”选项卡添加四个组件图标。 将“SkinImage”图标拖到您的表单上。
SkinImage
SkinImage
组件为所有控件提供皮肤图像。 它从资源加载皮肤图像。 所有图像都存储在一个静态对象中,因此您只需要将一个 SkinImage
组件添加到您的项目中。
皮肤图像可以是 .NET 框架支持的任何图像格式。 我使用了包含确定透明度的 alpha 通道的 PNG 文件。
这是 Mac 风格的按钮图像。
SkinImage
具有 Scheme
属性来设置皮肤方案。 库的资源中提供了三种方案:Macos 风格、XP 风格、Plex 风格。
这是 SkinImage
代码
public class SkinImage:Component
{
public static ImageObject button;
public static ImageObject checkbox;
public static ImageObject radiobutton;
private Schemes scheme = Schemes.MacOs;
public SkinImage()
{
}
static SkinImage()
{
Macskin();
}
protected static void Macskin()
{
button = new
ImageObject("DotNetSkin.SkinControls.mac_button.png",
5,Rectangle.FromLTRB(14,11,14,11));
checkbox = new
ImageObject("DotNetSkin.SkinControls.mac_checkbox.png",
12,new Rectangle(0,0,0,0));
radiobutton = new
ImageObject("DotNetSkin.SkinControls.mac_radiobutton.png",
8,new Rectangle(0,0,0,0));
}
protected static void Xp1skin()
{
button = new
ImageObject("DotNetSkin.SkinControls.xp1_button.png",
5,Rectangle.FromLTRB(8,9,8,9));
checkbox = new
ImageObject("DotNetSkin.SkinControls.xp1_checkbox.png",
12,new Rectangle(0,0,0,0));
radiobutton = new
ImageObject("DotNetSkin.SkinControls.xp1_radiobutton.png",
8,new Rectangle(0,0,0,0));
}
protected static void Plexskin()
{
button = new
ImageObject("DotNetSkin.SkinControls.Plex_button.png",
5,Rectangle.FromLTRB(8,9,8,9));
checkbox = new
ImageObject("DotNetSkin.SkinControls.Plex_checkbox.png",
12,new Rectangle(0,0,0,0));
radiobutton = new
ImageObject("DotNetSkin.SkinControls.Plex_radiobutton.png",
8,new Rectangle(0,0,0,0));
}
protected override void Dispose( bool disposing )
{
if (disposing)
{
}
base.Dispose( disposing );
}
public Schemes Scheme
{
get { return scheme;}
set
{
scheme = value;
try
{ switch (scheme)
{
case Schemes.MacOs:
Macskin();
break;
case Schemes.Xp:
Xp1skin();
break;
case Schemes.Plex:
Plexskin();
break;
}
}
catch (Exception)
{
return;
}
}
}
}
SkinButton
按钮皮肤图像平铺了五个按钮图像。 这些图像用于按钮的 Normal
(正常)、MouseOver
(鼠标悬停)、MouseDown
(鼠标按下)、Disabled
(禁用)和 Focused
(焦点)状态。 为了支持非矩形图像,SkinButton
支持透明背景。 关键是调用 base.InvokePaintBackground
来绘制父背景。
|
|
非透明背景 | 透明背景 |
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
//....
Rectangle rc = this.ClientRectangle;
Graphics g = e.Graphics;
//Draw parent background
base.InvokePaintBackground(this,
new PaintEventArgs(e.Graphics, base.ClientRectangle));
//Draw skin image
SkinDraw.DrawRect2(g,SkinImage.button,rc,i);
//.... Draw button text
}
SkinCheckbox 和 SkinRadioButton
复选框控件平铺了十二个图像,单选按钮平铺了八个图像。 这些图像用于 Normal
(正常)、MouseOver
(鼠标悬停)、MouseDown
(鼠标按下)和 Disabled
(禁用)状态。
历史
- 2005/2/10 - 首次发布。
- 2006/3/15 - 修复了按钮按下时的错误,支持
button.text
中的快捷键 '&'。