2011-09-24 28 views
5

मेरे पास एक Win32 एप्लिकेशन (सी ++) है जिसमें एक संदर्भ मेनू है जो अधिसूचना आइकन पर दायाँ क्लिक करने के लिए बाध्य है। मेनू/उपमेनू आइटम गतिशील रूप से बनाए जाते हैं और रनटाइम के दौरान बदल जाते हैं।सी ++ win32 गतिशील मेनू - कौन सा मेनू आइटम चुना गया था

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"); 

उपरोक्त कोड में hDevices और hChannels गतिशील रूप से उत्पन्न उप मेन्यू हैं। गतिशील मेनू इस तरह उत्पन्न कर रहे हैं:

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"); 

वहाँ जो मद (उपरोक्त कोड में IDM_DEVICE) प्रत्येक सबमेनू आइटम यह खुद आईडी है परिभाषित करने के लिए बिना क्लिक किए गए जानने का कोई तरीका है? यह पता लगाना चाहेंगे कि उस उपयोगकर्ता ने सबमेनू IDM_DEVICE पर क्लिक किया है और उसने इस उपमेनू में पहली आइटम (टेस्ट 1) पर क्लिक किया था।

मैं कुछ इस तरह हासिल करना चाहते हैं:

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;   
    } 

उत्तर

6

निम्नलिखित का प्रयास करें:

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

अब आप WM_MENUCOMMANDWM_COMMAND के बजाय मिल जाएगा। मेन्यू इंडेक्स wParam में होगा और एलपीएआरएम में मेन्यू हैंडल होगा। केवल ज्ञात मेनू के लिए संदेश खाने और शेष को DefWindowProc पर ध्यान दें। कोड इस के समान हो जाएगा:

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

धन्यवाद मैं नमूना के लिए पूरे दिन खोज रहा हूं और कोई भी नहीं मिला! – blejzz

0

एक भी झंडे TPM_RETURNCMD | TPM_NONOTIFY साथ TrackPopupMenuEx() का उपयोग करें और WM_MENUCOMMAND के माध्यम से जाने के लिए बिना चयनित मेनू आइटम की id मिल सकती है।