Hallo,
ich würde gerne in einem XbpMenu ohne OwnerDrawing die Höhe der Menü-Einträge ändern können.
Ich möchte, wie schon erwähnt, kein OwnerDrawing-Menü, vielmehr soll das Menü im Look den Windows-Einstellungen entsprechen.
Mit der WinAPI-Funktion SetMenuItemBitmaps() setze ich lediglich Bitmaps vor die Menü-Einträge.
Nun ist es scheinbar so, dass unter Windows Vista und 7 die Menü-Item-Größe an die Bitmap angepasst wird (was sehr gut ist), während unter Windows XP (und ich nehme an auch allen Windows-Versionen davor) die Menü-Item-Größe fix bleibt und somit mitunter nur ein Ausschnitt der Bitmap vor dem Menü-Eintrag erscheint. Ich behelfe mir damit, die Bitmap-Größe bei allen Windows-Versionen vor Windows Vista an die Menü-Item-Größe anzupassen, aber umgekehrt wäre es mir lieber.
Weiß jemand, ob es eine WinAPI-Funktion gibt, die eben dies bewirkt: Anpassen der Menü-Item-Größe an die Menü-Bitmap-Größe? Wenn nicht: Gibt es eine Möglichkeit, um insbesondere die Höhe eines Menü-Items direkt zu verändern?
Höhe Menü-Eintrag ändern
Moderator: Moderatoren
- AUGE_OHR
- Marvin
- Beiträge: 12909
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Höhe Menü-Eintrag ändern
das was du machst "ist" OwnerDraw, allerdings nicht so wie es sein sollte.Sören hat geschrieben:ich würde gerne in einem XbpMenu ohne OwnerDrawing die Höhe der Menü-Einträge ändern können...
du "zwingst" das OS() etwas zu tun was es sonst nicht "so" tun würde weil du einen "Effekt" her-raus gefunden hast ... nur "weisst" du nichts über die (Neben-) Effekt
ich habe selbst eine Zeit lang mit Menue Ownerdraw experimentiert und mir dabei teilweise mein OS() "zerschossen" weil es sich auf das gesamte OS() auswirkt ... Menu´s die dann "auf dem Kopf stehen" ...
Das Alaska Demo zeigt dir den Xbase++ Weg wobei der Callback Slot
Code: Alles auswählen
:measureItem := {| nItem, aDims, self | ... }
ich würde mich an den Alaska Weg halten ...
gruss by OHR
Jimmy
Jimmy
-
- Rekursionen-Architekt
- Beiträge: 205
- Registriert: Mo, 07. Aug 2006 10:18
- Wohnort: Leipzig
- Danksagung erhalten: 11 Mal
Re: Höhe Menü-Eintrag ändern
Hallo Jimmy,
Das Einzige, was mich ein bisschen stört, ist, dass sich unter Windows XP die Menü-Item-Höhe an der eingestellten Schrifthöhe orientiert, während unter Windows Vista/7 sowohl die Schrifthöhe als auch die Image-Höhe in das Menü-Item-Maß einfließen.
Wie geschrieben: Ich kann damit leben. Unter Vista/7 zeige ich das Image in Originalgröße an, und unter OS < Vista wird das Image auf die dafür vorhandene Größe (wenn nötig) verkleinert.
Ich hatte die Hoffnung, dass ich das, was Vista und 7 automatisch machen, bei den OS <= XP "manuell" per API-Funktion machen könnte. Aber scheinbar geht das wirklich nur per OwnerDrawing. Dann lass ich's wohl dabei bewenden, zumal alle neueren Windows-Versionen ja das tun, was ich brauche.
Trotzdem danke für Deine Antwort, Jimmy!
Alles, was ich mache, ist mittels einer WinAPI-Funktion ein Image vor einen Menü-Eintrag setzen. Das hat doch nichts mit OwnerDrawing zu tun!Jimmy hat geschrieben: das was du machst "ist" OwnerDraw
Diese Funktionalität nutze ich jetzt seit mehreren Jahren in meiner Menü-Klasse, und habe noch nie Probleme damit gehabt. Die Funktion SetMenuItemBitmaps() wirkt auch nicht systemweit, sondern ihr muss das Menü-Handle übergeben werden, auf das sie sich beziehen soll. Wenn Du nach der Funktion googlest, wirst Du sehen, dass sie von vielen Programmierern zu besagtem Zweck genutzt wird.Jimmy hat geschrieben: ... dabei teilweise mein OS() "zerschossen"
Das Einzige, was mich ein bisschen stört, ist, dass sich unter Windows XP die Menü-Item-Höhe an der eingestellten Schrifthöhe orientiert, während unter Windows Vista/7 sowohl die Schrifthöhe als auch die Image-Höhe in das Menü-Item-Maß einfließen.
Wie geschrieben: Ich kann damit leben. Unter Vista/7 zeige ich das Image in Originalgröße an, und unter OS < Vista wird das Image auf die dafür vorhandene Größe (wenn nötig) verkleinert.
MeasureItem ist mir natürlich bekannt. Doch dann muss ich das gesamte Menü selbst malen, was ich nicht will und auch nicht benötige.Jimmy hat geschrieben: :measureItem := {| nItem, aDims, self | ... }
Ich hatte die Hoffnung, dass ich das, was Vista und 7 automatisch machen, bei den OS <= XP "manuell" per API-Funktion machen könnte. Aber scheinbar geht das wirklich nur per OwnerDrawing. Dann lass ich's wohl dabei bewenden, zumal alle neueren Windows-Versionen ja das tun, was ich brauche.
Trotzdem danke für Deine Antwort, Jimmy!
Beste Grüße,
Sören
Sören
- Martin Altmann
- Foren-Administrator
- Beiträge: 16517
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Re: Höhe Menü-Eintrag ändern
Sören,
ich selber nutze kein OwnerDrawing - kann Dir also nicht aktiv helfen.
Nur so viel:
Es ist doch ganz einfach - und "alles" neu machen musst Du auch nicht! Du brauchst ja nur die jeweiligen Standardmethoden aufrufen und Du hast die Optik wie bisher - ist doch das schöne an Klassen und Vererbung
Da wo Du nichts ändern willst, überlagerst Du auch nichts.
Im anderen Fall rufst Du halt die Methode Deiner Parentclass auf und machst dann zusätzlich, was darüber hinaus passieren soll - im Prinzip.
Und die komplette Klasse ist eigentlich von Alaska bereits vorbereitet - für das Menü zumindest:
XPPW32\SOURCE\samples\basics\OWNERDRW\
Viele Grüße,
Martin
ich selber nutze kein OwnerDrawing - kann Dir also nicht aktiv helfen.
Nur so viel:
Es ist doch ganz einfach - und "alles" neu machen musst Du auch nicht! Du brauchst ja nur die jeweiligen Standardmethoden aufrufen und Du hast die Optik wie bisher - ist doch das schöne an Klassen und Vererbung
Da wo Du nichts ändern willst, überlagerst Du auch nichts.
Im anderen Fall rufst Du halt die Methode Deiner Parentclass auf und machst dann zusätzlich, was darüber hinaus passieren soll - im Prinzip.
Und die komplette Klasse ist eigentlich von Alaska bereits vorbereitet - für das Menü zumindest:
XPPW32\SOURCE\samples\basics\OWNERDRW\
Viele Grüße,
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
- AUGE_OHR
- Marvin
- Beiträge: 12909
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Höhe Menü-Eintrag ändern
Doch, den du wählst den Weg "von hinten durch das Auge ..."Sören hat geschrieben:Alles, was ich mache, ist mittels einer WinAPI-Funktion ein Image vor einen Menü-Eintrag setzen. Das hat doch nichts mit OwnerDrawing zu tun!Jimmy hat geschrieben: das was du machst "ist" OwnerDraw
http://msdn.microsoft.com/en-us/library ... 85%29.aspx
da du das scheinbar nicht machst "denkt" das System bei :measureItem der Bitmap Eintrag, welche "vorne" ist, wäre die Referenz und gibt "falsche" Dimensionen zurück.Use the GetSystemMetrics function with the CXMENUCHECK and CYMENUCHECK values to retrieve the bitmap dimensions.
Man kann ja auch ein Icon auf die "rechte" Seite setzen, also nach dem Eintrag, und du wirst sehen das er dann die Schrift als Referenz Grösse nimmt.
btw. unter VB verwendet man üblicherweise SetMenuItemBitmaps() mit der Imagelist() Class um ein Menü zu "füttern"
Zu Xbase++ Owenerdraw : Es gibt 2 Beispiele von Alaska !!!
Ich empfehle die Variante aus dem Helpfile weil dort der "fehlende" Bitmap Parameter "angehängt" wird.
Bei dem Office-Ownerdraw-Menu wurde die Reihenfolge der Parameter vertauscht d.h. man muss sein "altes" Menu komplett umstellen ...
gruss by OHR
Jimmy
Jimmy
-
- Rekursionen-Architekt
- Beiträge: 205
- Registriert: Mo, 07. Aug 2006 10:18
- Wohnort: Leipzig
- Danksagung erhalten: 11 Mal
Re: Höhe Menü-Eintrag ändern
Hallo Martin,
ein Grund, weshalb ich bisher noch kein OwnerDrawing verwende, ist, weil ich die Xbase++ Version 1.9 ohne SL1 habe.
Diese kann zwar OwnerDrawing, hat aber diesbezüglich eine ganze Menge Bugs, die erst mit dem SL1 behoben wurden. Außerdem bietet SL1 einige für OwnerDrawing wirklich nützliche Funktionen wie GraEdge(), GraGradient() oder TranslateSysColor(), die mir nicht zur Verfügung stehen.
Hallo Jimmy,
ein Grund, weshalb ich bisher noch kein OwnerDrawing verwende, ist, weil ich die Xbase++ Version 1.9 ohne SL1 habe.
Diese kann zwar OwnerDrawing, hat aber diesbezüglich eine ganze Menge Bugs, die erst mit dem SL1 behoben wurden. Außerdem bietet SL1 einige für OwnerDrawing wirklich nützliche Funktionen wie GraEdge(), GraGradient() oder TranslateSysColor(), die mir nicht zur Verfügung stehen.
Hallo Jimmy,
Doch, Jimmy, das mache ich. Allerdings nutze ich die von der Funktion GetSystemMetrics() zurückgegebenen CheckMark-Werte nur bei Windows-Versionen <= XP, um die Bitmap ggf. auf dieses Maß zu verkleinern.Jimmy hat geschrieben:da du das scheinbar nicht machst "denkt" das System bei :measureItem der Bitmap Eintrag, welche "vorne" ist, wäre die Referenz und gibt "falsche" Dimensionen zurück.Use the GetSystemMetrics function with the CXMENUCHECK and CYMENUCHECK values to retrieve the bitmap dimensions.
Dieses Beispiel kenne ich gar nicht. Ich kenne nur das Beispiel unter "...\ALASKA\XPPW32\SOURCE\samples\basics\OWNERDRW".Bei dem Office-Ownerdraw-Menu wurde die Reihenfolge der Parameter vertauscht d.h. man muss sein "altes" Menu komplett umstellen ...
Beste Grüße,
Sören
Sören