Формирование и использование меню. Краткая теория, страница 5

При добавлении новой команды к меню указывается, что вместо текста используется растровое изображение;

Используя функцию ModifyMenu, текст текущей команды меню меняется на изображение.

В приведенном ниже примере загружается растровое изображение MyBitmap, которое замещает существующую команду меню, используя функцию ModifyMenu.

Var

MyMenu:hMenu; MyBitmap:hBitmap;

.....

MyBitmap :=LoadBltmap(hlnstance,'MyBitmap');

.....

MyMenu :=GetMenu(hWnd); ModifyMenu(MyMenu,

idm_XXX,

mf_ByCommand OR mf_Bitmap,

idm_XXX, MyBltmap);

Замена меню

Имеется возможность замены меню целиком, используя функцию SetMenu. Обычно замена происходит в том случае, если в прикладной программе (в результате изменения ряда опций) полностью изменяется набор команд. Ниже показано, как изменить существующее меню на другое.

Var

MyMenu: hMenu; NewMenu: hMenu;

.....

MyMenu :=GetMenu(hWind); NewMenu := LoadMenu(hlnstance,'NewMenu'); SetMenu(hWind,NewMenu);

Функция GetMenu используется для получения ссылки на существующее меню окна, задаваемого своей ссылкой hWind. Ссылка на старое меню может быть использована в дальнейшем для восстановления этого меню или для полного его уничтожения.

Уничтожение меню

Для неразрушающего удаления из меню команды и связанного с ней подменю служит функция RemoveMenu. Параметры этой функции аналогичны параметрам функции DeleteMenu. Удаленное подменю может быть использовано в последующих операциях.

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

Создание подменю

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

Mh := CreatePopupMenu; if Mh<> 0 then Begin

AppendMenu(Attr.Menu, mg_Popup, Mh, '&Advanced');

AppendMenu(Mh, mf_String,cm_ltem1, 'Item1');

AppendMenu(Mh, mf_String,cm_ltem1,'ltem1'); End; DrawMenuBar(HWindow);

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

Создание нового меню

Хотя это менее удобно и практично, имеется возможность динамического создания меню с помощью функции CreateMenu. Чтобы добавить команды к созданому меню, используются функции AppendMenu иInsertMenu. Функция CreateMenu возвращает ссылку на созданное меню, которая затем используется для работы с этим меню.

Инициализация меню

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

Перед тем, как Windows отображает меню, оконной функции того окна, которое владеет данным меню, посылается сообщение wm_InitMenu. Обработка этого сообщения в прикладной программе позволяет установить текущие опции меню (запрещенные команды и т.п) перед его отображением.

Изменение системного меню

Изменение системного меню происходит точно так же, как и обычного меню. Для получения ссылки на системное меню служит функция GetSystemMenu.

Function GetSystemMenu(Wnd: HWnd; BRevert: Bool): HMenu;

Wnd задает ссылку на главное окно приложения. Если BRevert имеет ложное значение (обычно используемое), то функция возвращает ссылку на копию системного меню, которое используется в данном приложении. В случае истинного значения функция возвращает ссылку на оригинальное системное меню, используемое всеми приложениями.