![]() |
Breite der Panels in der StatusBar
Ich berechne die breite der StatusBar - panels mit
Delphi-Quellcode:
aber sie werden zu klein.
for P := 0 to StatusBar.Panels.Count - 1 do
begin StatusBar.Panels.Items[P].Width := StatusBar.Canvas.TextWidth(StatusBar.Panels.Items[P].Text); end; Das wird noch schlimmer wenn man die Schriften im Windows vergrößert |
Moin Shadowbug,
erst einmal herzlich willkommen hier in der Delphi-PRAXiS. Das die Panels zu schmal werden könnte daran liegen, dass der 3D Rahmen mit zu der Breite zählt. Diesen und ähnliche Werte kannst Du mit der API Funktion GetSystemMetrics auslesen. Da der Rahmen an beiden Seiten zu finden ist natürlich mal 2. Evenutuell kann das schon helfen:
Delphi-Quellcode:
Weitere Parameter wie SM_CXEDGE kannst Du dem PSDK entnehmen.
for P := 0 to StatusBar.Panels.Count - 1 do
begin StatusBar.Panels.Items[P].Width := StatusBar.Canvas.TextWidth(StatusBar.Panels.Items[P].Text)+ 2*GetSystemMetrics(SM_CXEDGE); end; |
Leider kein Erfolg. Aber die Funktion kannte ich auch noch nicht.
Die Breite der "Stege" ist aber konstant und kann es demnach auch nicht sein. Habs probiert. Ich habe herausgefunden, dass das Problem mit der Einstellung UseSystemFont zu tun hat. Nutzt man den System Font nicht kann man durch addieren einer Konstante das Problem lösen. |
Moin Shadowbug,
schade. :? Eine andere Idee hab' ich zur Zeit leider nicht. |
Man müsste der Methode TextWidth beibrigen dass sie ihre Berechnung auf der Grundlage des eingestellten Systemfonts macht.
|
Re: Breite der Panels in der StatusBar
Folgende Funktion setzt die optimale Breite eines Panels:
Delphi-Quellcode:
Oh, hoppla ! Da hab ich ja einen ganz alten Thread ans Tageslicht geholt.
function TrueFontWidth(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; procedure AutoSizeStatusbarPanel(sb: TStatusBar; idx:Integer); var s : string; borders : array[0..2] of Integer; begin // don't deal with simple panels if sb.SimplePanel // don't resize the last panel or (idx >= sb.Panels.Count-1) then Exit; // get the borders of the statusbar // border[0] = width of the horizontal border // border[1] = width of the vertical border // border[2] = width of the border between rectangles SendMessage(sb.Handle, SB_GETBORDERS, 0, Integer(@borders)); s := sb.Panels[idx].Text; // calculate the width of the Panel sb.Panels[idx].Width := TrueFontWidth(sb.Font, s) + borders[2]*2 +2; // vertical border * 2 + 2 extra Pixels end; |
Re: Breite der Panels in der StatusBar
Zitat:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var iPanel: Word; begin With StatusBar1 do begin Canvas.Font := Font; // <-- Dem Canvas die Font zuweisen: for iPanel := 0 to Panels.Count - 1 do begin Panels.Items[iPanel].Width := Canvas.TextWidth(Panels.Items[P].Text) + 5; end; end; end; Zitat:
Nebenbei: SB_GETBORDERS ist in CommCtrl.pas deklariert. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:35 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