Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

DiVM / OOP / 12_116608_1_51491

.pdf
Скачиваний:
26
Добавлен:
11.05.2015
Размер:
6.45 Mб
Скачать

Alignment Определяет место появления меню относительно указателя мыши: paLeft — левый верхний угол меню совпадает с позицией курсора мыши; paCenter — середина верхнего края меню совпадает с позицией курсора мыши; paRight — правый верхний угол меню совпадает с позицией курсора мыши.

AutoHotkeys Значение maAutomatic избавляет программиста от необходимости назначать пунктам меню "горячие" клавиши (с помощью специального символа & в тексте пунктов); компонент автоматически подбирает "горячие" клавиши. Значение maManual требует, чтобы "горячие" клавиши назначил программист (см. параграф 8.1.3).

AutoLineReducti

Если равно значению maAutomatic, то при

on

отображении меню подряд идущие пункты-

 

разделители рисуются как один разделитель, а пункты-

 

разделители, находящиеся в начале или конце меню

 

вообще не показываются. Свойство AutoLineReduction

 

применяется при программном добавлении и удалении

 

пунктов меню, чтобы избежать нежелательных

 

явлений вроде повторяющихся и повисших

 

разделительных

линий.

Если

свойство

 

AutoLineReduction равно значению maManual, то все

 

пункты меню отображаются как есть.

 

AutoPopup

Если равно значению True, то меню появляется

 

автоматически по нажатию правой кнопки мыши. Если

 

равно значению False, то меню необходимо

 

отображать программно.

 

 

Images Список значков, отображаемых рядом с пунктами меню. Свойство Images используется совместно со свойством ImageIndex компонентов MenuItem (см. параграф 8.1.12).

Items

Обеспечивает нумерованный доступ к пунктам меню.

MenuAnimation Набор флажков, определяющих способ появления меню на экране: maLeftToRight — слева направо, maRightToLeft — справа налево, maTopToBottom

сверху вниз, maBottomToTop — снизу вверх, maNone

мгновенное отображение. Чтобы флажки начали работать, запустите программу настройки экрана

(Start–>Settings–>Control Panel–>Display) и на вкладке

Effects выберите способ появления меню и подсказок

Scroll Effect.

OwnerDraw Если равно значению True, то каждый пункт меню получает возможность участвовать в процессе своего отображения при помощи специальных событий

OnMeasureItem и OnDrawItem. Событие

271

 

OnMeasureItem происходит в пункте меню, когда

 

расчитываются размеры пункта. Событие OnDrawItem

 

происходит в пункте меню, когда пункт рисуется на

 

экране. Если свойство OwnerDraw равно значению

 

False, то пукнты меню имеют стандартный вид и

 

события OnMeasureItem и OnDrawItem не

 

происходят.

TrackButton

Кнопка мыши для выбора пункта меню: tbLeftButton

 

— левая кнопка, tbRightButton — еще и правая

 

кнопка.

OnChange

Происходит при изменении структуры меню.

OnPopup

Происходит при вызове меню пользователем.

Таблица 8.4. Важнейшие свойства и события компонента PopupMenu

Шаг 18. Контекстное меню наполняется пунктами, как и главное меню, в дизайнере меню. Двойным щелчком мыши на компоненте PopupMenu откройте окно констурктора меню и, используя уже известные вам приемы, добавьте в меню пункты Half Size (с идентификатором HalfSizePopupItem), Normal Size (с идентификатором

NormalSizePopupItem) and Double Size (с идентификатором DoubleSizePopupItem). Во всех пунктах контекстного меню установите следующие свойства:

Enabled = False

GroupIndex = 1

RadioItem = True

Кроме этого пометьте пункт Normal Size, установив в нем свойство Checked в значение True. Таким образом, команды всплывающего меню дублируют некоторые команды главного меню, обеспечивая пользователю дополнительные удобства (рисунок 8.17).

272

Рисунок 8.17. Команды контекстного меню

Проектирование меню завершено и сейчас перейдем к программированию обработчиков событий. В данном примере команды контекстного меню обрабатываются так же, как и команды одноименных пунктов главного меню. Поскольку для пунктов главного меню обработчики уже написаны, то их просто нужно связать с пунктами контекстного меню. Это делается очень просто.

Шаг 19. Активизируйте в дизайнере меню пункт Half Size и выберите в окне свойств вкладку Events. Выберите обработчик HalfSizeMenuItemClick из раскрывающегося списка события OnClick. То же самое проделайте с пунктами Normal Size и Double Size, установив для них обработчики NormalSizeMenuItemClick и DoubleSizeMenuItemClick соответственно

(рисунок 8.18).

Рисунок 8.18. Установка обработчиков команд контекстного меню

Шаг 20. Для синхронной работы главного и контекстного меню нужно еще подправить некоторые обработчики:

