2010-09-23 3 views
2

Создал ATL COM проект, через который я вставив пункты меню к RightClick меню, как это:EnableMenuItem Функция не работает с параметром MF_GRAYED

STDMETHODIMP CSimpleShlExt::QueryContextMenu (
         HMENU hmenu, UINT uMenuIndex, UINT uidFirstCmd, 
         UINT uidLastCmd, UINT uFlags) 
{ 
    gHMenu=hmenu; 
    UINT uCmdID = uidFirstCmd; 

    // If the flags include CMF_DEFAULTONLY then we shouldn't do anything. 

    if (uFlags & CMF_DEFAULTONLY) 
     return MAKE_HRESULT (SEVERITY_SUCCESS, FACILITY_NULL, 0); 

    InsertMenu (hmenu, uMenuIndex, MF_BYPOSITION, uCmdID++, _T("Connect To Server")); 
    uMenuIndex++; 
    InsertMenu (hmenu, uMenuIndex, MF_BYPOSITION, uCmdID++, 
       _T("DisConnect From Server")); 
    return MAKE_HRESULT (SEVERITY_SUCCESS, FACILITY_NULL, 2); 
} 

Теперь я Ван Отключить подменят Connect, как только пользователь нажимает на нее, и для этого я использую EnableSubMenuItem,

STDMETHODIMP CSimpleShlExt::InvokeCommand (LPCMINVOKECOMMANDINFO pCmdInfo) 
{ 
    // If lpVerb really points to a string, ignore this function call and bail out. 
    if (0 != HIWORD(pCmdInfo->lpVerb)) 
     return E_INVALIDARG; 


    switch (LOWORD(pCmdInfo->lpVerb)) 
     { 
     case 0: 
      { 

      TCHAR szMsg [MAX_PATH + 32]; 

      wsprintf (szMsg, _T("The selected file was:\n\n%s"), m_szFile); 

      MessageBox (pCmdInfo->hwnd, "Connected", _T("SimpleShlExt"), 
         MB_ICONINFORMATION); 

      //InsertMenu (hmenu, uMenuIndex, MF_STRING | MF_BYPOSITION, uCmdID++, _T("Connect => NDS")); 
      //EnableMenuItem(gHMenu,0,MF_GRAYED); 

Edit:

EnableMenuItem(gHMenu,0,MF_DISABLED | MF_GRAYED | MF_BYPOSITION); 


      return S_OK; 
      } 
      break; 

..... 
.... 
... 
} 

Но это не помогает отключить пункт меню. Что я делаю не так??

+0

Ну, EnableMenuItem отлично работает, как говорит Алекс Фарбер. если вы хотите просмотреть изменение состояния, попробуйте записать его внутри GetCommandString. Почему я не смог просмотреть его, потому что я писал его под Invoke Method (состояние меню Scope получает Destroyed, как только вы нажимаете на любой пункт меню). Поэтому, когда я снова нажимаю «Щелчок», я получаю новое новое меню, с моим старым (первым) Menustates. – Simsons

ответ

6

Попробуйте это:

 
EnableMenuItem(gHMenu,ITEM_ID,MF_DISABLED | MF_GRAYED); 

ITEM_ID должен быть ресурс пункт меню ID. Или:

 
EnableMenuItem(gHMenu,ITEM_POSITION,MF_DISABLED | MF_GRAYED | MF_BYPOSITION); 

ITEM_POSITION - пункт меню.

+0

Что такое меню ресурсов? Если меню ресурсов - это меню, в которое я вставил MenuItems, как мне получить ITEM_ID от него? – Simsons

+0

Посмотрев на код создания вашего меню, я вижу, что вы используете InsertMenu с флагом MF_BYPOSITION. В этом случае вы можете получать доступ только к пунктам меню по позиции, поэтому используйте вторую версию: EnableMenuItem (gHMenu, ITEM_POSITION, MF_DISABLED | MF_GRAYED | MF_BYPOSITION); –

+0

Пробовал вариант. Не помогает? Отредактировал код для справки. – Simsons