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

"Обработка системного меню окна в Delphi XE6: использование маски $FFF0 для корректного тестирования значения wParam в сообщении WM_SYSCOMMAND"

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

Обработка системного меню окна в Delphi XE6: использование маски $FFF0 для корректного тестирования значения wParam в сообщении WM_SYSCOMMAND

При разработке оконных приложений в Delphi XE6 иногда возникают вопросы, связанные с обработкой системного меню окна. В этом материале мы рассмотрим, как правильно использовать маску $FFF0 для корректного тестирования значения wParam в сообщении WM_SYSCOMMAND.

Системное меню окна – это меню, которое появляется при нажатии на значок в заголовке окна слева. Для добавления дополнительных команд в это меню и обработки кликов по ним можно использовать процедуры InsertCommand и OnSysCommand.

procedure TFormMain.InsertCommand(Sender: TObject);
begin
  HandleMenu := GetSystemMenu(Handle, False);
  AppendMenu(HandleMenu, MF_SEPARATOR, 0, '');
  AppendMenu(HandleMenu, MF_STRING, ALWAYS_ON_TOP_ID, PChar(sAlwaysOnTop));
end;

procedure TFormMain.OnSysCommand(var Msg: TWMSysCommand);
begin
  if Msg.CmdType = ALWAYS_ON_TOP_ID then
    // ...
  inherited;
end;

При обработке сообщения WM_SYSCOMMAND важно учитывать, что четыре низовых бита параметра wParam используются системой внутренне. Чтобы получить правильный результат при тестировании значения wParam, приложение должно сочетать значение wParam с маской $FFF0 с помощью оператора битового И (AND).

if Msg.CmdType and $FFF0 = ALWAYS_ON_TOP_ID then
  // ...

Однако, если использовать данный подход, код может перестать работать. Причиной этого является неправильно заданный константный идентификатор команды.

const
  ALWAYS_ON_TOP_ID = 1000; // Неверно!

Константа ALWAYS_ON_TOP_ID определена как 1000, что в шестнадцатеричной системе счисления равно 3E8. Последний низовый бит должен быть равен 0, чтобы четыре низовых бита были равны 0. Таким образом, правильное значение константы должно быть задано в шестнадцатеричной системе счисления, например, $100 (256).

const
  ALWAYS_ON_TOP_ID = $100; // Правильно!

Теперь вы можете безопасно использовать маску $FFF0 для корректного тестирования значения wParam в сообщении WM_SYSCOMMAND.

if Msg.CmdType and $FFF0 = ALWAYS_ON_TOP_ID then
  // ...

При этом важно помнить, что заданный идентификатор команды не должен входить в диапазон SC_... (который равен $F000 ... $F###). Убедитесь, что выбранное значение не конфликтует с системными командами.

Используя правильно определенный константный идентификатор и маску $FFF0, вы сможете корректно обрабатывать системное меню окна в Delphi XE6 и добавлять в него собственные команды.

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

Данный текст описывает процедуры для добавления команд в системное меню окна в Delphi XE6 и правильное тестирование значения wParam в сообщении WM_SYSCOMMAND с использованием маски $FFF0.


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

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




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


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


реклама


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

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 11:42:05/0.0036430358886719/0