Завантаження динамічних меню в CBuilder

Після попередньої дискусії ви могли подумати, що завантаження меню з файлу ресурсу буде досить простим завданням У меню є свій тип посилань, іменований HMENU, і його можна завантажити з ресурсу за допомогою функції API LoadMenu Так що ви могли вирішити, що для завантаження меню з файлу ресурсу достатньо написати приблизно такий рядок коду:

MainMenu1-&gtHandle = LoadMenu( HInstance, MAKEINTRESOURCE(ID_MY_MENU))

Ви могли б так подумати проте суть в тому, що це не працює Меню обробляються Windows API по-іншому, ніж растрові малюнки, значки або рядки, так як меню є частиною вікна, в той час як все інше – окремі елементи, не повязані з чим-небудь Я був, по правді кажучи, злегка здивований, що компанія Borland не оформили функціональність меню так само, як оформлено все інше, але, зрештою, не треба спокушатися, що хтось зробить за вас всю роботу

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

Однак виходить, що ми можемо емулювати динамічне завантаження елементів меню, роблячи це вручну Для цього помістіть на форму компонент TMainMenu (Головне меню) без елементів Форма, яку ми використовуємо, наведена на рис 102 Як бачите, на ній немає нічого, крім

головного меню без елементів

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

1001 MENU PRELOAD DISCARDABLE BEGIN

POPUP &quot&ampFile&quot

BEGIN

MENUITEM &quot&ampNew\tCtrl+N&quot, 101

MENUITEM &quot&ampOpen..\tCtrl+O&quot, 102 MENUITEM &quot&ampP&amprint setup..&quot, 103 MENUITEM &quot&ampRecent File&quot, 104 MENUITEM &quotE&ampxit&quot, 105

END

POPUP &quot&ampView&quot BEGIN

MENUITEM &quot&ampToolbar&quot, 106 MENUITEM &quot&ampStatus bar&quot, 107 END

POPUP &quot&ampHelp&quot BEGIN

MENUITEM &quot&ampAbout&quot, 108 END

END

Рис 102 Форма прикладу динамічного меню

Додавання файлу ресурсів у проект – справа нехитра Виберіть команду меню Project д Add to project і виберіть файл ресурсу зі списку, задавши маску файлів * Rc (опису ресурсів) CBuilder знає про файли ресурсів достатньо, так що він автоматично їх скомпілює і повяже з виконуваним файлом під час складання програми

Отже, у нас тепер є деякі ресурси, приєднані до проекту Потрібен нам той, в якому визначено наше меню Тепер пора навчитися завантажувати цей ресурс з виконуваного файлу під час роботи програми Якби у вас було кілька меню, то ви могли б вибирати з них одне, грунтуючись на якому-небудь своєму критерії, і точно таким же чином завантажувати Давайте

подивимося на сам код, який завантажує меню з ресурсу і вбудовує його у форму:

void __fastcall TForm1::FormCreate(TObject *Sender)

{

/ / Завантажити ресурс меню з файлу ресурсів

HMENU hMenu = LoadMenu((HINSTANCE) HInstance, MAKEINTRESOURCE(1001))

/ / Отримати кількість підменю у цьому меню

int nCount = GetMenuItemCount(hMenu)

/ / Пройтися по всіх пунктах,

/ / Отримуючи потрібну інформацію

for ( int i=0 i&ltnCount ++i )

{

/ / Отримати підміню

HMENU hSubMenu = GetSubMenu( hMenu, i )

/ / Скільки підпунктів в цьому меню char szBuffer [80]

int nSubCount = GetMenuItemCount( hSubMenu ) GetMenuString(  hMenu,i,szBuffer,80,MF_BYPOSITION) TMenuItem *pMenuItem = new TMenuItem(MainMenu1) pMenuItem-&gtCaption = szBuffer

MainMenu1-&gtItems-&gtAdd( pMenuItem )

/ / Отримати інформацію про підміню

for ( int nSubPos = 0 nSubPos&ltbSubCount ++nSubPos)

{

GetMenuString(  hSubMenu,nSubPos,szBuffer, 80,MF_BYPOSITION )

TMenuItem *pSubMenuItem = new TMenuItem(pMenuItem) pSubMenuItem-&gtCaption = szBuffer

pMenuItem-&gtAdd( pSubMenuItem )

}

}

}

Джерело: Теллес М – 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>

*

*