AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Breite der Panels in der StatusBar

Ein Thema von Shadowbug · begonnen am 20. Jun 2003 · letzter Beitrag vom 20. Mär 2008
Antwort Antwort
Shadowbug

Registriert seit: 24. Apr 2003
3 Beiträge
 
#1

Breite der Panels in der StatusBar

  Alt 20. Jun 2003, 18:21
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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#2
  Alt 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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Shadowbug

Registriert seit: 24. Apr 2003
3 Beiträge
 
#3
  Alt 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.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#4
  Alt 20. Jun 2003, 18:51
Moin Shadowbug,

schade.
Eine andere Idee hab' ich zur Zeit leider nicht.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Shadowbug

Registriert seit: 24. Apr 2003
3 Beiträge
 
#5
  Alt 20. Jun 2003, 19:03
Man müsste der Methode TextWidth beibrigen dass sie ihre Berechnung auf der Grundlage des eingestellten Systemfonts macht.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#6

Re: Breite der Panels in der StatusBar

  Alt 20. Mär 2008, 16:52
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.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#7

Re: Breite der Panels in der StatusBar

  Alt 20. Mär 2008, 17:19
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.
Thomas
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:09 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz