Silviyaa

Untitled

Apr 12th, 2021
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.48 KB | None | 0 0
  1.  
  2. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  3. {
  4. switch (message)
  5. {
  6. //. Обработка на контекстно меню:
  7. case WM_RBUTTONDOWN: //при натиснат десен бутон на мишката
  8. {
  9. HMENU hMenu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_POP)); // зарежда темплейта на менюто от ресурсите, съдържащо бързото меню
  10. HMENU hSubMenu = GetSubMenu(hMenu, 0); //взема първото бързо меню от темплейта
  11. POINT pt = { LOWORD(lParam), HIWORD(lParam) }; //текущи координати на мишката
  12. ClientToScreen(hWnd, &pt); //преобразува коорд. на мишката в коорд. на екрана
  13. TrackPopupMenu(hSubMenu, TPM_RIGHTBUTTON, pt.x, pt.y, 0, hWnd, NULL); //показва бързо меню и проследява избора на елементи от менюто
  14. DestroyMenu(hMenu); //разрушава менюто и освобождава ресурсите
  15. }
  16. break;
  17. case WM_COMMAND:
  18. {
  19.  
  20. int wmId = LOWORD(wParam);
  21. int wnEvent = HIWORD(wParam);
  22. HMENU hMenu = GetMenu(hWnd);
  23. // Parse the menu selections:
  24. switch (wmId)
  25. {
  26. case IDM_ABOUT:
  27. DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
  28. break;
  29. case IDM_EXIT:
  30. DestroyWindow(hWnd);
  31. break;
  32. default:
  33. return DefWindowProc(hWnd, message, wParam, lParam);
  34. // Поставяне или премахване отметка на елемент от менюто :
  35. case IDM_CHECK:
  36. {
  37. HMENU hMenu = GetMenu(hWnd);// връща указател hMenu към менюто, присъединено към посочения прозорец hWnd.
  38. UINT res = GetMenuState(hMenu, IDM_CHECK, MF_BYCOMMAND);//връща флагове за състоянието на посочения елемент от менюто IDM_CHECK
  39. //MF_BYCOMMAND – показва, че вторият параметър във функцията GetMenuState е ID на елемента
  40. //MF_BYPOSITION – показва, че вторият параметър във функцията GetMenuState е позиция/индекс на елемента
  41.  
  42. if (res & MF_CHECKED) {//проверява флага MF_CHECKED в res = GetMenuState(…)
  43. //т.е. дали IDM_CHECK е отметнат/чекнат
  44. CheckMenuItem(hMenu, IDM_CHECK, MF_BYCOMMAND | MF_UNCHECKED); // премахва отметката /чекването/ от елемента IDM_CHECK
  45. }
  46. else {
  47. CheckMenuItem(hMenu, IDM_CHECK, MF_BYCOMMAND | MF_CHECKED); //поставя отметка /чеква/ елемента IDM_CHECK
  48. }
  49. }
  50. break;
  51. case IDM_DISABLE:
  52. {
  53. HMENU hMenu = GetMenu(hWnd);
  54. EnableMenuItem(hMenu, IDM_DISABLE, MF_BYCOMMAND | MF_GRAYED);
  55.  
  56. }
  57. break;
  58. //Достъпен/недостъпен елемент от менюто:
  59. case IDM_ENABLE:
  60. {
  61. // аналогичен на горния код, но се проверява флага MF_GRAYED, т.е. дали елемента IDM_DISABLE е недостъпен.
  62. // Ако е така, го прави достъпен с
  63. HMENU hMenu = GetMenu(hWnd);
  64. int res = GetMenuState(hMenu, IDM_DISABLE, MF_BYCOMMAND);
  65. if (res & MF_GRAYED) {
  66. EnableMenuItem(hMenu, IDM_DISABLE, MF_BYCOMMAND | MF_ENABLED);// Иначе – обратно, прави го достъпен.
  67. }
  68. else {
  69. EnableMenuItem(hMenu, IDM_DISABLE, MF_BYCOMMAND | MF_GRAYED);
  70. }
  71. }
  72. break;
  73. //Добавяне на нов елемент към менюто – код с обяснение:
  74. case IDM_ADD:
  75. {
  76. HMENU hMenu = GetMenu(hWnd);
  77. if (GetMenuState(hMenu, IDM_ADD + 13, MF_BYCOMMAND) == -1) // or disable
  78. // == -1 – означава, че не съществува елемент с такова ID - IDM_ADD + 1
  79. {
  80. MENUITEMINFO mii; //съдържа информация за елемент на менюто
  81. ZeroMemory(&mii, sizeof(mii)); //запълва съответния блок от паметта с нули
  82. mii.cbSize = sizeof(mii); //размер на структурата в байтове
  83. mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE;
  84. mii.wID = IDM_ADD + 13; // ID-то на елемента
  85. mii.fType = MFT_STRING; // типа на елемента - string
  86. mii.dwTypeData == TEXT("Delete &me"); //текст на елем. от менюто
  87. mii.fState = MFS_ENABLED; //да е достъпно-
  88. InsertMenuItem(hMenu, IDM_ADD, FALSE, &mii);// добавяне на елемента, инициализиран в структурата &mii,
  89. // пред елемента с посоченото ID, т.е. пред IDM_ADD
  90. }
  91. break;
  92. }
  93. //Изтриване на елемент, с посочено ID:
  94. case IDM_ADD + 13:
  95. {//при избор елемент с това ID от менюто се изтрива
  96. HMENU hMenu = GetMenu(hWnd);
  97. DeleteMenu(hMenu, IDM_ADD + 13, MF_BYCOMMAND); //изтрива елемента с това ID
  98. break;
  99. }
  100.  
  101. }
  102.  
  103. case WM_PAINT:
  104. {
  105. PAINTSTRUCT ps;
  106. HDC hdc = BeginPaint(hWnd, &ps);
  107. // TODO: Add any drawing code that uses hdc here...
  108. EndPaint(hWnd, &ps);
  109. }
  110. break;
  111. case WM_DESTROY:
  112. {
  113. PostQuitMessage(0);
  114. }
  115. break;
  116. default:
  117. return DefWindowProc(hWnd, message, wParam, lParam);
  118.  
  119. }
  120.  
  121. return 0;
  122. }
  123. }
  124.  
Advertisement
Add Comment
Please, Sign In to add comment