介绍 我最喜欢XP的一点是它的主题控制功能。您甚至可以加载新的主题,就像X window系统的大多数窗口管理器一样。 这些主题化控件可以与。net Windows窗体一起使用,方法是提供一个清单,并且——对于一些控件,比如按钮——将FlatStyle属性设置为FlatStyle. system。 不幸的是,将按钮控件的FlatStyle属性设置为FlatStyle。系统使得它不可能在按钮的表面显示图像。在某种程度上,设置Image属性对这些控件没有影响。 背景 已经提出了许多变通方法,例如MalteseFalcon提出的这个。我所知道的所有方法都是使用所有者自己绘制的按钮来模仿XP的内置视觉风格,但不提供匹配第三方视觉风格的能力。 本文中的代码片段使得在以xp为主题的按钮上显示图像成为可能,同时保留了适应自定义视觉样式的功能。 使用不同的视觉样式绘制控件的功能是由Microsoft通过comctl32引入的。dll,版本6,它已经与最新版本的Windows一起发布,即。, Windows XP和Windows Server 2003。在这个版本中,引入了许多新的API调用,其中包括BCM_SETIMAGELIST,它将一个图像列表分配给一个按钮控件。本文中的代码使用平台调用服务(PInvoke)来使用BCM_SETIMAGELIST消息。 BCM_SETIMAGELIST消息还有另一个有趣的属性:如果你在图像列表中提供多个图像,你可以让按钮显示不同的图像,每个按钮的状态: 正常的 徘徊 按下 禁用 集中 这种行为也可以通过使用事件来实现,但是使用BCM_SETIMAGELIST,您无需编写事件处理程序就可以获得它。 使用的代码 代码包装了System.Windows.Forms。一个名为ImageButton的类中的Button类。除了额外的重载方法SetImage之外,您可以像使用普通按钮一样使用这个类。如果您只是想在按钮的表面显示一个图像,您可以使用如下方法:Hide 复制Code
Bitmap searchBitmap = new Bitmap("Search_16X16_32bpp.png"); ImageButton searchImageButton = new ImageButton(); searchImageButton.SetImage(searchBitmap); ...
如果您想对不同按钮状态的对齐、填充或设置图像进行更多的控制,请使用重载的方法:Hide 复制Code
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); ...
图像与阿尔法通道是支持。 的兴趣点 Windows窗体图片列表有一个bug:如果你在图片列表中添加一张图片,alpha通道就会丢失。因此,本文中的类使用了一种变通方法,即在将图像添加到ImageList之后重置图像的像素值。 演示图片显示了一些带有默认XP视觉风格(顶部)和自定义Chaninja RC5视觉风格(底部)的按钮。 演示中的图像来自最初由Arvid "Quadrone" Axelsson为Mozilla Firebird绘制的Qute集合。 历史 2004年2月24日:1.1版本。 为非xp风格的按钮增加了对齐方式。 增加了位图复制的速度,由Richard Deeming贡献。 2004年2月26日:1.2版。 添加nxtwothou建议的图像缩放。 2004年2月28日:1.3版本。 增加了双三次插值来进行调整。 2004年5月8日:1.4版本。 增加了下拉箭头功能 2004年5月14日:1.5版。 为设计器添加了ThemedImage属性。 增加了自动生成的禁用图像(感谢卡洛斯莱瓦)。 2004年10月25日:1.6版。 修正了主题开启/关闭的检测错误(感谢Leonid Kunin)。 添加NAnt文件。 添加I18n: -) 本文转载于:http://www.diyabc.com/frontweb/news453.html