2010-03-03 1 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!!! 
} 

을하지만 지금은 메뉴 항목 끝에 어딘가에 상황에 맞는 메뉴의 중간에하지 배치 :

또한이 코드와이 메뉴 항목에 비트 맵을 추가 할 수 있습니다. 단순히 uMenuIndex 대신 -1을 설정하면 작동하지 않습니다. 메뉴 항목은 실제로 끝 부분에 있지만 비트 맵은 표시되지 않습니다.

아이디어가 있으십니까?

+1

일반적으로 항목을 배치 할 위치를 제어 할 수 없습니다. 코드보다 다른 항목을 추가하는 다른 컨텍스트 메뉴 확장이있을 수 있습니다. – Kerido

답변

3

SetMenuItemBitmaps에 대한 설명서에는 InsertMenu과 같이 유효한 위치로 -1을 수락하는 것에 대해서는 아무런 언급이 없습니다. 추가 한 항목의 명령 ID를 알고 있고 그 항목이 고유하다는 것을 알고 있으므로 위치 대신 명령으로 비트 맵을 추가하십시오.

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

당신은 메뉴 호스트가 메뉴 항목을 넣어 어디 관한 주신 지침을 무시하고 있습니다. 지금까지 성공한 유일한 이유는 메뉴 호스트가 추가 한 후에 다른 항목을 추가하지 않았기 때문이며 다른 모든 메뉴 확장자는 규칙에 따라 재생되었으며 추가 된 항목은 추가되었습니다. 그들이 너 같은 규칙을 무시하기로 결정했다면, 그들 대신 너의 끝이 될지도 모른다.

관련 문제