Measureinfo vs. Drawinfo und Menüs

23/01/2008 - 12:30 von Gert Wietzorek | Report spam
Hallo,

ich subclasse Menüs um ownerdraw Menüs zu erstellen und kann mir dabei
nicht erklàren, warum die Werte, die von mir bei der WM_Measureitem
Nachricht übergeben werden, von denen abweichen, die mir bei der
WM_Drawitem Nachricht übermittelt werden.
Anbei ein Code Auszug, der auf das wesentliche komprimiert wurde (denke
mal, das alles wesentliche enthalten ist..)

Beispiel:

declare sub MoveMemory lib "kernel32" Alias "RtlMoveMemory" ( _
hpvdest as any, hpvsource as any, byval cbcopy as long)

Private Function ISUBClass_WindowProc(byval hwnd&, _
byval iMsg&, _
byval wParam&, _
byval lParam&) as long

dim Measureinfo as MeasureItemStruct
dim DrawInfo as Drawitemstruct



case WM_MEASUREITEM
call MoveMemory(measureinfo,byval lParam, len(Mesureinfo))
set t=GetMenuInfo(Measureinfo.itemid) 'Hier uninteressante Funktion,
'berechnet u.a. nur die
'benötigte
'Breite für das Menü
if not t is nothing then
debug.print t.key, t.width

'Liefert für t.width Werte von 39-185 für die einzelnen
'Menüeintràge zurück - diese sind korrekt und werden gesetzt

measureinfo.itemwidth=t.width
measureinfo.itemheight=t.height
call MoveMemory(byval lparam,measureinfo,len(measureinfo)
end if


.

case WM_DRAWITEM
if wParam=0 then
call MoveMemory(Drawinfo,Byval lParam, len(drawInfo))
set t=getMenuInfo(DrawInfo.itemID)
if not t is nothing then
debug.print t.key,t.width, _
Drawinfo.rcitem.right-drawinfo.rcitem.left

'rcitem. liefert wie erwartet für alle Menüpunkte
'den gleichen Wert
'dieser betràgt (in diesem Fall) aber 224 Pixel,
'nicht wie von
'mir in Measureitem übergeben max. 185 Pixel
'für den breitesten Menüpunkt
.
end if
end if



end sub

Die Differenz zum übergebenen Wert hàngt offensichtlich von der
eingestellten Schriftgröße für Menüs ab.

Bei 10 Punkt Schrift wie oben ersichtlich 39 Pixel, bei 8 Punkt Schrift
29 Pixel.

Kann mir irgend jemand erklàren, wo diese Differenz herkommt und ob man
sie berechnen kann? Die Menüs werden jedenfalls immer breiter als
beabsichtigt. Ich hàtte erwartet, das immer der in MeasureItem gesetzte
größte Wert als Breite geliefert wird und Darstellungsprobleme daher nur
an mir liegen können, falls ich diesen falsch berechne...

Gruß

Gert



| Antworten nur in die Newsgroup, |
| die E-Mail Adressen existieren nicht! |
| |
| answers and questions only to the newsgroup,|
| the email adresses are not valid |
| |
| http://www.gwsoftware.de |
 

Lesen sie die antworten

#1 Thorsten Albers
23/01/2008 - 13:08 | Warnen spam
Gert Wietzorek schrieb im Beitrag
<fn78ml$g8h$...
Die Differenz zum übergebenen Wert hàngt offensichtlich von der
eingestellten Schriftgröße für Menüs ab.
Bei 10 Punkt Schrift wie oben ersichtlich 39 Pixel, bei 8 Punkt Schrift
29 Pixel.
Kann mir irgend jemand erklàren, wo diese Differenz herkommt und ob man
sie berechnen kann? Die Menüs werden jedenfalls immer breiter als
beabsichtigt. Ich hàtte erwartet, das immer der in MeasureItem gesetzte
größte Wert als Breite geliefert wird und Darstellungsprobleme daher nur
an mir liegen können, falls ich diesen falsch berechne...



Nur 'mal so auf die Schnelle geraten würde ich annehmen, daß WM_MEASUREITEM
von Dir die Breite des Textbereiches eines Menüpunktes anfordert und
WM_DRAWITEM dann das Rechteck übergibt, das den Textbereich >>und<< den
Bereich für Zusàtze vor dem Text des Menüpunktes wie etwa den
Menüpunkt-Haken umschließt. Die Werte von 39 bzw. 29 Pixeln scheinen dafür
zu passen. Schematisch:

|- MEASUREITEM -|
|Zusatz|Abstand|Menüpunkttext |
|-- DRAWITEM |

Der Hintergrund wàre: Die Breite des Menüpunkt-Textes ist von Dir zu
bestimmen, aber die Breite von 'Zusatz' und 'Abstant' beruht auf
systemglobalen Einstellungen.
Leider làßt sich das nicht anhand der Dokumentation verifizieren, die in
Bezug auf selbstgezeichnete Menüs ziemlich schlecht ist.

-
THORSTEN ALBERS Universitàt Freiburg
albers@
uni-freiburg.de
-

Ähnliche fragen