Страница 15 из 26 Обработка сообщения WM_CONTEXTMENU Сообщение WM_CONTEXTMENU создается тогда, когда оконная процедура прикладной программы посылает функции DefWindowProc сообщение WM_RBUTTONUP или WM_NCRBUTTONUP. Приложение может обработать это сообщение, чтобы показать на экране контекстное меню, в соответствующей конкретной части экрана. Если прикладная программа не показывает на экране контекстное меню, она должна передать это сообщение в DefWindowProc для обработки по умолчанию. Ниже следует пример обработки сообщения WM_CONTEXTMENU, как оно может фигурировать в оконной процедуре прикладной программы. Младшие и старшие слова параметра lParam определяют экранную систему координат мыши, когда отпускается правая кнопка мыши. Определяемая программой функция OnContextMenu возвращает значение ИСТИНА (TRUE), если она показывает на экране контекстное меню или ЛОЖЬ (FALSE) если она этого не делает. case WM_CONTEXTMENU: if (!OnContextMenu(hwnd, LOWORD(lParam), HIWORD(lParam))) return DefWindowProc(hwnd, uMsg, wParam, lParam); break;
Следующая определяемая программой функция OnContextMenu показывает на экране контекстное меню, если определяемая позиция мыши внутри рабочей области окна. Более сложная функция могла бы показывать на экране одно из нескольких различных меню, в зависимости оттого, которая часть рабочей области определена. Чтобы фактически показывать на экране контекстное меню, этот пример вызывает определяемую программой функцию по имени DisplayContextMenu. За описанием этой функции, обратитесь к статье Отображение на экране контекстного меню. BOOL WINAPI OnContextMenu(HWND hwnd, int x, int y) { RECT rc;// рабочая область окна POINT pt = { x, y };// место, где был щелчок мышью // Получим ограничительный прямоугольник рабочей области. GetClientRect(hwnd, &rc); // Преобразуем позицию мыши в координаты рабочей области. ScreenToClient(hwnd, &pt); // Если позиция находится в рабочей области, // показать контекстное меню. if (PtInRect(&rc, pt)) { ClientToScreen(hwnd, &pt); DisplayContextMenu(hwnd, pt); return TRUE; } // Возвратить значение ЛОЖЬ (FALSE), если // не отображается никакого меню return FALSE; } |