Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Breite der Panels in der StatusBar (https://www.delphipraxis.net/5840-breite-der-panels-der-statusbar.html)

Shadowbug 20. Jun 2003 18:21


Breite der Panels in der StatusBar
 
Ich berechne die breite der StatusBar - panels mit

Delphi-Quellcode:
for P := 0 to StatusBar.Panels.Count - 1 do
    begin
   StatusBar.Panels.Items[P].Width :=
   StatusBar.Canvas.TextWidth(StatusBar.Panels.Items[P].Text);
    end;
aber sie werden zu klein.
Das wird noch schlimmer wenn man die Schriften im Windows vergrößert

Christian Seehase 20. Jun 2003 18:38

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:
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;
Weitere Parameter wie SM_CXEDGE kannst Du dem PSDK entnehmen.

Shadowbug 20. Jun 2003 18:49

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.

Christian Seehase 20. Jun 2003 18:51

Moin Shadowbug,

schade. :?
Eine andere Idee hab' ich zur Zeit leider nicht.

Shadowbug 20. Jun 2003 19:03

Man müsste der Methode TextWidth beibrigen dass sie ihre Berechnung auf der Grundlage des eingestellten Systemfonts macht.

shmia 20. Mär 2008 16:52

Re: Breite der Panels in der StatusBar
 
Folgende Funktion setzt die optimale Breite eines Panels:
Delphi-Quellcode:
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;
Oh, hoppla ! Da hab ich ja einen ganz alten Thread ans Tageslicht geholt.

toms 20. Mär 2008 17:19

Re: Breite der Panels in der StatusBar
 
Zitat:

Zitat von Shadowbug
Ich berechne die breite der StatusBar - panels mit

Delphi-Quellcode:
for P := 0 to StatusBar.Panels.Count - 1 do
    begin
   StatusBar.Panels.Items[P].Width :=
   StatusBar.Canvas.TextWidth(StatusBar.Panels.Items[P].Text);
    end;
aber sie werden zu klein.
Das wird noch schlimmer wenn man die Schriften im Windows vergrößert

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:

procedure AutoSizeStatusbarPanel(sb: TStatusBar; idx:Integer);
Es sollte jedoch beachtet werden, dass bei einem Pfad-String das Panel sehr gross werden könnte.

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