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

Проверить открыто ли контекстное меню

Delphi , Компоненты и Классы , Меню

Проверить открыто ли контекстное меню

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

{ 
  Using the WM_MENUSELECT message of the form won’t work to check if 
  the popup is open. Simply because the parent of the popup is not the 
  form (check the popup method of TPopupMenu). A workaround is to use 
  the api call yourself : 
}

 type
   TForm1 = class(TForm)
     {...}
     procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
       Shift: TShiftState; X, Y: Integer);

   private
     IsMenuOpen: Boolean;
     procedure WMMENUSELECT(var msg: TWMMENUSELECT); message WM_MENUSELECT;
   end;

    {...}
 implementation

 {...}

 procedure TForm1.WMMENUSELECT(var msg: TWMMENUSELECT);
 begin
   inherited;
   IsMenuOpen := not ((msg.MenuFlag and $FFFF > 0) and
     (msg.Menu = 0));
 end;

 procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
   Shift: TShiftState; X, Y: Integer);
 begin
   if Button = mbRight then
     with ClientToScreen(Point(X, Y)) do
       TrackPopupMenuEx(PopupMenu1.Handle, TPM_LEFTALIGN, X, Y,
         Self.Handle, nil);
 end;

Код, предоставленный ниже, проверяет, открыта ли контекстное меню или нет. Процедура WMMENUSELECT используется для обнаружения момента, когда меню открывается или закрывается.

Следующий шаг:

  1. Когда форма получает сообщение WM_MENUSELECT (которое отправляется Windows при отображении всплывающего меню), процедура WMMENUSELECT вызывается.
  2. Внутри этой процедуры переменная IsMenuOpen устанавливается в True, если меню открыто, и в False в противном случае.

Проверка на то, открыто ли меню или нет, выполняется на основе двух условий:

  • msg.MenuFlag and $FFFF > 0: Это условие проверяет, отображается ли всплывающее меню. Если это True, то меню открыто.
  • msg.Menu = 0: Это условие проверяет, отображается ли всплывающее меню из контекстного меню формы. Если это False, то меню не отображается из контекстного меню формы и поэтому открыто.

Если оба условия True, то меню не открывается контекстным меню формы (т.е., оно было открыто из другого места) и IsMenuOpen устанавливается в False. В противном случае, если любое из этих условий False, то меню открыто или не отображается из контекстного меню формы.

В процедуре FormMouseDown, при клике правой кнопкой мыши, всплывающее меню отображается с помощью TrackPopupMenuEx. Переменная IsMenuOpen используется для проверки, открыто ли всплывающее меню. Если это так, функция TrackPopupMenuEx ничего не делает (потому что всплывающее меню уже открыто). В противном случае, она отображает контекстное меню.

Этот код предоставляет работу-around для проблемы, связанной с использованием сообщения WM_MENUSELECT формы, которая не работает для проверки, открыто ли всплывающее меню. Просто потому что родитель всплывающего меню не является формой.

В статье описано решение проблемы проверки открытия контекстного меню в приложении Delphi с помощью сообщения WM_MENUSELECT и вызова API-вызовом TrackPopupMenuEx.


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

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




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


:: Главная :: Меню ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 13:13:58/0.0030858516693115/0