Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi VCL Ersatz für GetSystemMetrics(SM_CYSIZE) bitte (https://www.delphipraxis.net/195924-vcl-ersatz-fuer-getsystemmetrics-sm_cysize-bitte.html)

KodeZwerg 7. Apr 2018 09:08

VCL Ersatz für GetSystemMetrics(SM_CYSIZE) bitte
 
Guten Tag, unter WinApi benutze ich diesen Aufruf
Delphi-Quellcode:
Handle := CreateWindowEx(WS_EX_WINDOWEDGE {$IFDEF DEFONTOP} or WS_EX_TOPMOST {$ENDIF DEFONTOP},
                         PChar('Class'),
                         PChar('Caption'),
                         WS_VISIBLE or WS_CAPTION or WS_SYSMENU or WS_BORDER or WS_MINIMIZEBOX,
                         ((GetSystemMetrics(SM_CXFULLSCREEN) DIV 2)-(ZahlX DIV 2)),
                         ((GetSystemMetrics(SM_CYFULLSCREEN) DIV 2)-((ZahlY-(GetSystemMetrics(SM_CYSIZE)+GetSystemMetrics(SM_CYMIN))) DIV 2)),
                         ZahlX, ZahlY+GetSystemMetrics(SM_CYSIZE), 0, 0, Inst, NIL);
um ein Fenster mittig auf dem Bildschirm zu erstellen, inklusive DPI check für Titelleisten Höhe (GetSystemMetrics(SM_CYSIZE)).
Das mit der Fenstermitte unter VCL hab ich raus aber wie ermittle ich unter VCL wie hoch eine Titelleiste von Windows ist/sein sollte? Also ein VCL Ersatz für GetSystemMetrics(SM_CYSIZE). Hat da jemand eine Idee für mich? Ist bestimmt eine Property die ich nur abfragen brauche .....oder?

Uwe Raabe 7. Apr 2018 09:25

AW: VCL Ersatz für GetSystemMetrics(SM_CYSIZE) bitte
 
Zitat:

Zitat von KodeZwerg (Beitrag 1398365)
um ein Fenster mittig auf dem Bildschirm zu erstellen, inklusive DPI check für Titelleisten Höhe

Soll die Mitte des Forms zentriert werden oder die Mitte des Client-Bereichs des Forms?

KodeZwerg 7. Apr 2018 09:50

AW: VCL Ersatz für GetSystemMetrics(SM_CYSIZE) bitte
 
Zitat:

Zitat von KodeZwerg (Beitrag 1398365)
.......wie ermittle ich unter VCL wie hoch eine Titelleiste von Windows ist/sein sollte? Also ein VCL Ersatz für GetSystemMetrics(SM_CYSIZE).......

Ich will nicht grob klingen aber ich brauch eine Antwort darauf.
Um Deine Frage zu beantworten:
In dem gezeigten Code wird das Fenster (Window) mittig auf dem Bildschirm zentriert dargestellt/erstellt.
ZahlX und ZahlY ist die tatsächliche Fenstergröße des Client-Bereichs (in VCL = Fenster.Width/Height) wobei ZahlY nachkorrigiert wird um das DPI Verhältniss der Caption zu berücksichtigen.

Delphi.Narium 7. Apr 2018 10:38

AW: VCL Ersatz für GetSystemMetrics(SM_CYSIZE) bitte
 
Nur mal so grob geraten:

Delphi-Quellcode:
TitleHeight := Form.Height - Form.ClientHeight - (2 * Form.BorderWidth);


Lässt sich so mit Delphi 7 im Objectinspector nachvollziehen. Kommt bei meinem Rechner immer 27 raus.

KodeZwerg 7. Apr 2018 10:45

AW: VCL Ersatz für GetSystemMetrics(SM_CYSIZE) bitte
 
Das würde mir doch nur meine Eigene Höhe wiedergeben aber nicht die Höhe die das System vorsieht, oder liege ich falsch?
Vielleicht ist es ja unter VCL auch total Wurst.
Ich werde noch ein wenig herum experimentieren um zu Wissen ob ich es überhaupt benötige wie in meinem WinApi Beispiel.
Ich glaube unter VCL sind das getrennte Sachen unter WinApi ist es ein Objekt, weswegen ich's dort berücksichtigen muss.

Delphi.Narium 7. Apr 2018 10:51

AW: VCL Ersatz für GetSystemMetrics(SM_CYSIZE) bitte
 
Ist die eigene Höhe nicht die vom System vorgegebene?

Habe jedenfalls die Höhe der Formulartitelleiste noch nie verändert.

Egal wie ich die Größe von Schrift, Komponenten ... in 'nem Formular zur Laufzeit oder im Objektinspektor verändere: Die Titelleiste des Formulars ist immer so, wie vom System vorgegeben.

Schau mal bitte hier: http://www.mindspring.com/~cityzoo/ttlbar3.html unter 3. Setting the Minimum Window Size.

Wäre da ein Ansatz bei?

Gefunden über Bei Google suchendelphi source tForm caption height

Uwe Raabe 7. Apr 2018 11:14

AW: VCL Ersatz für GetSystemMetrics(SM_CYSIZE) bitte
 
Mit folgender Methode bekommt man ein Form um einen bestimmten Punkt auf dem Desktop zentriert:
Delphi-Quellcode:
procedure CenterFormOnScreen(AForm: TForm; ACenter: TPoint);
var
  diff: TPoint;
begin
  diff := ACenter - AForm.ClientToScreen(AForm.ClientRect.CenterPoint);
  AForm.Left := AForm.Left + diff.X;
  AForm.Top := AForm.Top + diff.Y;
end;
Je nachdem, ob man die Taskleiste bei der Berechnung des Mittelpunkts berücksichtigen will, kann der Aufruf für einen Zielmonitor so aussehen:
Delphi-Quellcode:
    // ganzer Bereich
    CenterFormOnScreen(form, Monitor.BoundsRect.CenterPoint);

    // alternativ Bereich ohne Taskleiste
    CenterFormOnScreen(form, Monitor.WorkAreaRect.CenterPoint);

    // das Form dann z.B. modal anzeigen
    form.Position := poDesigned;
    form.ShowModal;
Sollte mit allen Auflösungen, DPI-Einstellungen und Monitor-Layouts funktionieren.

KodeZwerg 7. Apr 2018 11:38

AW: VCL Ersatz für GetSystemMetrics(SM_CYSIZE) bitte
 
Also, unter WinApi, wenn ich da ein Fenster generiere, da muss ich Wissen wie groß alles ist.
Delphi.Narium Du hast Recht mit der Aussage "Die Titelleiste des Formulars ist immer so, wie vom System vorgegeben.", aber unter WinApi muss ich eben genau diese Größe berücksichtigen da sonst das Fenster was erstellt wird zu groß/klein ist (falls DPI <> 96).
WinApi behandelt ein Window anders als ein TForm, WinApi ist da eher steif und stur.
Ein Aufruf von "GetSystemMetrics(SM_CYSIZE)" gibt mir die OS-Information wieviel Höhe die Caption aktuell haben sollte/braucht.
Du kannst ja gerne mal GetSystemMetrics(SM_CYSIZE) testen, der Aufruf ist nicht gefährlich, ist ein Integerwert der rauskommt, wenn dein Beispiel korrekt funktioniert sollte das Ergebniss idealerweise identisch sein. Wenn nicht haut was mit Border-Thickness nicht hin.


@Uwe Raab: Ich schrieb doch das ich das Zentrieren bereits hinbekommen habe, aber Danke nochmals dafür.
Ich bin da etwas grob rangegangen:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Left := (Screen.Width-Width)  div 2;
  Top := (Screen.Height-Height) div 2;
end;

Codehunter 7. Apr 2018 11:41

AW: VCL Ersatz für GetSystemMetrics(SM_CYSIZE) bitte
 
Kann sein dass ich die Frage nicht ganz verstehe, aber reicht ein schnödes
Delphi-Quellcode:
Form.Position:= poScreenCenter
nicht aus?

KodeZwerg 7. Apr 2018 11:51

AW: VCL Ersatz für GetSystemMetrics(SM_CYSIZE) bitte
 
Bestimmt klappt das auch, aber, in diesem Thread geht es nicht darum wie man etwas zentriert darstellt sondern wie ich per VCL die Höhe der Titelleiste herausfinde da ich gerade mein WinApi Beispiel 1:1 nach VCL portiere um eine Skalierungs-Fehler Demo für Uwe Raab zu erstellen bzw herausfinden ob VCL den gleichen "Mist" produziert wie ein WinApi Aufruf.

Das in meinem Beispiel eine Zentrierung vorliegt, bitte ignoriert das, Danke.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:00 Uhr.
Seite 1 von 2  1 2      

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