Обработка сообщения WM_CONTEXTMENU


Сообщение WM_CONTEXTMENU создается тогда, когда оконная процедура прикладной программы посылает функции DefWindowProc сообщение WM_RBUTTONUP или WM_NCRBUTTONUP. Приложение может обработать это сообщение, чтобы показать на экране контекстное меню, в соответствующей конкретной части своего экрана. Если прикладная программа не показывает на экране контекстное меню, она должна передать это сообщение в DefWindowProc для обработки по умолчанию.

Ниже следует пример обработки сообщения WM_CONTEXTMENU, как оно может выглядеть в оконной процедуре прикладной программы. Младшие и старшие слова параметра lParam определяют экранную систему координат мыши, когда отпускается правая кнопка мыши. Определяемая программой функция OnContextMenu возвращает значение ИСТИНА (TRUE), если она показывает на экране контекстное меню или ЛОЖЬ (FALSE) если она этого не делает.

case WM_CONTEXTMENU: 
    if (!OnContextMenu(hwnd, GET_X_LPARAM(lParam),
              GET_Y_LPARAM(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; 
} 

Назад в оглавление
На главную страницу

Hosted by uCoz