Нажмите кнопку справки Capture с пользовательским стилем VCL

У меня есть форма VCL, настроенная для bsDialog с включенным biHelp (значок "?" на панели приложений). Приложение также использует собственный стиль 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?


person ikathegreat    schedule 12.07.2014    source источник
comment
Вы также должны добавить тег, указывающий версию Delphi, потому что стили VCL немного изменились с момента первого выпуска.   -  person David Heffernan    schedule 13.07.2014


Ответы (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;
person David Heffernan    schedule 12.07.2014