Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Створення меню
Алгоритм створення меню: 1. створення порожнього меню hMenu; 2. вставка елемента в меню hMenu; 3. крок 2 повторюємо стільки разів, скільки елементів містить мню hMenu. Цей алгоритм дозволяє створювати багаторівневе меню. Меню спочатку створюють лише в пам'яті. Існують функції, які операційній системі вказують, яке меню створене, до якого вікна воно належить і коли його відображати: - CreateMenu - створює порожнє головне меню вікна; - CreatePopupMenu - створює поржнє тимчасове меню; - SetMenu - підключає головне меню hMenu до вікна hwnd. - DrawMenuBar - перемальовує смугу меню після змін вмісту меню. Алгоритм підключення головного меню до вікна та відображення смуги меню: 1. створення головного меню (за алгоритмом створення меню); 2. підключення головного меню до вікна; 3. перемалювання смуги меню вікна. Додаток в створене меню може вставляти нові елементи або видялти старі, змінювати та запитувати поточний стан будь-якого елементу. Вставка елементів в меню. Функція InsertMenuItem вставляє елемент в меню hMenu. У випадку успішної вставки елементу функція повертає ненульове значення. Приклад. Задача. Описати функцію для вставки елемента в меню. Розв‘язок. BOOL CreateMenuItem(HMENU hMenu, char *str, UINT ulns, UINT uCom, HMENU hSubMenu, BOOL flag, UINT fType) {MENUITEMINFO mii; mii.cbSize=sizeof(MENUITEMINFO); mii.fMask=MIIM_STATE | MIIM_TYPE | MIIM_SUBMENU | MIIM_ID; mii.fType=fType; mii, fState=MFS_ENABLED; mii.dwTypeData=str; mii.cch=sizeof(str); mii.wID=uCom; mii.hSubMenu=hSubMenu; return InsertMenuItem(hMenu, uIns, flag, & mii); } Приклад. Задача. Головне меню містить розділи " Файли" і " Правка". При виборі рядка " Файли" відображається тимчасове меню з рядками " Відкрити", " Зберегти" і " Вихід". При виборі рядка " Правка" відображається тимчасове меню з рядками " Знайти" і " Замінити". Розв‘язок. #include " Functions.h" #define FILE_OPEN 1001 #define FILE_SAVE 1002 #define FILE_QUIT 1003 #define EDIT_FIND 2001 #define EDIT_REPLC 2002 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); HINSTANCE hInstance; char szClass[]=" MenuWindow"; INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, INT nCmdShow) { MSG msg; HWND hwnd;:: hInstance=hInstance; if (! RegClass(WndProc, szClass, COLOR_WINDOW)) return FALSE; hwnd=CreateWindow (szClass, " Додаток зі статичним меню", WS_OVERLAPPEDWINDOW|WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance, NULL); if (! hwnd) return FALSE; while (GetMessage(& msg, NULL, 0, 0)) { TranslateMessage(& msg); DispatchMessage(& msg); } return(int)msg.wParam; } BOOL CreateMenuItem(HMENU hMenu, char *str, UINT uIns, UINT uCom, HMENU hSubMenu, BOOL flag, UINT fType) { MENUITEMINFO mii; mii.cbSize=sizeof(MENUITEMINFO); mii.fMask=MIIM_STATE | MIIM_TYPE | MIIM_SUBMENU | MIIM_ID; mii.fType=fType; mii, fState=MFS_ENABLED; mii.dwTypeData=str; mii.cch=sizeof(str); mii.wID=uCom; mii.hSubMenu=hSubMenu; return InsertMenuItem(hMenu, uIns, flag, & mii); } LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {static HMENU hMainMenu, hFileMenu, hEditMenu; switch(msg) { case WM_CREATE: {hMainMenu=CreateMenu(); // Створюємо тимчасове меню для розділу " Файли" hFileMenu=CreatePopupMenu(); int i=0; //Ініціалізація позиції в меню hFileMenu CreateMenuItem(hFileMenu, " & Відкрити", i++, FILE_OPEN, NULL, FALSE, MFT_STRING); CreateMenuItem(hFileMenu, " & Зберегти", i++, FILE_SAVE, NULL, FALSE, MFT_STRING); CreateMenuItem(hFileMenu, NULL, i++, 0, NULL, FALSE, MFT_SEPARATOR); CreateMenuItem(hFileMenu, " & Вихід", i++, FILE_QUIT, NULL, FALSE, MFT_STRING); //Створюємо тимчасове меню для розділу " Правка" hEditMenu=CreatePopupMenu(); i=0; //Ініціалізація позиції в меню hEditMenu CreateMenuItem(hEditMenu, " & Знайти", i++, EDIT_FIND, NULL, FALSE, MFT_STRING); CreateMenuItem(hEditMenu, " & Замінити", i++, EDIT_REPLC, NULL, FALSE, MFT_STRING); //Підключаємо тимчасові меню до головного меню i=0; //Ініціалізація позиції в меню hMainMenu CreateMenuItem(hMainMenu, " & Файл", i++, 0, hFileMenu, FALSE, MFT_STRING); CreateMenuItem(hMainMenu, " & Правка", i++, 0, hEditMenu, FALSE, MFT_STRING); SetMenu(hwnd, hMainMenu); DrawMenuBar(hwnd); return 0; } case WM_COMMAND: {switch (LOWORD (wParam)) {case FILE_OPEN: {MessageBox(hwnd, " Команда FILE_OPEN", " Меню", MB_OK); return 0; } case FILE_SAVE: {MessageBox(hwnd, " Команда FILE_SAVE", " Меню", MB_OK); return 0; } case EDIT_FIND: {MessageBox(hwnd, " Команда EDIT_FIND", " Меню", MB_OK); return 0; } case EDIT_REPLC: {MessageBox(hwnd, " Команда EDIT_REPLC", " Меню", MB_OK); return 0; } case FILE_QUIT: {DestroyWindow(hwnd); return 0; } } return 0; } case WM_DESTROY: {PostQuitMessage(0); return 0; } } return DefWindowProc(hwnd, msg, wParam, lParam); } Цей приклад демонструє застосування фунції CreateMenuItem для створення статичного меню. Меню названо статичним лише тому, що в прочесі роботи додатку воно не змінюється. Видалення елементів з меню. Функція DeleteMenu видаляє елемент з меню та звільняє всі пов'язані з ним ресруси. Якщо елемент, що видаляється, вказує на тимчасове меню, то функція DeleteMenu видаляє і це тимчасове меню. Функція RemoveMenu видаляє елемент з меню, не руйнуючи пов'язані з ним ресурси. Ці ресурси можна використовувати в подальшому. Для руйнування меню викликають функцію DestroyMenu, яка руйнує задане меню і вивільянє ресурси меню. Функцію DestroyMenu вікна викликають для руйнування тих меню, які вони створили, але не підключили до себе. Підключення меню автоматично руйнуються при руйнуванні вікна. Приклад. Задача. Головне меню спочатку мітсить розділ " Файли". При виборі рядка " Файли" відображається тимчасове меню з рядками " Відкрити", " Зберегти", розділювальною лінією та рядком " Вихід". При виборі рядка " Відкрити" в головне меню добавити елемент " Правка" з тимчасовим меню з рядками " Знайти", " Замінити". Якщо ж потім обрати рядок " Зберегти", то з головного меню видалити елемент " Правка". Розв‘язок. #include " Functions.h" #define FILE_OPEN 1001 #define FILE_SAVE 1002 #define FILE_QUIT 1003 #define EDIT_FIND 2001 #define EDIT_REPLC 2002 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); HINSTANCE hInstance; char szClass[]=" RemoveMenu"; INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, INT nCmdShow) { MSG msg; HWND hwnd;:: hInstance=hInstance; if (! RegClass(WndProc, szClass, COLOR_WINDOW)) return FALSE; hwnd=CreateWindow (szClass, " Додаток зі статичним меню", WS_OVERLAPPEDWINDOW|WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance, NULL); if (! hwnd) return FALSE; while (GetMessage(& msg, NULL, 0, 0)) { TranslateMessage(& msg); DispatchMessage(& msg); } return(int)msg.wParam; } BOOL CreateMenuItem(HMENU hMenu, char *str, UINT uIns, UINT uCom, HMENU hSubMenu, BOOL flag, UINT fType) { MENUITEMINFO mii; mii.cbSize=sizeof(MENUITEMINFO); mii.fMask=MIIM_STATE | MIIM_TYPE | MIIM_SUBMENU | MIIM_ID; mii.fType=fType; mii, fState=MFS_ENABLED; mii.dwTypeData=str; mii.cch=sizeof(str); mii.wID=uCom; mii.hSubMenu=hSubMenu; return InsertMenuItem(hMenu, uIns, flag, & mii); } LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {static HMENU hMainMenu, hFileMenu, hEditMenu; static BOOL fFileOpened; switch(msg) { case WM_CREATE: {hMainMenu=CreateMenu(); // Створюємо тимчасове меню для розділу " Файли" hFileMenu=CreatePopupMenu(); int i=0; //Ініціалізація позиції в меню hFileMenu CreateMenuItem(hFileMenu, " & Відкрити", i++, FILE_OPEN, NULL, FALSE, MFT_STRING); CreateMenuItem(hFileMenu, " & Зберегти", i++, FILE_SAVE, NULL, FALSE, MFT_STRING); CreateMenuItem(hFileMenu, NULL, i++, 0, NULL, FALSE, MFT_SEPARATOR); CreateMenuItem(hFileMenu, " & Вихід", i++, FILE_QUIT, NULL, FALSE, MFT_STRING); //Створюємо тимчасове меню для розділу " Правка" hEditMenu=CreatePopupMenu(); i=0; //Ініціалізація позиції в меню hEditMenu CreateMenuItem(hEditMenu, " & Знайти", i++, EDIT_FIND, NULL, FALSE, MFT_STRING); CreateMenuItem(hEditMenu, " & Замінити", i++, EDIT_REPLC, NULL, FALSE, MFT_STRING); //Підключаємо тимчасові меню до головного меню i=0; //Ініціалізація позиції в меню hMainMenu CreateMenuItem(hMainMenu, " & Файл", i++, 0, hFileMenu, FALSE, MFT_STRING); SetMenu(hwnd, hMainMenu); DrawMenuBar(hwnd); fFileOpened=FALSE; return 0; } case WM_COMMAND: {switch (LOWORD (wParam)) {case FILE_OPEN: {if (! fFileOpened) {CreateMenuItem (hMainMenu, " & Правка", 1, 0, hEditMenu, FALSE, MFT_STRING); DrawMenuBar(hwnd); fFileOpened=TRUE; } return 0; } case FILE_SAVE: {if (fFileOpened) {RemoveMenuItem (hMainMenu, 1, MF_BYPOSITION); DrawMenuBar(hwnd); fFileOpened=FALSE; } return 0; } case EDIT_FIND: {MessageBox(hwnd, " Команда EDIT_FIND", " Меню", MB_OK); return 0; } case EDIT_REPLC: {MessageBox(hwnd, " Команда EDIT_REPLC", " Меню", MB_OK); return 0; } case FILE_QUIT: {DestroyWindow(hwnd); return 0; } } return 0; } case WM_DESTROY: {if (! fFileOpened) DestroyMenu(hEditMenu); PostQuitMessage(0); return 0; } } return DefWindowProc(hwnd, msg, wParam, lParam); } Управління станом елементів меню. Функція SetMenuItemInfo змінює стан елементу меню. Приклад. Задача. Описати функцію для зміни стану елементу. Розв‘язок. BOOL SetMenuItem (HMENU hMenu, UINT uIns, UINT fState, BOOL flag) {MENUITEMINFO mii; mii.cbSize=sizeof(MENUITEMINFO); mii.fMask=MIIM_STATE | MIIM_ID; mii.fState=fState; mii.wID=uIns; return SetMenuItemInfo(hMenu, uIns, flag, & mii); }
Функція GetMenuItemInfo обирає дані елементу меню. Приклад. Задача. Описати функцію для запиту стану елемента. Розв‘язок. UINT GetMenuItem(HMENU hMenu, UINT uIns, BOOL flag) {MENUITEMINFO mii; mii.cbSise=sizeof(MENUITEMINFO); mii.fMask=MIIM_STATE; GetMenuItemInfo(hMenu, uIns, flag, & mii); return mii.fState; } Одержання інформації про меню. Функція GetMenu повертає дескриптор головного меню вікна. Функція GetSubMenu повертає дескриптор тимчасового меню, розташованого у вказаній позиції.Функція IsMenu повертає ненульове значення, якщо hmenu є дескриптором меню, інакше - повертає 0. Функція GetMenuItemCount повертає кількість елементів в меню.
|