как сделать всплывающее меню в delphi
PopupMenu — контекстное (всплывающее) меню в Дельфи
Контекстное (всплывающее) меню появляется при размещении указателя в форме или в области некоторого элемента управления и нажатии правой кнопки мыши. Обычно контекстное меню содержит команды, влияющие только на тот объект, для которого вызвано это меню, поэтому такое меню также называют локальным. На скриншоте показан примерный вид контекстного меню.
Контекстное меню в Delphi представлено компонентом PopupMenu.
PopupMenu можно конструировать так же с помощью Конструктора меню. Для этого нажимаем правой кнопкой миши на компоненте (см. скриншот):
выбираем пункт меню — Menu Dessigner.
Свойства компонента PopupMenu
AutoPopup типа Boolean (определяет, появляется ли контекстное меню при щелчке правой кнопки мыши и размещении указателя на компоненте, использующем это меню). Если свойство AutoPopup имеет значение True (по умолчанию), то контекстное меню при щелчке мыши появляется автоматически. Если свойство AutoPopup имеет значение False, то меню не появляется. Однако в этом случае можно активизировать меню программно, используя метод Popup. Процедура Popup (X, Y: integer), где X и Y— координаты меню относительно левого верхнего угла экрана монитора, выводит на экран указанное контекстное меню, например: PopupMenu1.Popup(200, 200);
Alignment типа TPopupAlignment (определяет место появления контекстного меню по отношению к указателю мыши).
Свойство Alignment может принимать следующие значения:
Для того чтобы контекстное меню появлялось при щелчке на компоненте, необходимо его свойству PopupMenu присвоить в качестве значения имя требуемого контекстного меню.
Данная инструкция задает для формы Form1 контекстное меню PopupMenu1.
Как сделать всплывающее меню в delphi
Контекстное меню (PopupMenu), вызываемое в приложении Windows по щелчку правой кнопкой мыши, является стандартной и удобной возможностью многих программ. Delphi компонент PopupMenu предназначен для создания таких контекстных меню. Контекстное меню из-за способа своего появления называют ещё всплывающим меню.
Delphi компонент PopupMenu почти не отличается от компонента MainMenu и также является невизуальным. Но в отличие от Главного меню, которое одно на Форме, всплывающие меню могут быть у каждого объекта, размещённого на Форме. Поэтому нужно разместить на Форме и запрограммировать столько компонентов PopupMenu, сколько контекстных меню предполагается использовать в программе. Кроме того, контекстное меню не имеет нескольких пунктов верхнего уровня, так как все его пункты располагаются в одном вертикальном столбце.
После того как компонент PopupMenu размещён на Форме, структура меню формируется совершенно аналогично созданию Главного Меню (компонент MainMenu). Далее, для того, чтобы контекстное меню определённого объекта (например, компонента StringGrid) вызывалось в программе, необходимо свойству PopupMenu этого объекта присвоить имя соответствующего Delphi компонента PopupMenu:
В момент появления контекстного меню происходит событие onPopup компонента PopupMenu. В этот момент можно, исходя из анализа ситуации, внести необходимые изменения в его параметры.
Щёлкнув по объекту правой кнопкой мыши, мы получим появление его контекстного меню, обеспеченного компонентом PopupMenu1, в точке произведённого щелчка. Но можно добиться его появления в любом нужном нам месте Формы. Достигается это использованием метода Popup компонента PopupMenu, при этом свойство Popup у соответствующего компонента (в данном случае StringGrid) нужно очистить.
Для использования этого метода необходимо использовать событие щелчка правой кнопки мыши по объекту. И правильнее использовать именно отпускание кнопки, то есть событие onMouseUp нужного объекта. Метод Popup имеет параметры X и Y, соответствующие расстоянию точки щелчка по горизонтали и вертикали от верхнего левого угла экрана соответственно. То есть, можно добиться появления меню вообще за пределами Формы. Вот, попробуйте использовать такой код:
procedure TForm1.StringGrid1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbRight then PopupMenu1.Popup(0, 0); //появление меню в точке (0, 0)
end;
Но и обработчик события onMouseUp тоже имеет параметры X и Y. Они соответствуют расстоянию точки щелчка по горизонтали и вертикали от верхнего левого угла уже Формы. Однако, если попытаться использовать их в методе Popup, то меню не появится в том месте, где вы ожидаете. Чтобы добиться нужного эффекта, необходимо учитывать также положение самой Формы, а также того объекта, в пределах которого должно появляться меню. Но и это не всё. Необходимо к значению X добавить высоту заголовка Формы, которая неизвестна. Все эти слагаемые усложняют код.
Избавиться от большинства слагаемых поможет функция GetClientOrigin. Она вызывается без параметров и возвращает сдвиг клиентской области Формы относительно верхнего левого угла экрана в формате TPoint (точка, то есть запись с полями X и Y). Таким образом, остаётся учесть только положение нужного объекта. Следующий код обеспечивает появление меню именно в месте щелчка мышки по компоненту StringGrid1:
PopupMenu в Delphi
Создавая из панели инструментов Standard компонент PopupMenu на нашей форме, вы заметите, что PopupMenu – это невизуальный компонент. Вообще PopupMenu это всплывающее контекстное меню, которое возникает при нажатии пользователя правой кнопкой мыши.
Что ж сделать, чтобы увидеть PopupMenu? Для этого сразу привяжите всплывающее меню к форме. Это делается на вкладке Events (события) главной формы PopupMenu. После этого при запуске проекта F9 щелкая правой кнопкой можно увидеть следующее:
Кстати PopupMenu во многом напоминает MainMenu, но контекстные меню разных форм не объединяются. Можно говорить, что для одной формы – одно PopupMenu, а для следующей к примеру другое PopupMenu.
Само проектирование всплывающего меню в Delphi происходит с помощью конструктора:
На рисунке показано, что PopupMenu имеет Name=N1 как и в случае с MainMenu. Так что основные свойства можно перечесть по пальцам: Aligment (выравнивание), AutoHotKeys (горячие клавиши), AutoPopup (автоматическое появление при щелчке правой кнопки), TrackButton (какая кнопка активирует всплывающее меню, если связано с кнопкой панели инструментов). Остальные свойства рассмотрите самостоятельно, там ничего особенного нет.
Основные методы:
Метод | Описание |
DoPopup | Procedure DoPopup(Sender: TObject);Генерирует событие OnPopup |
FindItem | Type TFindItemKind =(fkCommand, fkHandle, fkShortCut);Function FindItem(Value: Word, Kind:TFindItemKind): TMenuItem; Ищет и возвращает раздел меню из Значения Value равное Kind = fkCommand; При Kind = fkHandle – дескриптор всплывающего меню, при Kind = fkShortCut – код горячих клавиш |
Popup | Procedure Popup (x,y: Integer);Показывает меню в указанной позиции экрана |
На вкладке Events (события): OnChange – событие при изменеии меню, OnPopup – событие происходит перед появление всплывающего меню.
. свойства popupmenu delphi popupmenu свойства и событие компонентов PopupMenu, TImage popupmenu delphi пример компонент popupmenu
Меню в программах на Delphi
Меню является важнейшими элементами управления пользовательского интерфейса любого приложения. Кроме того, коснемся механизма действий, позволяющего синхронизировать совместную работу различных элементов управления.
Практически все Windows-приложения имеют меню, которое является распространенным элементом пользовательского интерфейса. Меню представляет собой список объединенных по функциональному признаку пунктов, каждый из которых обозначает команду или вложенное меню (подменю). Выбор пункта меню равносилен выполнению соответствующей команды или раскрытию подменю.
Пункт меню или подменю представляет собой объект типа TMenuItem. Отдельный пункт меню (подменю) обычно виден как текстовый заголовок, описывающий назначение пункта меню. Пункт меню может быть выделен (маркирован) для указания включенного состояния. Класс TMenuItem служит для представления пунктов главного и контекстных меню.
Cвойства пункта меню:
Bitmap типа TBitmap (значок, размещаемый слева от заголовка пункта меню). По умолчанию свойство имеет значение Nil, и значок отсутствует;
Break типа TmenuBreak (признак разделения меню на столбцы). Свойство Break может принимать одно из трех значений:
Caption типа String (строка текста, отображаемая как заголовок пункта меню). Если в качестве заголовка указать символ «-», то на месте соответствующего пункта меню отображается разделительная линия. При этом, несмотря на отображение линии, свойство Caption попрежнему имеет значение «-»;
Checked типа Boolean (признак того, помечен пункт или нет). Если свойство установлено в значение True, то пункт помечен, и в его заголовке появляется специальная отметка. По умолчанию свойство Checked имеет значение False, и пункт меню не имеет отметки;
AutoCheck типа Boolean (признак автоматического изменения значения свойства Checked на противоположное при выборе пользователем пункта меню);
Count типа Integer (количество подпунктов в данном пункте меню). Это свойство есть у каждого пункта меню. Если какой-либо пункт не содержит подпунктов, то свойство Count имеет нулевое значение;
Enabled типа Boolean (признак активности пункта, т. е. будет ли он реагировать на события от клавиатуры и мыши). Если свойство Enabled установить в значение False, то пункт меню будет неактивным, и его заголовок становится бледным. По умолчанию свойство Enabled имеет значение True, и пункт меню активен;
Items типа TMenuItems (массив подпунктов текущего пункта меню). У каждого пункта меню, имеющего вложенное меню (подменю), пункты этого подменю перечислены в свойстве Items. Это свойство позволяет получить доступ к пунктам подменю по их позициям в массиве: items [0], items [1] и т. д.;
RadioItem типа Boolean (вид отметки, появляющейся в заголовке пункта). Если свойство установлено в значение False (по умолчанию), то в качестве отметки используется значок «галочка», в противном случае пункт отмечается жирной точкой;
Visible типа Boolean (признак видимости пункта на экране). Если свойство Visible установлено в значение False, то пункт меню на экране не отображается. По умолчанию свойство Visible имеет значение True, и пункт виден в меню.
На скриншоте выше приведен пример меню Menul (подменю главного меню), разделенного на два столбца. У пункта Открыть этого меню свойство Break имеет значение mbBarBreak, у пункта Открыть как. свойство Break— значение mbBarBreak, для Закрыть как. свойству Break установлено значение mbNone.
Основным событием, связанным с пунктом меню, является событие OnClick, возникающее при выборе пункта с помощью клавиатуры или мыши. В приложении для генерации события OnClick или для имитации выбора пункта меню можно использовать метод Click. Вызов этой процедуры эквивалентен выбору соответствующего пункта меню пользователем.
Нажатие кнопки Button1 приводит к тому же эффекту, что и выбор пункта меню mnuLockltem.
Для создания меню (как подменю главного меню) или контекстного меню при разработке приложения используется Конструктор меню. Меню также можно создавать или изменять динамически — непосредственно в ходе выполнения приложения.
Как сделать всплывающее меню в delphi
Сегодня мы добавим в наше минимальное приложение главное меню. Но прежде рассмотрим некоторые API функции для работы с ним. Откроем шаблон, написанный в прошлый раз, и дополним список констант и переменных Сначала разберемся с константами. Каждый пункт меню должен иметь свой уникальный идентификационный номер. Так как именно по этим номерам мы и будем работать с меню, удобнее всего оформить их как константы. Идея следующая. В главном меню будет 3 пункта: Menu, Edit и Check. Константы для него начинаются с буквы m и имеют номера 100, 200 и 300 соответственно. Каждому из этих пунктов будет сопоставлено свое подменю. Константы для них начинаются с буквы s и номеруются следующим образом: те, которые относятся к первому пункту, начинаются со 100+1, те, которые относятся ко второму пункту, начинаются с 200+1, ну и по аналогии, те, которые относятся к третьему пункту, начинаются с 300+1. В третьем пункте будет подменю второго уровня, константа для него равна 300+10+1. Отдельное значение имеет константа SEPARATOR, это просто разделитель между пунктами подменю. При добавлении нового пункта приходится выполнить ряд действий, в том числе инициализацию структуры MENUITEMINFO. Так как эти действия нужно производить при добавлении каждого пункта, чтобы избавиться от избыточности кода, оформим эти действия в виде отдельной процедуры. Наше приложение должно реагировать на выбор того или иного пункта меню. Дополним оконную процедуру следующим образом: При выборе пункта Exit (константа sExit) программа будет закрыта. Выбор пунктов Copy, Cut, Paste (константы sCopy, sCut и sPaste соответственно) приведет к появлению сообщения, соответствующего выбранному пункту. Пункт Select (константа sSelect) работает аналогично TCheckBox, то есть может быть установлен или сброшен. При выборе пункта Beep (константа sSecondLevel) мы услышим звуковой сигнал. Теперь для создания меню все готово. Приступаем. Разбираемся. Первым делом создаем главное меню. Указатель на него присваиваем полю lpszMenuName структуры Wc (раньше оно было равно nil ). После регистрации класса в системе создаем подменю. При создании окна, параметр hMenu функции CreateWindowEx равен MainMenu (Handle созданного меню, а не 0, как было в шаблоне). После создания всех пунктов, перерисовываем меню при помощи функции DrawMenuBar. Теперь второй способ создания меню. Здесь я приведу его в сокращении, и поясню произведенные изменения (полный текст программы имеется в архиве с примерами в конце статьи). Все. Теперь у нашей формы есть меню. Это оказалось совсем не сложно. До новых встреч, удачи в программировании.
|