Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Плаваюче меню
Плаваюче меню створюють звичним способом, але не вставляють в інше меню. Для відображення рядків і вибору команд плаваючого меню викликають функцію TrackPopupMenu, яка виводить на екран плаваюче меню і створює свій власний цикл обробки повідомлень, який завершує роботу після вибору рядка. Вона не повертає управління доти, доки робота з меню не буде завершена вибором рядка або відмовою від вибру. Приклад. Задача. Після натискання правої кнопки миші відобразити плаваюче меню. Розв‘язок. #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[]=" FloatMenu"; 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_RBUTTONDOWN: { //Беремо екранні координати курсору миші DWORD xyPos=GetMessaagePos(); WORD xPos=LOWORD(xyPos), yPos=HIWORD(xyPos); //Виводимо спливаюче меню в позиції курсору миші HMENU hFloatMenu=GetSubMenu(hMainMenu, 1); TrackPopupMenu(hFloatMenu, TPM_CENTERALIGN, TPM_LEFTBUTTON | TPM_VCENTERALIGN, xPos, yPos, 0, hwnd, NULL); //DestroyMenu(hFloatMenu); return 0; } case WM_DESTROY: {PostQuitMessage(0); return 0; } } return DefWindowProc(hwnd, msg, wParam, lParam); }
|