На этом шаге мы рассмотрим компонент TRxMainMenu.
Компонент TRxMainMenu является наследником стандартного класса TMainMenu и предназначен для создания owner-draw меню с возможностью отрисовки его пунктов в вашем приложении. При значении свойства Style = msStandard поведение меню ничем не отличается от стандартного компонента - отрисовка пунктов меню выполняется системой Windows. При установке свойства Style в значение, отличное от msStandard отрисовку пунктов меню выполняет компонент TRxMainMenu. В этом случае вы можете обработать событие OnGetItemParams для изменения шрифта или цвета пункта меню, а также для задания графического изображения, которое вы хотите поместить в этот пункт меню. Для более полного контроля за отрисовкой пунктов меню вы можете воспользоваться также событиями OnMeasureItem и OnDrawItem.
Рассмотрим свойства компонента TRxMainMenu.
Свойство | Описание |
---|---|
property Style: TRxMenuStyle; | Свойство Style определяет, будет ли отрисовка меню производиться стандартными средствами Windows, или же вы можете использовать свой собственный код для отрисовки пунктов меню (owner-draw), например, для помещения в меню графических изображений. Для создания owner-draw меню задайте значение свойству Style, отличное от msStandard. В этом случае вы сможете обработать события OnMeasureItem, OnDrawItem и OnGetItemParams. |
property OnGetItemParams: TItemParamsEvent; | Событие происходит перед отрисовкой каждого пункта меню, если свойство Style установлено в значение, отличное от msStandard. В обработчике события OnGetItemParams вы можете изменить шрифт и фоновый цвет пункта меню, а также задать графическое изображение (битовое изображение, иконку, метафайл и т.д.) для отображения в левой части пункта меню. Параметр NumGlyphs определяет, сколько картинок содержит графическое изображение Graphic. Если он отличен от 1, то второе изображение используется при отрисовке запрещенного пункта меню, третье - при отрисовке выбранного пункта меню, четвертое - отмеченного (checked), остальные картинки не используются. Событие не происходит, если свойство Style = msStandard. В 32-битной версии, если задано свойство Images и обработчик события OnGetImageIndex возвращает допустимое значение параметра ImageIndex, то для отрисовки пункта меню используется изображение из image-list'а, а параметры Graphic и NumGlyphs игнорируются. |
property OnMeasureItem: TMeasureMenuItemEvent; | Событие OnMeasureItem происходит когда приложению необходимо перерисовать пункт меню, имеющего
стиль owner-draw. Используйте это событие для изменения высоты и ширины пункта меню.
Событие OnMeasureItem имеет тип TMeasureMenuItemEvent и имеет 4 паратметра:
|
property OnDrawItem: TDrawMenuItemEvent; | Событие OnDrawItem происходит при отрисовке каждого пункта меню, если значение свойства Style не равно msStandard. В обработчике этого события вы можете произвести необходимые действия по отрисовке пункта меню, заданного параметром Item. Отрисовку надо производить в прямоугольнике, заданном параметром Rect, пользуясь значением свойства Canvas. Параметр State определяет состояние пункта меню (выбранный, запрещенный или помеченный). |
Рассмотрим пример использования компонента TRxMainMenu. Поместим на форму компоненты: TRxMainMenu и TImageList (он будет содержать изображения для пунктов нашего меню). Сперва создадим меню, как в обычном компоненте TMainMenu. (рис. 1)
Рис.1. Форма с размещенными компонентами
Изменим свойство Style на msBtnLowered. Теперь наше меню отличается от стандартного msStandart. Загрузим изображения для пунктов нашего меню в ImageList1. Каждому изображению соответствует свой номер ImageIndex. Напишем обработчик события OnGetItemParamsкоторый будет добавлять изображения к нашим пунктам меню для компонента TRxMainMenu:
procedure TForm1.RxMainMenu1GetItemParams(Sender: TMenu; Item: TMenuItem; State: TMenuOwnerDrawState; AFont: TFont; var Color: TColor; var Graphic: TGraphic; var NumGlyphs: Integer); begin Form1.New1.ImageIndex:=0; Form1.Open1.ImageIndex:=1; Form1.Exit1.ImageIndex:=2; Form1.Copy1.ImageIndex:=3; Form1.Paste1.ImageIndex:=4; Form1.Cut1.ImageIndex:=5; end;
Запустим программу. Теперь наше меню выглядит, как на рисунке (рис. 2):
Рис.2. Работа приложения
Текст этого примера можно взять здесь.
На следующем шаге мы рассмотрим компонент TPopupMenu.