在HTHELP按钮上未触发Windows消息

时间:2014-07-12 18:28:02

标签: delphi windows-messages

我有一个VCL表单,设置为bsDialog且启用了biHelp("?"应用栏中的图标)。

我正在关注此示例:http://delphi.about.com/od/adptips2006/qt/custom_bihelp.htm

但是当我点击"?"时,我无法显示WMNCLBUTTONDOWN Windows消息。按钮。当我点击标题栏时似乎只会触发(就像我要拖动窗口一样。

代码:

procedure TMainFrm.WMNCLBUTTONDOWN(var Msg: TWMNCLButtonDown);
begin
  ShowMessage('WMNCLBUTTONDOWN Pre-Help') ;

  if Msg.HitTest = HTHELP then
    Msg.Result := 0 // "eat" the message
  else
    inherited;
 end;

procedure TMainFrm.WMNCLBUTTONUP(var Msg: TWMNCLButtonUp);
 begin

  if Msg.HitTest = HTHELP then
  begin
    Msg.Result := 0;
    ShowMessage('Need help?') ;
  end
  else
    inherited;
 end;

再次,我看到" Pre-Help"当我点击标题栏时发出的消息,但是当我点击"?"按钮。为什么是这样?我点击该按钮时会尝试显示单独的表单。

1 个答案:

答案 0 :(得分:1)

ShowMessage的模态消息循环会干扰消息处理。例如,使用OutputDebugString可以看到消息按预期触发:

type
  TMainFrm = class(TForm)
  protected
    procedure WMNCLButtonDown(var Msg: TWMNCLButtonDown); 
      message WM_NCLBUTTONDOWN;
    procedure WMNCLButtonUp(var Msg: TWMNCLButtonUp); 
      message WM_NCLBUTTONUP;
  end;
....
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;

请记住,按钮在释放之前不会被按下。因此,当按钮按下时,您不应该像显示对话框那样采取行动。等到WM_NCLBUTTONUP再显示另一个对话框。