Событие Onmousedown в Mainmenu

Тема в разделе "Delphi - Компоненты", создана пользователем chingiz, 6 авг 2007.

  1. chingiz

    chingiz Гость

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

    Over Well-Known Member

    Репутация:
    0
    Регистрация:
    4 июл 2007
    Сообщения:
    116
    Симпатии:
    0
    Могу посоветовать написать тебе свой класс типа TUserMenu, который будет наследовать всё от TMainMenu, и дополнительно добавить в нём event OnRightMouseButtonClick. А в эвенте описать обработку действий юзера.
     
  3. zubr

    zubr Гость

    Репутация:
    0
    Легко:
    Код:
    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.
     
  4. chingiz

    chingiz Гость

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

    zubr Гость

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

Поделиться этой страницей