273

procedure TPictureForm.HalfSizeMenuItemClick(Sender: TObject); begin

// Показать рисунок половинного размера

HalfSizeMenuItem.Checked := True;

HalfSizePopupItem.Checked := True; end;

procedure TPictureForm.NormalSizeMenuItemClick(Sender: TObject); begin

// Показать рисунок нормального размера

NormalSizeMenuItem.Checked := True;

NormalSizePopupItem.Checked := True; end;

procedure TPictureForm.DoubleSizeMenuItemClick(Sender: TObject); begin

// Показать рисунок двойного размера

DoubleSizeMenuItem.Checked := True;

DoubleSizePopupItem.Checked := True; end;

procedure TPictureForm.EnableCommands(Enable: Boolean); begin

SaveAsMenuItem.Enabled := Enable;

CloseMenuItem.Enabled := Enable; HalfSizeMenuItem.Enabled := Enable; HalfSizePopupItem.Enabled := Enable; NormalSizeMenuItem.Enabled := Enable; NormalSizePopupItem.Enabled := Enable; DoubleSizeMenuItem.Enabled := Enable; DoubleSizePopupItem.Enabled := Enable;

end;

Шаг 21. Контекстное меню готово, осталось сделать так, чтобы оно вызывалось по щелчку правой кнопки мыши на форме. Нет ничего проще — активизируйте форму и запишите в значении свойства PopupMenu имя разработанного ранее контекстного меню — PopupMenu. Вы можете ввести это значение с клавиатуры или выбрать из раскрывающегося списка (рисунок 8.19).

Рисунок 8.19. Привязка контекстного меню к форме

Готово, выполните компиляцию и запустите программу. Нажатие правой кнопки мыши в окне приложения вызовет появление контекстного меню. Все его пункты окажутся

274

недоступными. Чтобы пункты контекстного меню заработали, выполните команду главного меню File | Open. После этого проверьте, что контекстное меню работает синхронно с главным меню.

8.1.12. Значки в пунктах меню

Каждый пункт меню помимо текста может содержать красочный значок, наглядно поясняющий назначение пункта. Самый простой способ создания значка в пункте меню — установить свойство Bitmap.

Шаг 22. Вызовите дизайнер меню для компонента MainMenu формы PictureForm. Выберите пункт File | Open и перейдите к свойству Bitmap в окне свойств (рисунок 8.20).

Рисунок 8.20. Свойство Bitmap пункта меню

Шаг 23. Установка значения свойства Bitmap осуществляется с помощью уже знакомого вам окна Picture Editor (рисунок 8.21), вызываемого нажатием кнопки с многоточием в поле свойства. В этом окне нажмите кнопку Load... и выберите файл Open.bmp из коллекции рисунков на компакт-диске (каталог \Images).

275

Рисунок 8.21. Окно Picture Editor

Наконец, закройте диалоговое окно с помощью кнопки OK. Результат показан на рисунке

8.22.

Рисунок 8.22. Пункт Open имеет значок

Такой способ создания значков в меню очень прост, но не всегда удобен. В тех случаях, когда количество пунктов меню исчисляется десятками и многие пункты главного меню дублируются в контекстных меню и панели кнопок, использовать для каждого пункта отдельную копию одного и того же значка не эффективно, да и неудобно. В таких случаях на помощь приходит компонент ImageList. Его основные свойства приведены в таблице 8.5.

Как вы уже могли догадаться из названия компонента ImageList, он предназначен для хранения заранее подготовленного списка значков (в общем случае, любых рисунков). Другие компоненты берут значки из этого списка по номеру. Поскольку для хранения номера требуется гораздо меньше памяти, чем для хранения самого значка, то при

276

использовании одного и того же значка в нескольких компонентах, достигается значительная экономия памяти. Да и управлять значками с помощью компонента ImageList тоже очень удобно. Если изменить значок в списке, то он автоматически изменится во всех компонентах, которые его используют. Существует лишь одно ограничение при использовании компонента ImageList — все хранимые значки должны иметь одинаковые размеры.

Свойство Описание

Width, Ширина и высота рисунков в списке.

Height

AllocBy Приращение массива. Когда массив полностью заполнен и делается попытка добавить новый рисунок, размер массива увеличивается на AllocBy элементов. Используется для оптимизации скорости добавления элементов и занимаемой ими памяти.

BkColor Цвет фона. Этим цветом запоняются те части рисунков, которые должны быть прозрачными. Значение clNone оставляет фон прозрачным.

BlendColor

DrawingSty le

ImageType

Masked

Цвет, которым подсвечиваются рисунки. Наличие подсветки и ее яркость зависит от значения свойства DrawingStyle.

Способ отображения рисунков:

