Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI-ekz_shpory.docx
Скачиваний:
11
Добавлен:
25.09.2019
Размер:
185.19 Кб
Скачать
  1. Создание меню в файле ресурсов

а) Описание шаблона в файле ресурсов

nameID MENU [load] [mem] – необязательные параметры

BEGIN

. . .

END

nameID – для идентификации шаблона меню (строка, число от 1 до 65535).

MENU – служебное слово

[load] – необязательный; определяет момент загрузки меню в память. (PRELOAD – загрузка сразу после запуска приложения LOADONCALL – загрузка только при отображении меню)

[mem] – необязательный; влияет на тип памяти, выделяемой для хранения шаблона (FIXED, MOVEABLE, DISCARDABLE – не перемещаемый, перемещаемый (по умолчю.), освобождаемый).

б) Описание операторов временных меню POPUP

POPUP text [, param]

BEGIN

. . .

END

в) Описание операторов строк MENUITEM

MENUITEM text, id [, param] // располагаются между BEGIN и END

text – имя строки, буква после & будет подчеркнута, \t – табуляция, \a – выравнивает по правой границе

id – определяет число, кот.идентиф-ет пункт меню. (приложение получит его с сообщением WM_COMMAND при выборе данного меню)

[param] – бывает CHECKED √, GRAYED, INACTIVE (не активная, но не серая) и другие (MENUBREAK, MENUBARBREAK, HELP – слева от текста вертикальная линия)

MENUITEM SEPARATOR // создание горизонтальной разделительной линии

г) Пример меню

#include "menu.hpp"

APP_MENU MENU

BEGIN

POPUP "&File"

BEGIN

MENUITEM "&New", CM_FILENEW

MENUITEM "&Open...", CM_FILEOPEN

END

END

Константы лучше описывать в отдельном файле "menu.hpp":

#define CM_FILEOPEN 24332

#define CM_FILENEW 24331

д) Подключение меню к окну приложения

  1. При регистрации класса:

Для подключения меню необходимо записать адрес текстовой строки "APP_MENU" в поле lpszMenuName структуры wc, имеющей тип WNDCLASS:

wc.lpszMenuName = "APP_MENU";

  1. При создании окна:

hwnd = CreateWindow(…, APP_MENU, …) - девятый параметр – идентификатор меню. У дочерних окон нет меню.

  1. С помощью функций в теле программы

Приведем перечень основных функций для работы с меню:

1.HMENU WINAPI CreateMenu(void);//Создает пустое меню, возвращает ID меню в случае успеха,NULL - иначе

2.HMENU WINAPI CreatePopupMenu(void); // Для создания пустого временного меню

3.HMENU WINAPI DestroyMenu(void); // Для удаления меню (перед завершением работы)

4. Для подключения к окну с идентификатором hwnd меню с идентификатором hmenu вы можете воспользоваться функцией: BOOL WINAPI SetMenu(HWND hwnd, HMENU hmenu);

Перед вызовом этой функции вы должны загрузить меню и получить его идентификатор, например, при помощи функции LoadMenu.

5. Для добавления строк в пустые меню можно воспользоваться функцией:

BOOL WINAPI AppendMenu(HMENU hmenu, UINT fuFlags, UINT idNewItem, LPCSTR lpszNewItem);

UINT fuFlags определяет атрибуты элемента меню (MF_CHECKED – √, MF_GRAYED – строка серая, неактивная, MF_ENABLED – нормальный вид, MF_POPUP – с данным элементом связывается временное меню, MF_STRING – элемент является строкой символов).

idNewItem – указывается идентификатор создаваемой строки меню, если это не MF_POPUP

lpszNewItem – разные значения в зависимости от флага (подпись строки, как правило)

AppendMenu(hmenu, MF_ENABLED|MF_POPUP{или MF_STRING},(UINT)hmenuFile {или IDM_FOUR}, "File");

6. Для перерисовки полосы меню для hwnd окна: void WINAPI DrawMenuBar(HWND hwnd);

_______________________________________________________________________________

7. Вставка команды между имеющимися строками:

BOOL WINAPI InsertMenu(HMENU hmenu, UINT idItem, UINT fuFlags, UINT idNewItem, LPCSTR lpszNewItem);

Есть 2 флага (MF_BYCOMMAND и MF_BYPOSITION), в зависимости от которых idItem определит идентификатор или порядковый номер элемента, перед которым будет вставка). Для добавления в конец, необходимо написать -1.

8. Для изменения строк – функция (после нее нужна перерисовка):

BOOL WINAPI ModifyMenu(HMENU hmenu, UINT idItem, UINT fuFlags, UINT idNewItem, LPCSTR lpszNewItem);

9. Удаление элементов меню: BOOL WINAPI DeleteMenu(HMENU hmenu, UINT idItem, UINT fuFlags);

10. Удаление элементов меню без освобождения занятых им ресурсов:

BOOL RemoveMenu(hmenu, idItem, fuFlags)

11. Для изменения состояния элемента меню удобно использовать:

BOOL WINAPI EnableMenuItem(HMENU hmenu, UINT idItem, UINT uEnable);

3 – флаги: MF_DISABLED, MF_ENABLED, MF_GRAYED+ 2 предыд.

2 – зависит от 2 флагов, либо номер, либо идентификатор.

_________________________________________________________________________________

12. Для определения идентификатора меню:

HMENU WINAPI GetMenu(HWND hwnd);

HMENU WINAPI GetSubMenu(HMENU hmenu, int nPos); - для временного (2 - порядковый № вр. меню)

14. Количество элементов меню – int WINAPI GetMenuItemCount(HMENU hmenu);

15. Возвращает Старший байт содержит кол-во элементов в меню, младший – набор флагов.

UINT WINAPI GetMenuState(HMENU hmenu, UINT idItem, UINT fuFlags);

В зависимости от 3 параметрара, второй – либо №, либо идентификатор.

_________________________________________________________________________________

Сообщения от меню:

1. WM_INITMENU – посылается в адрес окна в момент отображения меню (когда вы нажимаете на строку в полосе меню или активизируете временное меню при помощи клавиатуры)

2. WM_INITMENUPOPUP - -//- перед инициализацией временного меню

3. WM_COMMAND – при выборе пункта меню

4. WM_SYSCOMMAND – при выборе пункта системного меню

5. WM_MENUSELECT – когда курсор перемещается по строке меню.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]