如何在C# 2.0中创建一个类似Delphi TSpeedButton或SpeedButton的按钮?

4
如何在C# 2.0中创建一个类似于Delphi的TSpeedButton或SpeedButton?

你想要复制哪些具体的功能? - JamesSugrue
我正在尝试复制“无焦点”功能,当有人点击按钮时。原因: 我正在尝试在Windows应用程序中创建一个嵌入式键盘。这个键盘需要能够将按键发送到在键盘按钮被按下之前具有焦点的控件。 - Jeff Atwood
4个回答

5

如果您需要一个不会在单击时被选择的按钮,那么只有一种方法可以实现:使用一个按钮并将TabStop属性设置为false。

但是,如果您需要(就像我一样)一个不会在单击时被选择的按钮,则只有一种方法可用。

我所做的方式是子类化Button类,并在构造函数中调用SetStyles并将Selectable设置为false,如下所示:

public class ButtonNoFocus : Button
{
    public ButtonNoFocus()
        : base()
    {
        base.SetStyle(ControlStyles.Selectable, false);
    }
}

这对我很有帮助,如果你有一个带有按钮的控制面板并对所选对象执行操作,这很完美...

4

我想知道您是想创建一个像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上,可用句柄的数量要高得多,而且数量是针对每个进程而不是系统范围的。除非您创建了成千上万个按钮,否则您很难接近耗尽可用句柄的极限。


0

this对你有帮助吗?看起来你需要处理OnPaint事件,而不是获取焦点...


0

普通的 .net 2.0 按钮支持 TSpeedbutton 的部分功能:

  • Glyph: 图像
  • Flat: FlatStyle

它不支持以下功能:

  • Down
  • Group

这两个功能是相关的,您可以从按钮继承,并进行自定义绘制,添加 Down 和 Group 功能。

Codeproject 提供了一个示例,展示如何自定义绘制按钮。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接