1. Мегаконкурс в апреле "Приведи друзей на codeby". Дарим деньги, подписку на журнал хакер и выдаем статус "Paid Access". Подробнее ...

    Скрыть объявление

Событие Onmousedown в Mainmenu

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

Наш партнер Genesis Hackspace
  1. chingiz

    chingiz Гость

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

    Over Well-Known Member

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

    zubr Гость

    Легко:
    Код (Text):
    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 Гость

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

    zubr Гость

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

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