Программирование для 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:


mi.iPosition = 1; mi.afStyle = MIS_TEXT | MIS_SUBMENU; mi.afAttribute = 0; mi.id = IDM_EDIT; mi.hwndSubMenu = hwndEditMenu;

WinSendMsg (hwndMenu, MM_INSERTITEM , MPFROMP(&mi), "~Edit");

Так как мы добавляем меню, то в поле стилей дополнительно указывается константа MIS_SUBMENU.

В поле iPosition мы указали значение, равное единице, поэтому меню Edit будет вставлено во вторую позицию слева. Это стандартное расположение для меню Edit, так как перавая позиция (имеющая нулевой порядковый номер), предназначена для меню File.

Для удаления строки из меню или временного меню вы можете воспользоваться сообщением MM_DELETEITEM .

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

Во второй параметр для сообщения MM_DELETEITEM вам нужно записать адрес заполненной структуры MENUITEM .


Содержание раздела