Icon im Menü



  • Ich möchte gerne Icon im Menü haben.
    Dazu benutze ich folgende Function:

    HBITMAP Wein::Convert_ICON_TO_BITMAP(HICON hIcon)
    {
    	HBITMAP bmp;
        HDC ClientDC;
    	ClientDC = CreateCompatibleDC(NULL);
        bmp = CreateCompatibleBitmap(ClientDC, 13, 13);
        SelectObject(ClientDC,bmp);
        DrawIconEx(ClientDC, 0, 0, hIcon, 13, 13, 0, (HBRUSH)RGB(255, 255, 255), DI_IMAGE);
    
        HBITMAP hBitmap = (HBITMAP)::CopyImage((HANDLE)((HBITMAP)bmp), 
    			IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE);
    
    	DeleteObject(bmp);
    	DeleteDC(ClientDC);
    	return hBitmap;
    }
    

    Der Aufruf:

    HICON icon = LoadIcon(hInst,MAKEINTRESOURCE(IDI_ICON1));
    			SetMenuItemBitmaps(GetSubMenu(GetMenu(hWnd),7),IDM_MENU,MF_BYCOMMAND,Convert_ICON_TO_BITMAP(icon),NULL);
    

    Nun ist mein Icon aber nur Monocrome, warum?



  • Weil...

    The selected and clear bitmaps should be monochrome. The system uses the Boolean AND operator to combine bitmaps with the menu so that the white part becomes transparent and the black part becomes the menu-item color. If you use color bitmaps, the results may be undesirable.

    http://msdn.microsoft.com/en-us/library/ms647998%28v=vs.85%29.aspx





  • Bei codeproject habe ich folgendes gefunden leider MFC
    Dann habe ich versucht das Ganze in WinApi zu schreiben aber
    da habe ich etwas falsch gemacht.
    Denn bei Codeproject sind die Icons farbig.
    Nun zum Code:

    CBitmap* CMainFrame::ConvertIconToBitmap(HICON hIcon)
    {
        CDC dc;
        CBitmap bmp;
        CClientDC ClientDC(this);
        dc.CreateCompatibleDC(&ClientDC);
        bmp.CreateCompatibleBitmap(&ClientDC, 13, 13);
        CBitmap* pOldBmp = (CBitmap*)dc.SelectObject(&bmp);
        ::DrawIconEx(dc.GetSafeHdc(), 0, 0, hIcon, 13, 13, 0, (HBRUSH)RGB(255, 255, 255), DI_NORMAL);
        dc.SelectObject(pOldBmp);
        dc.DeleteDC();
        HBITMAP hBitmap = (HBITMAP)::CopyImage((HANDLE)((HBITMAP)bmp), 
    			IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE);
    
        return CBitmap::FromHandle(hBitmap);
    }
    

    Wo liegt hier mein Fehler??



  • Probiers mal hiermit:

    HBITMAP ConvertIconToBitmap(HICON hIcon) 
    { 
    	HDC hdc = GetDC(GetDesktopWindow());
    
    	ICONINFO iconInfo;
    	BITMAP bitmapInfo;
    	if(!GetIconInfo(hIcon, &iconInfo) || !GetObject(iconInfo.hbmColor, sizeof(bitmapInfo),&bitmapInfo))
    		return NULL;
    
    	HBITMAP bitmap = CreateCompatibleBitmap(hdc, bitmapInfo.bmWidth, bitmapInfo.bmHeight); 
    	HDC targetDC = CreateCompatibleDC(hdc);
    
    	HGDIOBJ oldBM = SelectObject(targetDC, bitmap);
    	DrawIconEx(targetDC, 0, 0, hIcon, bitmapInfo.bmWidth, bitmapInfo.bmHeight, 0, (HBRUSH) GetStockObject(WHITE_BRUSH), DI_NORMAL); 
    	SelectObject(targetDC, oldBM);
    
    	DeleteDC(targetDC);
    	ReleaseDC(GetDesktopWindow(), hdc);
    
    	return bitmap; 
    }
    


  • Mir fällt gerade auf, dass ein Aufruf von ReleaseDC vor dem return fehlt. Am besten ist ohnehin, man bastelt sich eine kleine Wrapperklasse und lässt Freigaben vom Compiler erledigen.



  • Danke für den Tip.
    Aus der Fehler war, das eine CompatibleBitmap aus einem CompatibleDC nur Monocrom wird.
    Hab wieder was dazu gelernt.

    Tolles Forum


Anmelden zum Antworten