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

XP 风格按钮上的图像

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.56/5 (31投票s)

2004年2月18日

3分钟阅读

viewsIcon

406146

downloadIcon

5528

一个 .NET Windows Forms 按钮,使用 Windows XP 上的 Visual Styles,可以显示图像。

引言

我最喜欢 XP 的一点就是它拥有主题控件的能力。你甚至可以加载新的主题,就像 X Window System 的大多数窗口管理器一样。

这些主题控件可以通过 提供一个清单,并且——对于像 Button 这样的某些控件——将 FlatStyle 属性设置为 FlatStyle.System 来用于 .NET Windows Forms。

不幸的是,将 Button 控件的 FlatStyle 属性设置为 FlatStyle.System 会导致无法在该按钮表面显示图像。不知何故,设置 Image 属性对这些控件无效。

背景

已经提出了许多解决方法,例如 MalteseFalcon 的 这个。我所知道的所有方法都使用所有者绘制按钮来模拟 XP 的内置视觉样式,但无法匹配第三方视觉样式。

本文中的代码片段使得你可以在 XP 主题按钮上显示图像,同时保留适应自定义视觉样式功能。

通过 comctl32.dll 版本 6,Microsoft 引入了使用不同视觉样式绘制控件的功能,该版本已随最新版本的 Windows 一起发布,即 Windows XP 和 Windows Server 2003。此版本引入了许多新的 API 调用,其中包括 BCM_SETIMAGELIST,该调用将图像列表分配给按钮控件。本文中的代码使用 Platform Invocation Services (PInvoke) 来使用 BCM_SETIMAGELIST 消息。

BCM_SETIMAGELIST 消息还有另一个有趣的属性:如果你在图像列表中提供多个图像,你就可以让按钮为按钮的多个状态显示不同的图像。

  • 正常
  • 悬停
  • 按压
  • 禁用
  • Focused

这种行为也可以通过事件来实现,但使用 BCM_SETIMAGELIST,你可以在不编写事件处理程序的情况下实现它。

使用代码

代码将 System.Windows.Forms.Button 类封装在一个名为 ImageButton 的类中。你可以像普通按钮一样使用这个类,只是多了一个重载的 SetImage 方法。如果你只想在按钮表面显示一个图像,你可以这样使用该方法:

Bitmap searchBitmap = new Bitmap("Search_16X16_32bpp.png");
ImageButton searchImageButton = new ImageButton();
searchImageButton.SetImage(searchBitmap);
...

如果你想更好地控制对齐方式、填充或为不同的按钮状态设置图像,请使用重载方法:

Bitmap goBitmap = new Bitmap("Go_48X48_32bpp.png");
Bitmap goHoverBitmap = new Bitmap("Go!_48X48_32bpp.png");
Bitmap goDisabledBitmap = new Bitmap("GoDisabled_48X48_32bpp.png");
ImageButton goImageButton = new ImageButton();
goImageButton.SetImage(goBitmap, goHoverBitmap, goBitmap, goDisabledBitmap, 
                       goBitmap, ImageButton.Alignment.Center);
...

支持带有 alpha 通道的图像。

关注点

Windows Forms ImageList 有一个 bug:如果你将一个 Image 添加到 ImageList 中,alpha 通道就会丢失。因此,本文中的类通过在 Image 添加到 ImageList 后重置其像素值来解决此问题。

演示图像显示了一些具有默认 XP 视觉样式(顶部)和自定义 Chaninja RC5 视觉样式(底部)的按钮。

演示中的图像来自 Qute 系列,最初由 Arvid "Quadrone" Axelsson 为 Mozilla Firebird 绘制。

历史

  • 2004 年 2 月 24 日:版本 1.1。
    • 为非 XP 风格按钮添加了对齐方式。
    • 添加了 Bitmap 复制的加速功能,由 Richard Deeming 贡献。
  • 2004 年 2 月 26 日:版本 1.2。
    • 根据 nxtwothou 的建议添加了图像缩放功能。
  • 2004 年 2 月 28 日:版本 1.3。
    • 为重缩放添加了双三次插值。
  • 2004 年 5 月 8 日:版本 1.4。
    • 添加了下拉箭头功能。
  • 2004 年 5 月 14 日:版本 1.5。
    • 为设计器添加了 ThemedImage 属性。
    • 添加了禁用图像的自动生成(感谢 Carlos Leyva)。
  • 2004 年 10 月 25 日:版本 1.6。
    • 修复了主题开关检测 bug(感谢 Leonid Kunin)。
    • 添加了 NAnt 文件。
    • 添加了国际化 :-)
© . All rights reserved.