【问题标题】:Capture Help Button Click with Custom VCL Style使用自定义 VCL 样式捕获帮助按钮单击
【发布时间】:2014-07-12 20:31:43
【问题描述】:

我有一个为bsDialog 设置并启用biHelp 的VCL 表单(应用程序栏中的“?”图标)。该应用程序还使用自定义 VCL 样式(Aqua Light Slate)。

但是,当我单击“?”时,我无法显示WMNCLBUTTONDOWN Windows 消息。按钮。仅当应用程序的 VCL 样式更改回 Windows(默认)时才有效。

procedure TMainFrm.WMNCLButtonDown(var Msg: TWMNCLButtonDown);
begin
  if Msg.HitTest = HTHELP then
  begin
    OutputDebugString('Help button down');
    Msg.Result := 0;
  end
  else
    inherited;
end;

procedure TMainFrm.WMNCLButtonUp(var Msg: TWMNCLButtonUp);
begin
  if Msg.HitTest = HTHELP then
  begin
    OutputDebugString('Help button up');
    Msg.Result := 0;
  end
  else
    inherited;
end;

有没有办法让这些事件以自定义 VCL 样式触发?

【问题讨论】:

  • 你也应该添加一个标签来给出 Delphi 版本,因为 VCL 样式自第一个版本以来已经发生了很大变化

标签: delphi vcl delphi-xe4 windows-messages


【解决方案1】:

表单样式挂钩处理该消息:

TFormStyleHook = class(TMouseTrackControlStyleHook)
....
  procedure WMNCLButtonUp(var Message: TWMNCHitMessage); message WM_NCLBUTTONUP;
end;

实现包括这个

else if (Message.HitTest = HTHELP) and (biHelp in Form.BorderIcons) then
  Help;

这会调用表单样式挂钩的虚拟Help 方法。是这样实现的:

procedure TFormStyleHook.Help;
begin
  SendMessage(Handle, WM_SYSCOMMAND, SC_CONTEXTHELP, 0)
end;

因此您可以简单地收听WM_SYSCOMMAND 并测试wParam 以获得SC_CONTEXTHELP。像这样:

type
  TMainFrm = class(TForm)
  protected
    procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND;
  end;
....
procedure TMainFrm.WMSysCommand(var Message: TWMSysCommand);
begin
  if Message.CmdType = SC_CONTEXTHELP then begin
    OutputDebugString('Help requested');
    Message.Result := 0;
  end else begin
    inherited;
  end;
end;

【讨论】:

    猜你喜欢
    • 2015-10-04
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2014-01-22
    • 2016-11-17
    相关资源
    最近更新 更多