Функция EnableMenuItem не работает с параметром MF_GRAYED - PullRequest
2 голосов
/ 23 сентября 2010

Создал проект ATL COM, через который я вставляю пункты меню в меню правого клика следующим образом:

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

Редактировать:

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


            return S_OK;
            }
            break;

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

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

1 Ответ

6 голосов
/ 23 сентября 2010

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

EnableMenuItem(gHMenu,ITEM_ID,MF_DISABLED | MF_GRAYED);

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

Или:

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

, где ITEM_POSITION - это нулевая позиция пункта меню.

Обратите внимание, что после вызова EnableMenuItem может потребоваться вызов DrawMenuBar, чтобы убедиться, что дисплей был обновлен.

...