Программирование для IBM OS2


Динамическое создание меню


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

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

Для начала нам нужно определить идентификатор окна меню верхнего уровня. Это можно сделать таким же образом, каким мы определяли этот идентификатор для системного меню:

HWND hwndMenu; hwndMenu = WinWindowFromID ( WinQueryWindow (hWnd, QW_PARENT ), FID_MENU );

Напомним, что окно меню верхнего уровня имеет идентификатор ресурсов FID_MENU .

Следующим нашим действием будет создание пустого меню Edit с помощью функции WinCreateMenu :

HWND hwndEditMenu; hwndEditMenu = WinCreateMenu (HWND_OBJECT , NULL);

Через первый параметр этой функции передается идентификатор родительского окна, которое будет также и окном-владельцем. Второй параметр представляет собой указатель на шаблон меню, подготовленный в оперативной памяти, и в нашем случае не используется.

Так как созданное меню будет иметь идентификатор ресурсов FID_MENU , заменяем этот идентификатор на IDM_EDIT с помощью функции WinSetWindowUShort:

WinSetWindowUShort(hwndEditMenu, QWS_ID, IDM_EDIT);

Теперь можно приступать к добавлению строк в созданное нами пустое меню. Это делается таким же образом, что и добавление строк в системное меню:

mi.iPosition = MIT_END; mi.afStyle = MIS_TEXT; mi.afAttribute = 0; mi.hwndSubMenu = 0; mi.hItem = 0; mi.id = IDM_EDIT_UNDO;

WinSendMsg (hwndEditMenu, MM_INSERTITEM , MPFROMP(&mi), "~Undo");

mi.id = IDM_EDIT_REDO; WinSendMsg (hwndEditMenu, MM_INSERTITEM , MPFROMP(&mi), "~Redo");

После того как все строки добавлены, нужно вставить меню Edit в меню верхнего уровня. Эта операция выполняется аналогично операции вставки строк, с тем лишь исключением, что в поле hwndSubMenu структуры MENUITEM мы должны указать идентификатор окна временного меню Edit:




Начало  Назад  Вперед



Книжный магазин