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エクスプローラーを右クリックすると、コンテキストメニューの最後にセパレーターと2つのメニュー項目が追加されます。

次のコードを使用して、これらのメニュー項目にビットマップを追加することもできます。

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は機能しません。メニュー項目は実際に最後に配置されていますが、ビットマップは表示されていません。

何か案は?

4

1 に答える 1

3

のドキュメントには、有効なポジションとしてSetMenuItemBitmaps受け入れることについては何も書かれていません。追加したアイテムのコマンドIDを知っていて、それらが一意であることを知っているので、位置ではなくコマンドでビットマップを追加します。-1InsertMenu

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

メニュー項目を配置する場所に関してメニューホストから提供された指示を無視しています。これまでに成功を収めた唯一の理由は、メニューホストが追加した後に他のアイテムを追加しておらず、他のすべてのメニュー拡張機能がルールに従って再生され、指示された場所にアイテムを追加したためです。彼らがあなたのようなルールを無視することを決定した場合、彼らはあなたの代わりに最後に終わるかもしれません。

于 2010-03-03T09:53:35.580 に答える