Событие Onmousedown в Mainmenu

  • Автор темы chingiz
  • Дата начала
C

chingiz

#1
Можно ли по правой клавиши мыши узнать на каком пункте MainMenu нажали? Мне это нужно для того чтобы по правой клавиши мыши на пункте MainMenu вызвать контекстное меню и из него выбрать желаемое действие, например вырезать данный пункт меню, и вставить его в другом месте. Другими словами мне нужно как то менять порядок пунктов в меню и перемещать пункты из одного подменю в другое. А может это можно сделать по другому, а не как я напридумывал? Перемещение и удаление пунктов MainMenu будет производится Юзером, поэтому и интерфейс должен быть соответствующим
 

Over

Well-known member
04.07.2007
116
0
#2
Могу посоветовать написать тебе свой класс типа TUserMenu, который будет наследовать всё от TMainMenu, и дополнительно добавить в нём event OnRightMouseButtonClick. А в эвенте описать обработку действий юзера.
 
Z

zubr

#3
Легко:
Код:
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.
 
C

chingiz

#4
Zubr спасибо, все работает, но вот только на пункте меню, которое раскрывается в submenu ничего не показывает. Ну да ладно попробую разобраться. Я тут прикинул маленько, для Юзера интерфейс получается не очень понятный. Вот если бы соорудить что-то похожее на конструктор MainMenu или PopupMenu как это реализовано в Delphi вот это было бы здорово. Может подскажет кто как это сделать, хотябы в каком направлении рыть?
 
Z

zubr

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