dsFocus — легкая (25%) подсветка цветом BlendColor; dsSelected — сильная (50%) подсветка цветом BlendColor;

dsNormal — подсветка отсутствует, цвет фона берется из свойства BkColor. Если свойство BkColor содержит значение clNone, то фон прозрачный.

dsTransparent — подсветка отсутствует, цвет фона прозрачный независимо от значения свойства BkColor.

Значение этого свойства может игнорироваться стандартными компонентами. Оно полезно, если рисунки из списка отображаются программно с помощью метода Draw.

Выбирает между отображением рисунков (значение tiImage) и их масок (значение tiMask).

Значение этого свойства может игнорироваться стандартными компонентами. Оно полезно, если рисунки из списка отображаются программно с помощью метода Draw.

Если равно значению True, то при добавлении рисунка в список для него создается специальная маска. Маска описывает фоновые пиксели рисунка и используется при выводе рисунка на экран. Наличие маски позволяет манипулировать фоном рисунка с помощью свойств

BkColor и DrawingStyle. Если свойство Masked равно значению False, то рисунок помещается в список без маски и всегда рисуется как есть. В этом случае свойство BkColor

277

игнорируется, а значение dsTrasnparent в свойстве DrawingStyle не производит эффекта.

ShareImage Если равно значению False, то при уничтожении компонента

sуничтожается также соответствующий объект операционной системы Windows, который скрыт внутри компонента ImageList. Если равно значению True, то при уничтожении компонента связанный с ним объект операционной системы не уничтожается, что позволяет использовать этот объект за пределами библиотеки VCL.

OnChange Происходит при любом изменении списка.

Таблица 8.5. Основные свойства и события компонента ImageList

Воспользуемся компонентом ImageList для хранения значков в нашей программе. Найдите его в палитре компонентов на вкладке Win32 (рисунок 8.23).

Рисунок 8.23. Компонент ImageList

Поместите компонент ImageList на форму и дайте ему имя ImageList. Обратите внимание, что стандартные значения свойств Width и Height равны 16, поэтому не забудьте их изменить, если ваши значки имеют другие размеры.

Шаг 24. Редактирование списка рисунков осуществляется в специальном окне. Вызовите его с помощью команды ImageList Editor…, находящейся в контекстном меню компонента

ImageList (рисунок 8.24).

278

Рисунок 8.24. Вызов окна для редактирования списка значков

Шаг 25. В открывшемся окне (рисунок 8.25) нажмите кнопку Add... и выберите несколько файлов из коллекции рисунков на компакт-диске (каталог \Images).

Рисунок 8.25. Окно, в котором редактируется список значков

В этом окне параметры Transparent Color, Fill Color и Options нуждаются в пояснении. Параметр Transparent Color — это цвет пикселей, которые становятся прозрачными. Параметры Options и Fill Color используются, если размеры рисунка не совпадают с размерами, указанными в свойствах Width и Height компонента ImageList. Параметр Options принимает следующие значения: Crop — заполнить лишние пиксели цветом Fill Color (либо отсечь правую нижнюю часть рисунка, если рисунок превышает размеры); Stretch — растянуть/сжать рисунок до принятых размеров; Center — центрировать рисунок, заполнив оставшуюся область цветом Fill Color.

Закройте диалоговое окно с помощью кнопки OK.

Шаг 26. Список значков мы подготовили. Теперь нужно указать нашему компоненту MainMenu, откуда брать значки для своих пунктов. Выделите компонент MainMenu на форме и перейдите к свойству Images в окне свойств. Из списка значений свойства Images выберите элемент ImageList.

Шаг 27. Теперь осталось указать пунктам меню номера соответствующих им значков. Для этого вызовите дизайнер меню для компонента MainMenu. Как это сделать, вы уже знаете. Далее выберите пункт Open... (программный идентификатор OpenMenuItem), перейдите к свойству ImageIndex и выберите из раскрывающегося списка подходящий значок (рисунок

8.26).

279

Рисунок 8.26. Установка значка для пункта меню

Аналогично установите номера соответствующих значков для пунктов Save As…, Half Size, Normal Size и Double Size. Не пугайтесь внешнего вида значков в недоступных пунктах меню. Они, как и текст, отображаются блеклыми.

На рисунке 8.27 показана форма после добавления значков.

Рисунок 8.27. В меню добавлены значки

Шаг 28. Теперь установим значки для пунктов контекстного меню нашей формы. Активизируйте форму PictureForm и выберите на ней компонент PopupMenu. Затем в окне свойств перейдите к свойству Images и из списка значений этого свойства выберите элемент ImageList. После этого вызовите дизайнер меню у компонента PopupMenu, и аналогично тому, как вы это делали в главном меню, назначьте номера подходящих значков для пунктов

Half Size, Normal Size и Double Size контекстного меню.

280