Icons im Menü?
-
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?
-
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.