2010-03-03 2 views
1

В настоящее время я пишу расширение оболочки проводника Windows. Все в порядке до сих пор, но у меня возникли проблемы с введением пунктов меню с помощью MenuItemBitmaps в конце контекстного меню.Как включить растровые изображения в элементы, которые я добавил в конец контекстного меню?

Вот код, который я использовал без растровых изображений:

HRESULT CSimpleShlExt::QueryContextMenu(HMENU hmenu, UINT /*uMenuIndex*/, UINT uidFirstCmd, UINT /*uidLastCmd*/, UINT uFlags) 
{ 
    InsertMenu(hmenu, -1, MF_SEPARATOR, uidFirstCmd++, _T("")); 
    InsertMenu(hmenu, -1, MF_STRING | MF_BYPOSITION, uidFirstCmd++, _T("SimpleShlExt Test Item")); 
    InsertMenu(hmenu, -1, MF_STRING | MF_BYPOSITION, uidFirstCmd++, _T("SimpleShlExt Test Item 2")); 
    return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, 3); // 3 because we do have three menu items!!! 
} 

Этот код делает то, что я хочу. Он добавляет разделитель и два пункта меню в конце контекстного меню, когда я нажимаю правой кнопкой мыши в проводнике Windows.

Я могу также добавить растровые изображения к этим пунктам меню с этим кодом:

HRESULT CSimpleShlExt::QueryContextMenu(HMENU hmenu, UINT uMenuIndex, UINT uidFirstCmd, UINT /*uidLastCmd*/, UINT uFlags) 
{ 
    // load the bitmap from the resource 
    HBITMAP hBitmap = (HBITMAP)LoadImage((HMODULE)_AtlBaseModule.m_hInst, 
     MAKEINTRESOURCE(IDB_BITMAP), IMAGE_BITMAP, 16, 16, 0); 
    InsertMenu(hmenu, uMenuIndex++, MF_SEPARATOR, uidFirstCmd++, _T("")); 
    InsertMenu(hmenu, uMenuIndex++, MF_STRING | MF_BYPOSITION, uidFirstCmd++, _T("SimpleShlExt Test Item")); 
    SetMenuItemBitmaps(hmenu, uMenuIndex - 1, MF_BITMAP | MF_BYPOSITION, hBitmap, hBitmap); 
    InsertMenu(hmenu, uMenuIndex++, MF_STRING | MF_BYPOSITION, uidFirstCmd++, _T("SimpleShlExt Test Item 2")); 
    SetMenuItemBitmaps(hmenu, uMenuIndex - 1, MF_BITMAP | MF_BYPOSITION, hBitmap, hBitmap); 
    return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, 3); // 3 because we do have three menu items!!! 
} 

Но теперь пункты меню расположены где-то в середине контекстного меню, а не в конце. Просто установка -1 вместо uMenuIndex не работает. Элементы меню действительно размещаются в конце, но растровые изображения не отображаются.

Любые идеи?

+1

Как правило, вы не можете контролировать, где будут размещаться ваши предметы. Могут быть другие расширения контекстного меню, которые добавляют элементы LATER, чем ваш код. – Kerido

ответ

3

В документации для SetMenuItemBitmaps ничего не говорится о принятии -1 в качестве действительной позиции, например InsertMenu. Вы знаете идентификаторы команд добавленных вами элементов, и вы знаете, что они уникальны, поэтому добавьте растровые изображения по команде вместо позиции.

InsertMenu(hmenu, -1, MF_STRING | MF_BYPOSITION, uidFirstCmd, _T("SimpleShlExt Test Item")); 
SetMenuItemBitmaps(hmenu, uidFirstCmd, MF_BITMAP | MF_BYCOMMAND, hBitmap, hBitmap); 
++uidFirstCmd; 

Вы игнорируя указания, что хост меню дал вам о том, где поставить свои пункты меню. Единственная причина, по которой вы до сих пор видели успех, состоит в том, что хост меню не добавил никаких других предметов после того, как вы добавили свои, а все другие расширения меню сыграли по правилам и добавили свои предметы там, где им сказали. Если они решат игнорировать такие правила, как вы, то они могут оказаться в конце, а не в вашем.

 Смежные вопросы

  • Нет связанных вопросов^_^