2015-04-27 5 views
1

Если я использую win32 api, как отвечать WM_RBUTTONUP?Как отредактировать сообщение мыши о правой кнопке в элементе списка?

case WM_RBUTTONUP: 
{ 
    break; 
} 
case WM_COMMAND: 
    wmId = LOWORD(wParam); 
    wmEvent = HIWORD(wParam); 
    switch (wmId) { 
    case IDE_FRIEND: 
    { 
     switch (wmEvent) { 
     case WM_RBUTTONUP: 
     { 
      POINT pt; 
      GetCursorPos(&pt); 
      TrackPopupMenu(g_hMenu, TPM_RIGHTBUTTON, pt.x, pt.y, 0, hWnd, nullptr); 
      break; 
     } 
     default: 
      return DefWindowProc(hWnd, msg, wParam, lParam); 
     } 
     break; 
    } 

При нажатии на правую кнопке мыши, он не войдет в 'дело' WM_RBUTTONUP

'IDE_FRIEND' связанно с ListBox.

+0

Высокое слово '' lParam' на WM_COMAND' не код сообщения. Полнота 'lParam' - это дескриптор окна, который сгенерировал' WM_COMMAND'; у вас нет способа узнать, какая кнопка вызвала «WM_COMMAND». Вам нужно будет решить эту проблему по-другому. Что именно вы хотите сделать, просто покажите всплывающее меню для элементов списка? – andlabs

+0

в andlabs: Я использую wmEvent раньше, и он также не будет работать. Да, я хочу показать всплывающее меню для элемента lisbox. – HaibaraAi

+0

WM_RBUTTONUP будет работать, если вы щелкните правой кнопкой мыши в окне, но если вы щелкните правой кнопкой мыши в списке, он не появится там. Вам нужно создать отдельный wndProc для окна списка (позволяет вызвать его listBoxProc), а затем перехватить WM_RBUTTONUP в listBoxProc. Если у вас есть элемент управления ListView, вы сможете сразу щелкнуть правой кнопкой мыши. Ps, вы должны уловить 'WM_CONTEXTMENU', это в основном то же самое. –

ответ

0

Щелкните правой кнопкой мыши по списку, создавая контекстное сообщение для родительского окна. Вы должны быть в состоянии поймать его так:

case WM_CONTEXTMENU: 
{ 
    if (hListBox == (HWND)wParam) 
    { 
     int x = LOWORD(lParam); 
     int y = HIWORD(lParam); 
     TrackPopupMenu(g_hMenu, TPM_RIGHTBUTTON, x, y, 0, hWnd, nullptr); 
    } 
    break; 
} 

case WM_RBUTTONUP: 
{ 
    //main window's right-click message 
    break; 
} 

case WM_COMMAND: 
{ 
    //... 
} 

Edit: Чтобы сделать то же самое с подкласса

#include "CommCtrl.h" //may need to add this 
#pragma comment(lib, "comctl32.lib") 

LRESULT CALLBACK ListBoxProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp, 
           UINT_PTR, DWORD_PTR) 
{ 
    switch (msg){ 

    case WM_RBUTTONUP: 
    { 
     //add listbox menu here 
     break; 
    } 

    case WM_NCDESTROY://safely remove subclass 
    { 
     RemoveWindowSubclass(hwnd, ListBoxProc, 0); 
     return DefSubclassProc(hwnd, msg, wp, lp); 
    } 

    } 

    return DefSubclassProc(hwnd, msg, wp, lp); 
} 

LRESULT CALLBACK MainWindowProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { 
    //... 
    case WM_CREATE: 
     ListBox = CreateWindow(L"listbox", ...) 
     SetWindowSubclass(ListBox, ListBoxProc, 0, 0); 
    //... 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^