Как включить растровые изображения в элементы, которые я добавил в конец контекстного меню? - PullRequest
1 голос
/ 03 марта 2010

В настоящее время я пишу расширение оболочки Windows Explorer. Пока все в порядке, но у меня проблемы с вставкой пунктов меню WITH 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 Ответ

3 голосов
/ 03 марта 2010

В документации для 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;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...