C# 编写的 .NET 风格按钮控件
我编写了许多应用程序,但一直对使用标准 VS 控件时它们显得单调乏味感到有些失望。我一直在寻找一种简单的方法来让这些应用程序焕然一新,最终我决定编写自己的按钮控件。

引言
我编写了许多应用程序,但一直对使用标准 VS 控件时它们显得单调乏味感到有些失望。我一直在寻找一种简单的方法来让这些应用程序焕然一新,最终我决定编写自己的按钮控件,该控件基于 CodeProject 网站上的“The Aqualizer Strikes Back!”作品。
使用此控件,可以根据控件的属性“实时”生成控件位图。这些属性包括颜色、高度、宽度、字体大小和文本。通过使用缓存的位图,可以抵消图形渲染速度慢的问题。对于每个按钮,会生成两个 PNG 文件。一个是按钮的颜色,另一个是透明的,用于鼠标悬停在按钮上以及按钮禁用时。使用此控件,您可以同时获得灵活的图像生成和速度优势。
在您自己的应用程序中使用此控件
该控件可以“按原样”用作普通按钮控件。只需将项目添加到您的解决方案中,然后就可以将控件添加到您的窗体中。请记住,在窗体编辑器中添加控件之前,必须先编译 aquabutton 控件。使用 ButtonText
、ButtonColour
、FontSize
和 TextColour
属性来设置按钮的文本和颜色。
关注点
按钮上的新属性
使用 VS 2003 时,我花了相当长的时间试图让 Text
和 ForeColor
按照我的意愿工作。出于某种原因,我发现它们并不可靠,最终决定使用自己的属性。因此,使用了 ButtonText
、ButtonColour
、FontSize
和 TextColour
。
在窗体编辑器中使按钮的文本属性可见
为了给 Aqua Button 控件添加我自己的属性,我发现使用 Description、Default Value 和 Browsable 特性很有用。下面的示例展示了这一点。描述字段可以提供有关设置属性的有用提示。
[Description("The text visible on the control. Use \\n for line breaks")]
[DefaultValue("Not Set")
[Browsable(true)]
public string ButtonText
{
set
{
base.Text="not set";
initialise();
m_text=value;
redrawButton();
}
get
{
return m_text;
}
}
派生您自己的按钮类
如果您一时兴起,想基于 Aqua Button 控件创建自己的控件,完全可以重写 CreateImage()
方法来生成替代设计(例如菱形、绿宝石等)。提供了用于完成所有这些工作的图形辅助类。您可能需要将其中一些设置为 public
。
要了解如何执行此操作,只需使用提供的类作为起点。有关算法工作原理的更多信息,我建议您查看出色的“Aqualiser Strikes Back”文章。在重写 CreateImage()
时,请务必以与基类相同的方式缓存图像,否则性能会受到影响。
private void createBaseImages()
{
/* Call the overridable CreateImage routines to get the bitmaps/images */
m_image=CreateImage( m_buttonColour );
m_nofocusImage=CreateImage( Color.White );
this.Image = m_image;
}
限制
- 按钮的行为略有限制,因为它不提供对话框类型的行为。通过进行一些小的调整(或者在我得到提示的情况下),这可能会在将来的版本中得到改进。
- 按钮在按下时仍然缺乏反馈。它们需要点击或视觉动作来完成效果。
- 使用的 2D 图形库要求代码在“允许不安全代码”选项设置为“true”的情况下进行编译。因此,最好将控件放入其自己的库中,以免强制其他程序集启用此选项。
- 位图在
Text
属性从“Not Set”更改之前不会被渲染。此时,每次更改字体、大小、文本或颜色时,都会渲染一个新的位图。这对于已发布的应用程序来说是可以接受的,但在开发过程中可能会在您的 %temp% 目录中创建大量位图。
反馈
我在自己的应用程序中大量使用此控件,因为它极大地改善了用户界面的外观。我意识到该控件尚未完全完成,并且存在一些缺点(希望不是严重的)。非常欢迎提供反馈,并且如果合适,将在控件的后续版本中加入。