В статье мы рассмотрим, как поймать событие нажатия кнопки "Помощь" в 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