Höhe Menü-Eintrag ändern

Fragen rund um diverse Windows-Versionen, ihr Verhalten unter Xbase++ und den Umgang mit der API

Moderator: Moderatoren

Antworten
Sören
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 205
Registriert: Mo, 07. Aug 2006 10:18
Wohnort: Leipzig
Danksagung erhalten: 11 Mal

Höhe Menü-Eintrag ändern

Beitrag von Sören »

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?
Beste Grüße,
Sören
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Höhe Menü-Eintrag ändern

Beitrag von AUGE_OHR »

Sören hat geschrieben:ich würde gerne in einem XbpMenu ohne OwnerDrawing die Höhe der Menü-Einträge ändern können...
das was du machst "ist" OwnerDraw, allerdings nicht so wie es sein sollte.
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" ... :banghead:

Das Alaska Demo zeigt dir den Xbase++ Weg wobei der Callback Slot

Code: Alles auswählen

:measureItem := {| nItem, aDims, self | ... }
dir die Koordinaten gibt.

ich würde mich an den Alaska Weg halten ...
gruss by OHR
Jimmy
Sören
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 205
Registriert: Mo, 07. Aug 2006 10:18
Wohnort: Leipzig
Danksagung erhalten: 11 Mal

Re: Höhe Menü-Eintrag ändern

Beitrag von Sören »

Hallo Jimmy,
Jimmy hat geschrieben: das was du machst "ist" OwnerDraw
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: ... dabei teilweise mein OS() "zerschossen"
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.

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.
Jimmy hat geschrieben: :measureItem := {| nItem, aDims, self | ... }
MeasureItem ist mir natürlich bekannt. Doch dann muss ich das gesamte Menü selbst malen, was ich nicht will und auch nicht benötige.

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
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
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

Beitrag von Martin Altmann »

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
:grommit:
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.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Höhe Menü-Eintrag ändern

Beitrag von AUGE_OHR »

Sören hat geschrieben:
Jimmy hat geschrieben: das was du machst "ist" OwnerDraw
Alles, was ich mache, ist mittels einer WinAPI-Funktion ein Image vor einen Menü-Eintrag setzen. Das hat doch nichts mit OwnerDrawing zu tun!
Doch, den du wählst den Weg "von hinten durch das Auge ..."
http://msdn.microsoft.com/en-us/library ... 85%29.aspx
Use the GetSystemMetrics function with the CXMENUCHECK and CYMENUCHECK values to retrieve the bitmap dimensions.
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.
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
Sören
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 205
Registriert: Mo, 07. Aug 2006 10:18
Wohnort: Leipzig
Danksagung erhalten: 11 Mal

Re: Höhe Menü-Eintrag ändern

Beitrag von Sören »

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,
Jimmy hat geschrieben:
Use the GetSystemMetrics function with the CXMENUCHECK and CYMENUCHECK values to retrieve the bitmap dimensions.
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.
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.
Bei dem Office-Ownerdraw-Menu wurde die Reihenfolge der Parameter vertauscht d.h. man muss sein "altes" Menu komplett umstellen ...
Dieses Beispiel kenne ich gar nicht. Ich kenne nur das Beispiel unter "...\ALASKA\XPPW32\SOURCE\samples\basics\OWNERDRW".
Beste Grüße,
Sören
Antworten