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