Icons im Hqauptmenü



  • Hallo Leute, ich bin auf des Suche nach einer Möglichkeit Icons vor den Items in meinem Hauptmenü darzustellen. Die Forensuche hat mir einige Treffer beschert. Interessant war dieser Beitrag: http://www.c-plusplus.net/forum/viewtopic-var-t-is-198657.html Meine Fragen hierzu bei dem Codeausschitt

    ModifyMenu(hMenu, IDM_EXIT, MF_BYCOMMAND | MF_ENABLED | MF_OWNERDRAW,  IDM_EXIT, NULL);
    

    1. wird da nur der Item der mit einem Icon dargestellt werden soll auf Ownerdraw gesetzt und die restlichen Items werden normal gezeichnet?

    2. wie komme ich an die Farbe für den selektierten Item, ich möcht sie nicht fest speichern im Code wie im dem Beispiel beschrieben, sondern je nach verwendetem Theme korrekt auslesen und darstellen.

    3. ähnlich wie bei 2, wie erzeuge ich z.B. die blaue Linie um das selektierte Item (bezieht sich auf die Verwendung Aero Theme + Vista), soll aber auch auf verschiedenen Systemen systemgetreu dargestellt werden.

    Ich hoffe ihr könnt mir hier weiterhelfen, danke schon mal.


  • Mod

    Wenn Du nur ein Icon hinzufügen möchtest, dass verwende einfach SetMenuItemInfo und rodne ein Bitmap zu.
    http://msdn.microsoft.com/en-us/library/ms648001(VS.85).aspx



  • Danke Martin für die Antwort.
    Leider bekomme ich mit dieser Lösung nur ein Bitmap an die gewünschte Positon, was muss ich anstellen um ein Icon dort darzustellen? Da gibts dann noch die Konstante HBMMENU_SYSTEM, die ich bei hbmpItem setzten kann, dann erscheint an dieser Stelle mein Programmicon, möglicherweise muss ich ja dann noch was bei dwItemData angeben, aber ich komme da nicht weiter. Ich wäre für jede Hilfe dankbar.


  • Mod

    Es gehen nur Bitmaps. Du musst also das Icon in eine Bitmap umwandeln!



  • Ja, das habe ich mir dann schon gedacht. Gibt es für die Konvertierung bereits fertige Winapi-Funktionen oder wie muß ich das bewerkstlligen?


  • Mod

    Mit GetIconInfo kannst Du den colorierten Teil einfach bekommen!
    Allerdings berücksichtigt das nicht die Maske.
    Ansonsten DrawIcon in einen eigenen Memory DC ausführen mit einer entsprechenden Bitmap.



  • Martin Richter schrieb:

    Ansonsten DrawIcon in einen eigenen Memory DC ausführen mit einer entsprechenden Bitmap.

    Ja danke für den Tip, das hab ich jetzt gemacht und mal testweise den Background meines DC auf weiß gesetzt. Das Icon wird nun dargestellt. Die Transparenten Areas werden nun erwartungsgemäß weiß gezeichnet. Was muß ich nun anstellen um an die Menüfarbe ran zu kommen? Das nächste Problem wäre dann noch, wenn der Item die Selection erhält, stimmt die "transparente" Farbe dann auch wieder nicht, dann müsste ich das Bitmap doch zur Laufzeit austauschen oder was würdest du mir raten zu machen?


  • Mod



  • Ok, danke, dann wede ich maich da mal einlesen.



  • So meine Ownerdraw Funktion für die Menüitems funktioniert zufrieden stellend, zumindest was den Teil der den String behandelt betrifft. Mein nächster Schritt ist die Darstellung des Häckchens für ausgewählte Items. Hierzu habe ich 2 Fragen:
    1.Wie komme ich an den Handle des Icons, das muss doch irgendwo in den CommonControls stecken oder?
    2.Wenn ich das dann habe wie kann ich dann das Icon im grayed Modus für ausgegraute Menüeintraäge darstellen?


  • Mod

    1. Wenn Du keine Bitmap definierst werden IMHO die Systemicons verwenet wenn Du den Stil MF_CHECKED setzt.
    Anosnten schau bitte in die Doku zu LoadBitmap (OBM_CHECKBOXES).
    http://msdn.microsoft.com/en-us/library/ms532309(VS.85).aspx
    2. Entweder entwirfst Du für jeden ZUstand selber ein Icon, oder Du benutzt einen gängigen Algorithmus für das Ausgrauen, der zum Beispiel auch in der im MFC Toolbar-Code ds VC6 verwendet wird, oder wie er eben auch in der MSDN beschrieben ist:
    http://msdn.microsoft.com/en-us/library/3ca21ssk(VS.71).aspx

    Selbst wenn Du nur WinAPI nutzt seht Dir ja evtl. der Sourcecode der MFC zur Verfügung um den Code zu kopieren.



  • Danke Martin für die Antwort, mitlerweile hab ich die benötigten Funktionen zusammen und die Darstellung ist wie erwartet, leider nicht im Vistastyle, aber ok man kann nicht alles haben. Ich habe für das ausgrauen der Bitmaps, bzw Icons die Funktion DrawState benutzt, das Häckchen hab ich mit OBM_CHECK hinbekommen. Ich denke mal, daß OBM_CHECKBOXES für den Treeview vorgesehen ist? Um ein Icon aus meiner Resource dem Menüitem zuzuordnen, übergebe ich dwItemData der MENUITEMINFO beim Setzten von MFT_OWNERDRAW den Index meiner Icon-Resource. Auch das klappt super. Jetzt möchte ich noch eine letzte Hürde nehmen. Und zwar möchte ich ein Icon aus einer *.exe Datei im Format 16x16 laden, leider läd er mit mit ExtractIcon das Icon im Format 32x32 obwohl das Icon in der exe als 16x16 vorliegt. Was kann ich machen damit das Icon als 16x16 geladen wird? Wenn ich DrawIcon anweise das Icon mit 16x16 zu Zeichnen klappt das zwar, aber das Icon sieht nicht mehr ganz wie das ursprüngliche 16x16 Icon aus, vielmehr erkennt man, daß das Icon auf 32x32 hochgerechnet und dann wieder auf 16x16 verkleiner wurde.


  • Mod

    Zum Laden der Icons in korrekter Größe musst Du LoadImage verwenden.
    http://blog.m-ri.de/index.php/2008/03/15/loadicon-macht-es-nicht-richtig/



  • Martin Richter schrieb:

    Zum Laden der Icons in korrekter Größe musst Du LoadImage verwenden.
    http://blog.m-ri.de/index.php/2008/03/15/loadicon-macht-es-nicht-richtig/

    Ähm das kann ich doch nicht auf ein Icon z.B. das dritte in einer externen *.exe oder *.dll Datei anwenden? Hierfür muß ich doch ExtractAssociatedIcon, ExtractIcon oder ExtractIconEx benutzten oder liege ich da falsch? Wenn ich nun ein Icon 32x32 mit einem Handle versehe, dann kann ich es so in meinen DC malen:

    DrawIconEx(hDC, x, y, hIcon, 16, 16, 0, 0, DI_NORMAL);
    

    als Ausgabe erhalte ich ein auf 16x16 verkleinertes Icon. Soweit so gut. Hier kommt nun das Problem versuche ich jedoch das Icon ausgegraut zu zeichnen, mit folgendem Code:

    DrawState(hDC, NULL, NULL, (LPARAM)hIcon, 0, x, y, 16, 16, DST_ICON | DSS_DISABLED);
    

    dann erhalte ich zwar einen ausgegrauten Bereich von 16x16, jedoch ist nur das linke obere Viertel des Icons dargestellt, weil es nicht auf die Größe 16x16 runter skalliert wurde. Was muss ich also tun wenn ich den Handle auf ein 32x32 großes Icon habe und möchte dieses ausgegraut auf 16x16 darstellen? Ich komm da im Momment echt nicht weiter.



  • Resize Icon von dem man nur den Handle hat? Keiner eine Idee?


Anmelden zum Antworten