Динамічне завантаження меню в CBuilder

Для того щоб завантажити ресурс меню з ресурсів, що у виконуваному файлі (або будь-який інший тип ресурсів, в даному випадку), вам потрібно знати ідентифікатор ресурсу Це той ID, який ми написали у вираженні MENU у файлі ресурсу Цей ідентифікатор передається функції API LoadMenu для отримання посилання на ресурс меню Ось де починаються чудеса

Коли ми завантажили меню, нам потрібно знати, скільки пунктів головного меню (верхня смуга) буде в даному меню Це виходить викликом функції API GetMenuItemCount, Яка має один параметр – посилання1 на меню, з яким ми працюємо Це працює з головними меню або ж підміню У даному випадку ми передаємо посилання на головне меню і отримуємо кількість підменю в ньому

Для додавання пунктів меню ми пробігаємо по всіх підменю для даного ресурсу меню Кожне підміню додається в головне: створюється обєкт типу TMenuItem для підміню, і його властивість Caption встановлюється в потрібне імя підменю Усередині підменю ми повторюємо весь процес Ми отримуємо кількість пунктів підменю і потім створюємо кожен з них

Важливою функцією, використовуваної нами, є функція APIGetMenuString Ця функція

поверне вам імя (назва) пункту в меню по його позиції в підміню (головному меню) Володіючи цією інформацією, ми легко додамо пункт меню з правильною назвою в потрібне місце меню

Цей приклад не отримує ідентифікатори команд з меню і не привласнює їх Це робиться легко, але не потрібно, якщо ви не збираєтеся працювати з ідентифікаторами команд Набагато простіше зіставити обробник події безпосередньо пунктам меню при їх створенні, дозволивши системі CBuilder призначати ідентифікатори команд автоматично при створенні пунктів меню

Єдине, чого цей приклад не показує, – коректна обробка роздільників В принципі, неважко отримати цю інформацію з ресурсу меню, прочитаного з файлу ресурсу (використовуючи функцію API GetMenuState і перевіряючи прапори на предмет, чи є пункт меню роздільником) Я залишаю це за рамками прикладу, щоб його було простіше зрозуміти

Це все чудово і прекрасно, говорите ви, але якщо я хочу завантажувати меню динамічно, як я видалю існуючі пункти меню Ну, якщо ви трохи почекаєте, я поясню вам, як це зробити

Давайте додамо можливість видалення всіх пунктів з меню під час роботи програми Тоді, якщо вам захочеться, ви зможете додавати нові пункти в меню Я навіть покажу вам, як динамічно додавати пункти меню

1 Тут і далі в основному під посиланням розуміється не елемент мови C + +, а термін, по-англійськи звучить як handle, який використовується для ідентифікації різноманітних обєктів у системі Windows – Прямуючи перев

По-перше, змініть форму: додайте дві кнопки з назвами Видалити все і Додати пункти Нова форма показана на рис 103 Перша кнопка буде використовуватися для видалення всіх існуючих пунктів з меню, а друга буде робити те, що ми вже робили при створенні форми – динамічно додавати пункти меню

Рис 103 Змінена форма з динамічним меню

Замість того щоб заново набирати весь код для обробки натискання на кнопку Додати пункти, створіть функцію AddMenuItems Перемістіть весь код з методу FormCreate у функцію AddMenuItems Потім в методі FormCreate напишіть простий виклик цієї функції:

void __fastcall TForm1::FormCreate(TObject *Sender)

{

AddMenuItems()

}

Наступним кроком є ​​видалення пунктів меню Це просто, як ви і могли подумати Зрештою, пункти меню зберігаються у властивості Items обєкта TMainMenu Властивість Items (Елементи), як і всі властивості Items в VCL, має набір функцій для установки і видалення елементів У даному випадку, однак, замість методу Remove (Який є стандартним способом видалення елементів зі списку) ми використовуємо метод Delete Цей метод видалить меню і всі підменю зі списку, а також звільнить память, повязану з пунктами меню Метод Remove не звільняє память, так що частина памяті була б втрачена у вашому додатку Ось код обробника натискання на кнопку Видалити все:

void __fastcall TForm1::Butoon1Click(TObject *Sender)

{

while ( MainMenu1-&gtItems-&gtCount &gt 0 ) MainMenu1-&gtItems-&gtDelete( 0 )

}

Оброблювач натискання на кнопку Додати пункти, звичайно, являє собою просто виклик функції AddMenuItems:

void __fastcall TForm1::Button2Click(TObject *Sender)

{

AddMenuItems()

}

Отже, у вас є закінчений метод для динамічного завантаження пунктів меню з ресурсу і видалення існуючих пунктів з меню на екрані Все в одному компактному невеликому пакеті, який ви легко можете перемістити в іншу програму Непогано

Джерело: Теллес М – Borland C + + Builder Бібліотека програміста – 1998

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*