ОБСУЖДЕНИЕ

Событие Onmousedown в Mainmenu

4 ответов 7,5 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Автор темы
Можно ли по правой клавиши мыши узнать на каком пункте MainMenu нажали? Мне это нужно для того чтобы по правой клавиши мыши на пункте MainMenu вызвать контекстное меню и из него выбрать желаемое действие, например вырезать данный пункт меню, и вставить его в другом месте. Другими словами мне нужно как то менять порядок пунктов в меню и перемещать пункты из одного подменю в другое. А может это можно сделать по другому, а не как я напридумывал? Перемещение и удаление пунктов MainMenu будет производится Юзером, поэтому и интерфейс должен быть соответствующим
 
Могу посоветовать написать тебе свой класс типа TUserMenu, который будет наследовать всё от TMainMenu, и дополнительно добавить в нём event OnRightMouseButtonClick. А в эвенте описать обработку действий юзера.
 
Легко:
Код:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls;

type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
menu1: TMenuItem;
menu1_1: TMenuItem;
menu1_2: TMenuItem;
menu2: TMenuItem;
Menu2_1: TMenuItem;
menu2_2: TMenuItem;
private
{ Private declarations }
procedure WMMenurbuttonup(var msg:TMessage); message WM_MENURBUTTONUP;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WMMenurbuttonup(var msg:TMessage);
var
s:string;
begin
inherited;
If msg.lParam=menu1.Handle then
begin
s:='Позиция меню menu1: '+IntToStr(msg.WParam);
MessageBox(0, PChar(s), '', MB_OK);
end
else
If msg.lParam=menu2.Handle then
begin
s:='Позиция меню menu2: '+IntToStr(msg.WParam);
MessageBox(0, PChar(s), '', MB_OK);
end;
end;

end.
 
Zubr спасибо, все работает, но вот только на пункте меню, которое раскрывается в submenu ничего не показывает. Ну да ладно попробую разобраться. Я тут прикинул маленько, для Юзера интерфейс получается не очень понятный. Вот если бы соорудить что-то похожее на конструктор MainMenu или PopupMenu как это реализовано в Delphi вот это было бы здорово. Может подскажет кто как это сделать, хотябы в каком направлении рыть?
 
все работает, но вот только на пункте меню, которое раскрывается в submenu ничего не показывает
Для этого случая мне видится такое решение:
1. Перехватывать сообщения WM_INITMENUPOPAP (устанавливаем флаг), WM_UNINITMENUPOPUP (сбрасываем флаг).
2. Поставить внутренний хук на WM_RBUTTONUP - если флаг установлен и в хуке хэндл меню, значит пользователь выбрал этот пункт меню и нажал правую клавишу мыши.
Вот если бы соорудить что-то похожее на конструктор MainMenu или PopupMenu как это реализовано в Delphi вот это было бы здорово.
1. Посмотри исходники класса TMenuItem
2. Создай форму на которой будешь динамически создавать буттоны (или панели, связанные с каждым итем меню, предварительно просканировав меню рекурсивно).
3. Для каждого созданного элемента, создай необходимые обработчики.
 

Ещё по теме