Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Разработка Delphi: Как поймать событие нажатия кнопки Помощь в VCL с пользовательским стилем

Delphi , ОС и Железо , Справочник по сообщениям

В статье мы рассмотрим, как поймать событие нажатия кнопки "Помощь" в VCL с пользовательским стилем в Delphi. Эта проблема может возникнуть, когда вы используете кастомный стиль VCL, и стандартные методы не работают.

Проблема

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

Альтернативный ответ

К сожалению, в альтернативном ответе представлена та же проблема, без предлагаемого решения.

Подтвержденный ответ

Оказывается, форма использует хук стиля, который обрабатывает это сообщение. В классе TFormStyleHook есть процедура WMNCLButtonUp, в которой проверяется, было ли нажатие на кнопку "Помощь". Если да, то вызывается виртуальный метод Help класса TFormStyleHook.

Метод Help отправляет сообщение WM_SYSCOMMAND с параметром SC_CONTEXTHELP. Таким образом, чтобы поймать это событие, вам нужно слушать сообщение WM_SYSCOMMAND и проверить, было ли оно отправлено с параметром 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;

Теперь, когда вы нажимаете кнопку "Помощь" в вашей VCL-форме с кастомным стилем, процедура WMSysCommand будет вызываться, и вы сможете обработать это событие.

Создано по материалам из источника по ссылке.

Статья описывает проблему с捕获 помощью кнопки события в VCL-форме с пользовательским стилем в Delphi, и предлагает решение, заключающееся в перехвате сообщения WM_SYSCOMMAND с параметром SC_CONTEXTHELP.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Справочник по сообщениям ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-29 02:11:39/0.0032260417938232/0