如果您需要一个不会在单击时被选择的按钮,那么只有一种方法可以实现:使用一个按钮并将TabStop属性设置为false。
但是,如果您需要(就像我一样)一个不会在单击时被选择的按钮,则只有一种方法可用。
我所做的方式是子类化Button类,并在构造函数中调用SetStyles并将Selectable设置为false,如下所示:
public class ButtonNoFocus : Button
{
public ButtonNoFocus()
: base()
{
base.SetStyle(ControlStyles.Selectable, false);
}
}
我想知道您是想创建一个像TSpeedButton一样的控件,还是只需要同样的效果...
从头开始编写这个控件当然是可行的,但我只会把它作为学习练习。
假设您想要实现类似的效果...
Delphi的TSpeedButton与标准的TButton有所不同,开发人员发现它很有用——它是平面的,不接受焦点,并且消耗的资源比常规按钮少(因为它没有底层的Windows句柄)。
这些中哪些对您来说很重要呢?
如果您只想要一个不接受焦点的平面按钮,请使用FlatStyle=Flat(或PopUp)和TabStop=false的常规按钮。您可以通过设置Image属性或ImageList和ImageIndex/ImageKey的组合来配置图标。
另一种选择是寻找一个已有的按钮组件,它接近于您的需求——一个地方可以看看是Krypton Toolkit(免费使用,请参见http://www.componentfactory.com/toolkit_buttoncontrols.php)。
如果您想要减少应用程序消耗的资源数量,那么您很可能会在其他地方获得更好的回报。
在Windows 3.1(Delphi 1)和Windows 95(Delphi 2)时代,可用句柄的数量是严格限制的,系统范围内最多可用的句柄数是有限的。如今,在Windows XP和Vista上,可用句柄的数量要高得多,而且数量是针对每个进程而不是系统范围的。除非您创建了成千上万个按钮,否则您很难接近耗尽可用句柄的极限。
普通的 .net 2.0 按钮支持 TSpeedbutton 的部分功能:
它不支持以下功能:
这两个功能是相关的,您可以从按钮继承,并进行自定义绘制,添加 Down 和 Group 功能。
Codeproject 提供了一个示例,展示如何自定义绘制按钮。