2011-09-24 20 views
5

Bir bağlam menüsüne sahip bir win32 uygulamasına (C++) sahip olmak, bildirim simgesine sağ tıklatır. Menü/alt menü öğeleri, çalışma zamanında dinamik olarak oluşturulur ve değiştirilir. hDevices ve hChannels Yukarıdaki kodda C++ win32 dinamik menüsü - hangi menü öğesi seçildi

InsertMenu(hSettings, 0, MF_BYPOSITION | MF_POPUP | MF_STRING, (UINT_PTR) hDevices, L"Setting 1"); 
InsertMenu(hSettings, 1, MF_BYPOSITION | MF_POPUP | MF_STRING, (UINT_PTR) hChannels, L"Setting 2"); 

InsertMenu(hMainMenu, 0, MF_BYPOSITION | MF_POPUP | MF_STRING, (UINT_PTR) hSettings, L"Settings"); 
InsertMenu(hMainMenu, 1, MF_BYPOSITION | MF_STRING, IDM_EXIT, L"Exit"); 

dynamicly alt menüler oluşturulur. dinamik menüler böyle oluşturulur:

InsertMenu(hDevices, i, style, IDM_DEVICE, L"Test 1"); 
    InsertMenu(hDevices, i, style, IDM_DEVICE, L"Test 2"); 
    InsertMenu(hDevices, i, style, IDM_DEVICE, L"Test 3"); 

(yukarıdaki kodda IDM_DEVICE) kendi kimliği var her alt menü öğesini tanımlamak zorunda kalmadan tıklandığı madde bilmenin bir yolu var mı? Bu kullanıcı IDM_DEVICE alt menüsünü tıkladığını ve bu alt menüdeki ilk öğeyi (Test 1) tıkladığını tespit etmek ister.

Böyle bir şey başarmak istiyorum:

case WM_COMMAND: 
    wmId = LOWORD(wParam); 
    wmEvent = HIWORD(wParam); 
    // Parse the menu selections: 
    switch (wmId) 
    { 
     case IDM_DEVICE: // user clicked on Test 1 or Test 2 or Test 3 
      UINT index = getClickedMenuItem(); // get the index number of the clicked item (if you clicked on Test 1 it would be 0,..) 
          // change the style of the menu item with that index 
      break;   
    } 

cevap

6

Aşağıdakileri deneyin:

MENUINFO mi; 
memset(&mi, 0, sizeof(mi)); 
mi.cbSize = sizeof(mi); 
mi.fMask = MIM_STYLE; 
mi.dwStyle = MNS_NOTIFYBYPOS; 
SetMenuInfo(hDevices, &mi); 

Şimdi WM_MENUCOMMAND yerine WM_COMMAND ait alırsınız. Menü dizini wParam ve lParam'da menü tanıtıcısında olacaktır. Sadece bilinen menüler için mesaj atmaya dikkat edin ve gerisini DefWindowProc'a bırakın. Kod buna benzer olacaktır: Bir de bayraklar TPM_RETURNCMD | TPM_NONOTIFY ile TrackPopupMenuEx() kullanmak ve WM_MENUCOMMAND aracılığıyla gitmek zorunda kalmadan seçilen menü öğesinin id alabilirsiniz

case WM_MENUCOMMAND: 
    HMENU menu = (HMENU)lParam; 
    int idx = wParam; 
    if (menu == hDevices) 
    { 
     //Do useful things with device #idx 
    } 
    else 
     break; //Ensure that after that there is a DefWindowProc call 
+0

Teşekkürler bir gün için tüm gün arıyordum ve bulamadı! – blejzz

0

.