![]() |
TextRect oder Itemweite in WM_MEASUREITEM zuweisen
Liste der Anhänge anzeigen (Anzahl: 1)
Im moment weise ich eine feste Weite dem Menü zu.
Delphi-Quellcode:
da ich aber mehrere Menüs habe und die zur Laufzeit erstellt werden
WM_MEASUREITEM:
begin PMis := Pointer(lP); if wP = 0 then begin PMis^.itemWidth := 170; PMis^.itemHeight := 18; Result := 1; Exit; end; end; sieht es bescheiden aus wenn ich für "About" eine länge von 200 zuweise. Wie kann ich anhand der länge vom string(text) diese im WM_MEASUREITEM zuweisen ? Also abhängig vom längsten Menü Eintrag. Außerdem ist mir nicht bekannt wie lang der längste übergebene String zur Laufzeit ist. EDIT: Hab mal ein Bild angehängt.. So geht das gar nicht. About wäre dann extrem lang und das untere Menü , die länge der einträge ist mir ja nicht bekannt! gruss Emil |
Re: TextRect oder Itemweite in WM_MEASUREITEM zuweisen
Also mit TCanvas.TextWidth bekomst du die länge eines breite in Pixeln.
Welcher String der längste ist lässt sich ja relativ leicht rausfinden. Also wäre meine erste überlegung jetzt:
Delphi-Quellcode:
Greez HenKst
function GetLongest(strings: TStringList): string
var i: integer begin result:= ''; for i:= 0 to strings.count-1 do begin if length(strings[i]) > length(result) then result:= strings[i]; end; end; WM_MEASUREITEM: begin PMis := Pointer(lP); if wP = 0 then begin PMis^.itemWidth := Canvas.TextWidth(GetLongest(menueinträge));//ich weiss ja nicht wo die herkommen :) PMis^.itemHeight := 18; Result := 1; Exit; end; end; |
Re: TextRect oder Itemweite in WM_MEASUREITEM zuweisen
Zitat:
Innerhalb WM_MEASUREITEM: kann man den längsten string nicht ermitteln da immer nur der aktuelle Text vom Eintrag übergeben wird. Hab mich mal was schlau gemacht und bin auf der lösung hängen geblieben. Denke das einbinden von Grafics dürfte noch nonvcl sein wenn nicht muss ich mir was anderes überlegen.
Delphi-Quellcode:
function GetTextWidth(fnt: TFont; const text:string): Integer;
var dc: hdc; tsize : Windows.TSize; begin dc := GetDC(0); SelectObject(DC, fnt.Handle); GetTextExtentPoint32(dc, PChar(text), Length(text), tsize); ReleaseDC(0, DC); Result := tsize.cx; end;
Delphi-Quellcode:
Hole mir die Textlänge und addiere die weite des Icon.png hinzu.
WM_MEASUREITEM:
begin PMis := Pointer(lP); if wP = 0 then begin Txt := GetMenuTxt(PDis.ItemID, Img); try hFDefault := TFont.Create; PMis^.itemWidth := GetTextWidth(hFDefault, Txt) + 16; PMis^.itemHeight := 18; finally hFDefault.Free; end; Result := 1; Exit; end; Kann jetzt nicht sagen welche Methode besser ist deine oder meine ;) gruss Emil |
Re: TextRect oder Itemweite in WM_MEASUREITEM zuweisen
Zitat:
also hättest du Graphics mit Canvas sowieso drin :) Wobei mir nicht ganz klar ist wie du jetzt an den längsten string kommst. |
Re: TextRect oder Itemweite in WM_MEASUREITEM zuweisen
Zitat:
PMis^.itemWidth wird niemals kleiner einmal zugewiesen bleibt die minimalste weite. Kann sich also nur vergrößern. :) Die graphics habe ich nur deshalb eingebunden um TFont zur verfügung zu haben. Könnte mir theoretisch den part aus graphics rauskopieren dann brauchte ich die nicht. GetTextExtentPoint32 hat nix mit Graphics zu tun ist eine reine API und befindet sich in Windows.pas gruss Emil |
Re: TextRect oder Itemweite in WM_MEASUREITEM zuweisen
Zitat:
{quote="EWeiss] PMis^.itemWidth wird niemals kleiner einmal zugewiesen bleibt die minimalste weite. Kann sich also nur vergrößern. Smile [/quote] Na wenns klappt^^ Dann mal viel Erfolg noch damit GreeZ HenKst |
Re: TextRect oder Itemweite in WM_MEASUREITEM zuweisen
Ja nur ich benutze kein canvas ;)
gruss Emil |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz