Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Плаваюче меню






Плаваюче меню створюють звичним способом, але не вставляють в інше меню. Для відображення рядків і вибору команд плаваючого меню викликають функцію 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); }

 


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.007 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал