【问题标题】:Delphi custom button accel keyDelphi 自定义按钮加速键
【发布时间】:2015-03-23 17:48:18
【问题描述】:

我正在编写一个从 tExCustomControl 派生的自定义按钮,而这又是从 tCustomControl 派生的。 tExCustomControl 组件负责绘制和显示标题。我设法使用 WinAPI 显示带有下划线的加速字符的标题。我如何告诉 Windows 加速键与 tExButton 相关联,以便它可以处理事件?

【问题讨论】:

    标签: delphi delphi-xe


    【解决方案1】:

    您不会告诉 Windows 任何事情。当用户键入加速键时,Windows 会向您的应用发送 WM_SYSCHAR 消息,VCL 会自动处理该消息。当 VCL 搜索哪个控件处理加速器时,您的组件将收到一条 CM_DIALOGCHAR 消息,您需要对其进行响应,例如:

    type
      TMyCustomButton = class(tExCustomControl)
      private
        procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR;
      end;
    
    procedure TMyCustomButton.CMDialogChar(var Message: TCMDialogChar);
    begin
      if IsAccel(Message.CharCode, Caption) and Enabled and Visible and
        (Parent <> nil) and Parent.Showing then
      begin
        Click;
        Result := 1;
      end else
        inherited;
    end;
    

    IsAccel()Vcl.Forms 单元中的公共函数:

    function IsAccel(VK: Word; const Str: string): Boolean;
    

    它从提供的 Str 值解析加速器,并将其与提供的 VK 值进行比较。

    例如,上面的代码正是TSpeedButton 实现加速器的方式。

    【讨论】:

    • 这我已经实现了对 KeyUp 事件的处理。问题是如果有多个 tExCustomControls,Windows 会将消息发送到放置在表单上的第一个。我需要的是让 Windows 明白那个特定的加速键必须由确定的 tExCustomControl 处理。谢谢。
    • 只是为了澄清:当我说“告诉 Windows”时,我是比喻性地说。我知道 Windows 消息系统。
    • 更正:我需要让 VCL 明白那个特定的加速键必须由确定的 tExCustomControl(或类似的东西)处理。谢谢。 (请原谅我在说废话)。
    • 你没有抓住重点。不要使用Key... 事件实现加速器。 VCL 预处理加速键击并相应地生成CM_DIALOGCHAR 消息。 VCL 将消息广播到子控件、菜单和操作列表,直到其中一个响应匹配的加速器。只要您的控件每个都有一个独特的加速器,就应该只有一个响应消息。如果多个控件具有相同的加速器,那么当然这将是一个先到先得的场景,其中一个最终处理消息。
    • 你中了大奖!事实上,在构造函数中,我将标题设置为“&Caption”,这就是问题所在,因为这是所有 tExCustomControls 的默认标题。我不记得这个特定的设置。我所要做的就是从默认标题中删除“&”字符。非常感谢!
    猜你喜欢
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 2011-10-29
    • 2010-12-03
    • 2013-08-06
    • 1970-01-01
    • 2017-11-01
    相关资源
    最近更新 更多