|
Елементи керування
Головне меню - MainMenu (модуль Ctl)
Політівське головне меню - це ряд кнопок, кожна з яких відкриває меню. Тобто технічно цей елемент керування дуже, просто дуже схожий на кнопку-меню. Тільки тут багаторівневе меню перетворюється на набір кнопок-меню: елементи меню першого рівня стають кнопками, а другого і далі потрапляють у меню відповідних кнопок. Про роботу з меню, а тим більш ієрархічними, я ще не розповідав. Зробимо так само, як і з кнопкою меню - тут я наведу маленький приклад, а по-справжньому меню ми розглянемо потім.
Створити головне меню
Function MainMenu_Create(Prog:PProg; VMenu:PMenuItem;
VPicturePos:TPicturePos): PControl;
- VMenu - вказівник на меню.
- VPicturePos - положення картинок на кнопках, з яких складатиметься меню. Так само, як і для кнопок (Button), може бути ppLeft (зліва від текста) або ppTop (над текстом).
Намалювати головне меню
Procedure MainMenu_Paint(Me:PControl; VX1, VY1, VX2:Integer);
- VX1, VY1 - координати лівого верхнього кута меню (рядка кнопок)
- VX2 - зараз ігнорується :\.
Приклад, кажете... Зараз щось придумаємо. Давайте зробимо формочку з
досить стандартним для Windows-них програм меню: File (New, Open, Save, Exit), Edit (Cut, Copy, Paste), Help (Help Topics, About). Отже робимо заготовочку на ім'я TestMmn, додаємо в Uses модуль Popup, заводимо змінні:
MnuTest: PMenuItem; { власне меню }
MmnMain: TMainMenu;
Заводимо процедуру створення меню:
Procedure MakeMenu(Me:PProg);
Var
TempMenu: PMenuItem;
Begin
With Me^, TTestMmnData(Me^) Do
Begin
MnuTest:=Popup.CreateMenu;
TempMenu:=Popup.AddSubmenu(MyMenu, 'File', '', Nil, True);
Popup.AddCommand(TempMenu, 'New', 'Ctrl+N', '',
Nil, True, Popup.DummyProc);
Popup.AddCommand(TempMenu, 'Open...', 'Ctrl+O', '',
Nil, True, Popup.DummyProc);
Popup.AddCommand(TempMenu, 'Save', 'Ctrl+S', '',
Nil, True, Popup.DummyProc);
Popup.AddSpace(TempMenu);
Popup.AddCommand(TempMenu, 'Exit', 'Alt+F5', '',
Kernel.PicClose, True, Popup.DummyProc);
TempMenu:=Popup.AddSubmenu(MyMenu, 'Edit', '', Nil, True);
Popup.AddCommand(TempMenu, 'Cut', 'Ctrl+X', '',
Kernel.PicCut, True, Popup.DummyProc);
Popup.AddCommand(TempMenu, 'Copy', 'Ctrl+C', '',
Kernel.PicCopy, True, Popup.DummyProc);
Popup.AddCommand(TempMenu, 'Paste', 'Ctrl+V', '',
Kernel.PicPaste, True, Popup.DummyProc);
TempMenu:=Popup.AddSubmenu(MyMenu, 'Help', '', Nil, True);
Popup.AddCommand(TempMenu, 'Help Topics', 'F1', '',
Nil, True, Popup.DummyProc);
Popup.AddCommand(TempMenu, 'About', '', '',
Nil, True, Popup.DummyProc);
End
End;
Ну і нарешті в OnInit пишемо:
MakeMenu(Me);
MmnMain:=Ctl.MainMenu_Create(Me, MyMenu, ppLeft);
Все, можна запускати та дивитись. А після цього пропоную уважніше
подивитись на процедурку MakeMenu. Наскільки я розумію, мені доведеться дещо в ній пояснити :).
Ну, по-перше, це принцип створення вкладених (ієрархічних) меню.
Для цього в модулі Popup є така функція:
Function AddSubmenu(Var Parent:PMenuItem; VName,VHint:String;
VIcon:Pointer; VEnabled:Boolean): PMenuItem;
Ми передаємо їй звичайні параметри (меню Parent, назву VName та хінт VHint, іконку VIcon та флажок доступності VEnabled), а вона повертає нам вказівник на створене підменю. Тепер щоб додати елементи саме в це підменю, ми викликаємо AddCommand із цим вказівником. Тобто кажемо юніту Popup: "додай нам командочку в меню, тільки не в наше основне меню, а в ось це підменю".
По-друге я ще не розповідав про процедурку Popup.AddSpace. Насправді тут і розповідати нічого - вона додає в меню роздільник (порожнє місце).
Ну і по-третє вас міг здивувати запис типу Kernel.PicClose на місці іконки елемента меню. Особливо через те, що це працює :) і в меню дійсно додаються іконки. Отже, політівський кернел намагається зробити програмерам маленьку послугу та при запуску завантажує кілька іконок загального призначення:
- Kernel.PicOK - іконка "OK" (галочка)
- Kernel.PicApply - іконка "Спробувати" (кружечок)
- Kernel.PicClose - іконка "Закрити" (хрестик)
- Kernel.PicCut - іконка "Вирізати" (ножиці)
- Kernel.PicCopy - іконка "Зкопіювати" (два листочки)
- Kernel.PicPaste - іконка "Вставити" (дошка та листочок)
| |