![]() |
VCL Ersatz für GetSystemMetrics(SM_CYSIZE) bitte
Guten Tag, unter WinApi benutze ich diesen Aufruf
Delphi-Quellcode:
um ein Fenster mittig auf dem Bildschirm zu erstellen, inklusive DPI check für Titelleisten Höhe (GetSystemMetrics(SM_CYSIZE)).
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); 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? |
AW: VCL Ersatz für GetSystemMetrics(SM_CYSIZE) bitte
Zitat:
|
AW: VCL Ersatz für GetSystemMetrics(SM_CYSIZE) bitte
Zitat:
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. |
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. |
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. |
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: ![]() Wäre da ein Ansatz bei? Gefunden über ![]() |
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:
Je nachdem, ob man die Taskleiste bei der Berechnung des Mittelpunkts berücksichtigen will, kann der Aufruf für einen Zielmonitor so aussehen:
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;
Delphi-Quellcode:
Sollte mit allen Auflösungen, DPI-Einstellungen und Monitor-Layouts funktionieren.
// 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; |
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; |
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:
nicht aus?
Form.Position:= poScreenCenter
|
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 04:48 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