![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Особенности перерисовки пункта меню
Элемент меню способен реагировать на четыре события, основным из которых считается щелчок OnClick() – свидетельство выбора этого пункта меню пользователем. Все остальные обработчики предоставляют дополнительные возможности по прорисовке этого элемента меню. Простейший из них: property OnDrawItem: TMenuDrawItemEvent; type TMenuDrawItemEvent = procedure (Sender: TObject; ACanvas: TCanvas; ARect: TRect; Selected: Boolean) of object;
где ACanvas – холст пункта меню, ARect – координаты границ холста, доступные для перерисовки, а параметр Selected сигнализирует, выбран данный пункт меню или нет. Рассмотрим пример использования OnDrawItem(): procedure TForm1.MenuItem1DrawItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect; Selected: Boolean); Begin WithACanvas do Begin FillRect(aRect); if Selected=True then Font.Style: =Font.Style+[fsUnderline] else Font.Style: =Font.Style-[fsUnderline]; TextOut(aRect.Left, aRect.Top, (Sender as TMenuItem).Caption); end; end;
В событии OnDrawItem() пункта меню проверяется, выделен он пользователем или нет. Если пункт меню выделен, его заголовок подчеркивается, иначе выводится обычным шрифтом. Второй способ прорисовки пункта меню обладает более богатыми возможностями: property OnAdvancedDrawItem: TAdvancedMenuDrawItemEvent; type TAdvancedMenuDrawItemEvent = procedure (Sender: TObject; ACanvas: TCanvas; ARect: TRect; State: TOwnerDrawState) of object;
Расширенные возможности обеспечиваются наличием параметра State, сообщающего текущее состояние данного пункта меню. Теперь мы можем узнать не только о том, выделен этот пункт меню или нет, но и проконтролировать, отмечен ли он галочкой, активен или пассивен и т. д. type TOwnerDrawState = set of (odSelected, odGrayed, odDisabled, odChecked, odFocused, odDefault, odHotLight, odInactive, odNoAccel, odNoFocusRect, odReserved1, odReserved2, odComboBoxEdit); Вызов обработчиков событий OnDrawItem() и OnAdvancedDrawItem() произойдет только при условии, что свойство OwnerDraw владельца пункта меню ( TMainMenu или TPopupMenu ) установлено в true. И наконец, третий обработчик события, связанный с прорисовкой пункта меню, решает задачу по динамическому изменению размеров пункта меню. property OnMeasureItem: TMenuMeasureItemEvent; type TMenuMeasureItemEvent = procedure (Sender: TObject; ACanvas: TCanvas; var Width, Height: Integer) of object; В этом случае ключевыми параметрами будут ширина (Width) и высота (Height) пункта меню. Этот обработчик может пригодиться, если, например, требуется ограничить максимальный размер элемента меню.
|