XP 风格按钮上的图像






4.56/5 (31投票s)
2004年2月18日
3分钟阅读

406146

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 文件。
- 添加了国际化 :-)