Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- switch (message)
- {
- //. Обработка на контекстно меню:
- case WM_RBUTTONDOWN: //при натиснат десен бутон на мишката
- {
- HMENU hMenu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_POP)); // зарежда темплейта на менюто от ресурсите, съдържащо бързото меню
- HMENU hSubMenu = GetSubMenu(hMenu, 0); //взема първото бързо меню от темплейта
- POINT pt = { LOWORD(lParam), HIWORD(lParam) }; //текущи координати на мишката
- ClientToScreen(hWnd, &pt); //преобразува коорд. на мишката в коорд. на екрана
- TrackPopupMenu(hSubMenu, TPM_RIGHTBUTTON, pt.x, pt.y, 0, hWnd, NULL); //показва бързо меню и проследява избора на елементи от менюто
- DestroyMenu(hMenu); //разрушава менюто и освобождава ресурсите
- }
- break;
- case WM_COMMAND:
- {
- int wmId = LOWORD(wParam);
- int wnEvent = HIWORD(wParam);
- HMENU hMenu = GetMenu(hWnd);
- // Parse the menu selections:
- switch (wmId)
- {
- case IDM_ABOUT:
- DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
- break;
- case IDM_EXIT:
- DestroyWindow(hWnd);
- break;
- default:
- return DefWindowProc(hWnd, message, wParam, lParam);
- // Поставяне или премахване отметка на елемент от менюто :
- case IDM_CHECK:
- {
- HMENU hMenu = GetMenu(hWnd);// връща указател hMenu към менюто, присъединено към посочения прозорец hWnd.
- UINT res = GetMenuState(hMenu, IDM_CHECK, MF_BYCOMMAND);//връща флагове за състоянието на посочения елемент от менюто IDM_CHECK
- //MF_BYCOMMAND – показва, че вторият параметър във функцията GetMenuState е ID на елемента
- //MF_BYPOSITION – показва, че вторият параметър във функцията GetMenuState е позиция/индекс на елемента
- if (res & MF_CHECKED) {//проверява флага MF_CHECKED в res = GetMenuState(…)
- //т.е. дали IDM_CHECK е отметнат/чекнат
- CheckMenuItem(hMenu, IDM_CHECK, MF_BYCOMMAND | MF_UNCHECKED); // премахва отметката /чекването/ от елемента IDM_CHECK
- }
- else {
- CheckMenuItem(hMenu, IDM_CHECK, MF_BYCOMMAND | MF_CHECKED); //поставя отметка /чеква/ елемента IDM_CHECK
- }
- }
- break;
- case IDM_DISABLE:
- {
- HMENU hMenu = GetMenu(hWnd);
- EnableMenuItem(hMenu, IDM_DISABLE, MF_BYCOMMAND | MF_GRAYED);
- }
- break;
- //Достъпен/недостъпен елемент от менюто:
- case IDM_ENABLE:
- {
- // аналогичен на горния код, но се проверява флага MF_GRAYED, т.е. дали елемента IDM_DISABLE е недостъпен.
- // Ако е така, го прави достъпен с
- HMENU hMenu = GetMenu(hWnd);
- int res = GetMenuState(hMenu, IDM_DISABLE, MF_BYCOMMAND);
- if (res & MF_GRAYED) {
- EnableMenuItem(hMenu, IDM_DISABLE, MF_BYCOMMAND | MF_ENABLED);// Иначе – обратно, прави го достъпен.
- }
- else {
- EnableMenuItem(hMenu, IDM_DISABLE, MF_BYCOMMAND | MF_GRAYED);
- }
- }
- break;
- //Добавяне на нов елемент към менюто – код с обяснение:
- case IDM_ADD:
- {
- HMENU hMenu = GetMenu(hWnd);
- if (GetMenuState(hMenu, IDM_ADD + 13, MF_BYCOMMAND) == -1) // or disable
- // == -1 – означава, че не съществува елемент с такова ID - IDM_ADD + 1
- {
- MENUITEMINFO mii; //съдържа информация за елемент на менюто
- ZeroMemory(&mii, sizeof(mii)); //запълва съответния блок от паметта с нули
- mii.cbSize = sizeof(mii); //размер на структурата в байтове
- mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE;
- mii.wID = IDM_ADD + 13; // ID-то на елемента
- mii.fType = MFT_STRING; // типа на елемента - string
- mii.dwTypeData == TEXT("Delete &me"); //текст на елем. от менюто
- mii.fState = MFS_ENABLED; //да е достъпно-
- InsertMenuItem(hMenu, IDM_ADD, FALSE, &mii);// добавяне на елемента, инициализиран в структурата &mii,
- // пред елемента с посоченото ID, т.е. пред IDM_ADD
- }
- break;
- }
- //Изтриване на елемент, с посочено ID:
- case IDM_ADD + 13:
- {//при избор елемент с това ID от менюто се изтрива
- HMENU hMenu = GetMenu(hWnd);
- DeleteMenu(hMenu, IDM_ADD + 13, MF_BYCOMMAND); //изтрива елемента с това ID
- break;
- }
- }
- case WM_PAINT:
- {
- PAINTSTRUCT ps;
- HDC hdc = BeginPaint(hWnd, &ps);
- // TODO: Add any drawing code that uses hdc here...
- EndPaint(hWnd, &ps);
- }
- break;
- case WM_DESTROY:
- {
- PostQuitMessage(0);
- }
- break;
- default:
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
- return 0;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment