Особенности перерисовки пункта меню
Элемент меню способен реагировать на четыре события, основным из которых считается щелчок OnClick() – свидетельство выбора этого пункта меню пользователем. Все остальные обработчики предоставляют дополнительные возможности по прорисовке этого элемента меню. Простейший из них:
propertyOnDrawItem: TMenuDrawItemEvent;
typeTMenuDrawItemEvent = procedure(Sender: TObject; ACanvas: TCanvas; ARect: TRect; Selected: Boolean) of object;
где ACanvas – холст пункта меню, ARect – координаты границ холста, доступные для перерисовки, а параметр Selected сигнализирует, выбран данный пункт меню или нет. Рассмотрим пример использования OnDrawItem():
procedureTForm1.MenuItem1DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Selected: Boolean);
Begin
WithACanvas do
Begin
FillRect(aRect);
ifSelected=True thenFont.Style:=Font.Style+[fsUnderline]
elseFont.Style:=Font.Style-[fsUnderline];
TextOut(aRect.Left, aRect.Top, (Sender asTMenuItem).Caption);
end;
end;
В событии OnDrawItem() пункта меню проверяется, выделен он пользователем или нет. Если пункт меню выделен, его заголовок подчеркивается, иначе выводится обычным шрифтом. Второй способ прорисовки пункта меню обладает более богатыми возможностями:
propertyOnAdvancedDrawItem: TAdvancedMenuDrawItemEvent;
typeTAdvancedMenuDrawItemEvent = procedure(Sender: TObject; ACanvas: TCanvas; ARect: TRect; State: TOwnerDrawState) of object;
Расширенные возможности обеспечиваются наличием параметра State, сообщающего текущее состояние данного пункта меню. Теперь мы можем узнать не только о том, выделен этот пункт меню или нет, но и проконтролировать, отмечен ли он галочкой, активен или пассивен и т. д.
typeTOwnerDrawState = set of(odSelected, odGrayed, odDisabled, odChecked,
odFocused, odDefault, odHotLight, odInactive, odNoAccel, odNoFocusRect,
odReserved1, odReserved2, odComboBoxEdit);
Вызов обработчиков событий OnDrawItem() и OnAdvancedDrawItem() произойдет только при условии, что свойство OwnerDraw владельца пункта меню (TMainMenu или TPopupMenu) установлено в true.
И наконец, третий обработчик события, связанный с прорисовкой пункта
меню, решает задачу по динамическому изменению размеров пункта меню.
propertyOnMeasureItem: TMenuMeasureItemEvent;
typeTMenuMeasureItemEvent = procedure(Sender: TObject; ACanvas: TCanvas; varWidth, Height: Integer) of object;
В этом случае ключевыми параметрами будут ширина (Width) и высота
(Height) пункта меню. Этот обработчик может пригодиться, если, например,
требуется ограничить максимальный размер элемента меню.
Класс TMenu
Класс TMenu является каркасом для компонентов TMainMenu и TPopupMenu. Основное назначение класса – служить хранилищем для элементов меню –экземпляров класса TMenuItem. Для этой цели в нем реализовано уже знакомое нам свойство:
propertyItems: TMenuItem; default;
благодаря которому мы получаем доступ к тому или иному элементу меню,
указав соответствующий ему индекс. Например:
MyItem:=MainMenu1.Items.Item[0];
При изменении состава заключенных в меню элементов, при загрузке меню
в память и при изменении свойств, влияющих на структуру меню, возникает событие:
propertyOnChange: TMenuChangeEvent;
typeTMenuChangeEvent = procedure(Sender: TObject; Source: TMenuItem;
Rebuild: Boolean) of object;
где Source указывает на элемент меню, чьи свойства изменяются. Если при
этом параметр Rebuild возвращает значение true, то это свидетельствует
о том, что осуществляются кардинальные изменения, связанные с удалением или созданием элементов меню.
Дата добавления: 2016-03-15; просмотров: 760;