我正在编写一个从tExCustomControl派生的自定义按钮,而这个按钮又来自tCustomControl。 tExCustomControl组件负责绘制和显示标题。我设法使用WinAPI显示带有下划线的加速字符的标题。我如何告诉Windows accel密钥与tExButton相关联,以便它可以处理事件?
答案 0 :(得分:2)
你什么都不告诉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
实现加速器的方式,例如。