65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.63/5 (29投票s)

2005年12月7日

2分钟阅读

viewsIcon

166442

downloadIcon

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 中的快捷键 '&'。
© . All rights reserved.