Icons im Menü?



  • Danke Martin Richter,

    hab es mit InsertMenu probiert, allerdings klappt es nicht. Das Icon wird nicht angezeigt.

    Hab es in den OnInitDialog eingebaut:

    CMenu* mmenu = GetMenu();
    
    	int pos = FindMenuItem(mmenu, _T("File"));
    
    	CMenu* submenu = mmenu->GetSubMenu(pos);
    	pos = FindMenuItem(submenu, _T("New"));
    
    	submenu->InsertMenu(pos + 1, MF_BYPOSITION , IDB_BITMAP1, (CBitmap*) _T("\\res\\bitmap1.bmp)"));
    

    was mache ich denn da falsch?



  • so gehts auch nicht:

    CMenu* mmenu = GetMenu();
    
        int pos = FindMenuItem(mmenu, _T("File"));
    
        CBitmap bmp;
        bmp.LoadBitmap(IDB_BITMAP1);
    
        CMenu* submenu = mmenu->GetSubMenu(pos);
        pos = FindMenuItem(submenu, _T("New"));
    
        submenu->InsertMenu(pos + 1, MF_BYPOSITION , IDB_BITMAP1, &bmp);
    

    ich verzweifle langsam, gibt auch kein tutorial bei youtube dafür...


  • Mod

    Deine Bitmap muss solange existieren wie auch Dein Menü. Das ist nicht der Fall.

    Wie kommst Du darauf, dass man einen Pfad zu einer Bitmap casten kann?
    Lies ein Tutorial über die WinAPI oder die MFC.



  • deswegen hab ich es ja auch geändert, unter http://msdn.microsoft.com/de-de/library/89c2aa4b.aspx steht:

    BOOL InsertMenu(
       UINT nPosition,
       UINT nFlags,
       UINT_PTR nIDNewItem,
       const CBitmap* pBmp 
    );
    

    bei pBmp steht: "Points to a CBitmap object that will be used as the menu item."

    Wie meinst du das mit dem existieren? Die Bitmap gibt es doch?!


  • Mod

    No! Dein CBitmap bmp; existiert nurin dem Scope, in dem Du es verwendest. Danach ist es zerstört.



  • Sieht mir schwer nach Murks aus! Deine Anfangsidee mit SetMenuItemBitmap war doch toll...
    Normalerweise sollte man eine Toolbar als Ressource hinzufügen und die entsprechenden Icons dort anlegen und mit aussagekräftigen IDs versehen (nicht sowas wie "IDB_BITMAP1").
    Wie lädt man Icons? MFC legt immer die Variable m_hIcon an, hättest du die mal ein wenig gestalked wärst du im CDialogEx auf:

    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    

    gestoßen.

    Probiers mal so:

    CMenu* mmenu = GetMenu();	
    
    HICON hIcon = AfxGetApp()->LoadIcon(ID_DES_ICONS_DAS_GELADEN_WERDEN_SOLL);
    mmenu->SetMenuItemBitmaps(ID_DES_ITEMS_IN_DEINEM_MENUE, MF_BYCOMMAND, ConvertIconToBitmap(hIcon), NULL);
    

    Vorher natürlich noch folgende "magische" Funktion in deine xyzdlg.cpp einfügen:

    CBitmap* CDeinProjektDlg::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);
    }
    

    und entsprechend in deine xyzdlg.h:

    CBitmap* ConvertIconToBitmap(HICON hIcon);
    


  • Endlich gehts, danke.

    ich hab ein icon geladen, aber der hintergrund ist weiß. in der DrawIconEx-funktion kann man die farbe angeben,(255,255,255) ist ja weiß, aber wenn ich es auf 192,192,192 setze, ist immer noch weiß, wenn ich alle werte 0 setze ist der hintergrund schwarz. wie bekomm ich denn die hintergrundfarbe die ich haben möchte? geht da nur schwarz und weiß?



  • Hat niemand eine Idee? 😞


  • Mod

    Nein man kann in DrawIconEx keine Farbe angeben.
    Du kannst einen Brush angeben für ein FLickerfree drawing. i.a. wird der aber nicht benutzt.
    Ansonsten wird eben auf den existierenen Hintergrund gezeichnet, wie es der Maske entspricht.

    Also zeige Code.



  • ich hab den Code weitestgehend von StutzPeter übernommen, hab nur die größe angepasst.

    aufruf in OnInit

    CMenu* mmenu = GetMenu();
    
    	HICON hIcon = theApp.LoadIcon(IDI_ICON1);
    	mmenu->SetMenuItemBitmaps(ID_FILE_NEW, MF_BYCOMMAND, ConvertIconToBitmap(hIcon), NULL);
    

    die funktion dazu sieht so aus

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

    was ich nicht verstehe ist, wenn du sagst er zeichnet auf den existierenden hintergrund, wieso ist dann der hintergrund des icons weiß? ich hab bei der erstellung des icons dieses grün (was transparent sein soll) benutzt.



  • Hat wirklich niemand eine Lösung? 😞



  • ich hab bei der erstellung des icons dieses grün (was transparent sein soll) benutzt

    DIESES Grün ist nicht transparent, sondern grün. In anderer Software wird Transparenz z.B. in schwarz, braun oder sonstwie dargestellt.Du musst ein Icon erstellen und einbinden, das wirklich keinen Hintergrund hat.



  • Das ergibt Null Sinn! Wenn dem so wäre, wär der Hintergrund grün und nicht weiß! Außerdem, wenn ich das Icon anstelle des Default-MFC-Icons oben links einbinde, ist keine Hintergrund zu sehen. Das Icon wurde richtig erstellt, darüber bin ich schon lange hinaus...



  • http://www.codeproject.com/Articles/16529/Simple-Menus-That-Display-Icons-Minimalistic-Appro

    das Beispiel ist recht gut. Allerdings finde ich persönlich dass der Aufwand es so zu realisieren wesentlich größer ist, als den Hintergrund im Icon-Editor einfach in 240,240,240 zu färben.


Anmelden zum Antworten