
- •Основные компоненты windows – программы (.Cpp, .H, .Res, .Rc, .Def), компиляция.
- •Файл определения модуля.
- •Структура windows – программы.
- •Структура программы в Windows:
- •Сообщения. Источники сообщений
- •Формирование сообщений, примеры. Очереди.
- •Сообщения. Цикл сообщений, основные компоненты.
- •Сообщения. Структура сообщений на примере wm_command
- •Структура msg. Обработка сообщений.
- •Средства обработки сообщений в приложении и windows.
- •Окна, классы и типы окон.
- •Регистрация класса окна, основные элементы класса.
- •Int cbClsExtra; // 3. Доп. Память для окон, созд-мых на базе данного класса
- •Int cbWndExtra; // 4. Доп. Память для создания окна (3, 4 – в байтах)
- •Линейки прокрутки, переключатели, окна пометки, окна списка.
- •1. Кнопки, переключатели (переключатели – кнопки с 3-мя состояниями (вкл, выкл и неактивен)
- •2. Полосы прокрутки.
- •3. Окна списка
- •Комбинированные списки, окна редактирования и статические текстовые объекты.
- •1. Комбинированные списки
- •2. Окна редактирования
- •3. Статический орган управления (статический текстовый объект)
- •Способы создания меню
- •Создание меню в файле ресурсов
- •С помощью функций в теле программы
- •Создание меню редактором ресурсов
- •Определение диалоговой панели, взаимодействие пользователя с панелью.
- •1. Создание шаблона.
- •2. Создание функции диалога.
- •3. Вызов одной из функций создания диалога
- •Диалоговые панели, модальные панели.
- •Немодальные панели. Отличие циклов сообщений.
- •Ресурсы. Файл ресурсов, текстовый, бинарный. Создание.
- •Файл определения модуля. Назначение, основные директивы (относящиеся к коду и данным).
- •Графический приборный интерфейс gdi. Состав, назначение.
- •Контекст, содержание контекста.
- •Общий контекст, родительский, личный, для класса окна, физический.
- •1. Общий контекст отображения.
- •2. Контекст отображения для класса окна
- •3. Личный контекст отображения
- •4. Родительский контекст отображения
- •5. Контекст физического устройства
- •Последовательность действий приложения при формировании рисунка
- •Преобразование логических координат в физические и наоборот, единицы измерений, масштабирование.
- •Назначение и состав структуры paintstruct. Сообщение wm_paint.
- •Int right; х-коор-та нижнего правого угла
- •Int bottom; y-коор-та
- •Дополнительные темы.
- •Аппаратная независимость
- •Основные компоненты windows – программы (.Cpp, .H, .Res, .Rc, .Def), компиляция
Создание меню в файле ресурсов
а) Описание шаблона в файле ресурсов
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
д) Подключение меню к окну приложения
При регистрации класса:
Для подключения меню необходимо записать адрес текстовой строки "APP_MENU" в поле lpszMenuName структуры wc, имеющей тип WNDCLASS:
wc.lpszMenuName = "APP_MENU";
При создании окна:
hwnd = CreateWindow(…, APP_MENU, …) - девятый параметр – идентификатор меню. У дочерних окон нет меню.
С помощью функций в теле программы
Приведем перечень основных функций для работы с меню:
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 – когда курсор перемещается по строке меню.