Создал 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;
.....
....
...
}
Но это не помогает отключить пункт меню. Что я делаю не так??
Ну, EnableMenuItem отлично работает, как говорит Алекс Фарбер. если вы хотите просмотреть изменение состояния, попробуйте записать его внутри GetCommandString. Почему я не смог просмотреть его, потому что я писал его под Invoke Method (состояние меню Scope получает Destroyed, как только вы нажимаете на любой пункт меню). Поэтому, когда я снова нажимаю «Щелчок», я получаю новое новое меню, с моим старым (первым) Menustates. – Simsons