Особенности перерисовки пункта меню

Элемент меню способен реагировать на четыре события, основным из которых считается щелчок 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; просмотров: 769;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.005 сек.