AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi VCL Ersatz für GetSystemMetrics(SM_CYSIZE) bitte
Thema durchsuchen
Ansicht
Themen-Optionen

VCL Ersatz für GetSystemMetrics(SM_CYSIZE) bitte

Ein Thema von KodeZwerg · begonnen am 7. Apr 2018 · letzter Beitrag vom 7. Apr 2018
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#1

VCL Ersatz für GetSystemMetrics(SM_CYSIZE) bitte

  Alt 7. Apr 2018, 10:08
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?
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 7. Apr 2018, 10:25
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?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#3

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

  Alt 7. Apr 2018, 10:50
.......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.
Gruß vom KodeZwerg

Geändert von KodeZwerg ( 7. Apr 2018 um 10:54 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#4

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

  Alt 7. Apr 2018, 11:38
Nur mal so grob geraten:

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.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#5

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

  Alt 7. Apr 2018, 11:45
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.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#6

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

  Alt 7. Apr 2018, 11:51
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

Geändert von Delphi.Narium ( 7. Apr 2018 um 11:54 Uhr) Grund: Link ergänzt.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#7

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

  Alt 7. Apr 2018, 12:14
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#8

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

  Alt 7. Apr 2018, 12:38
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;
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#9

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

  Alt 7. Apr 2018, 12:41
Kann sein dass ich die Frage nicht ganz verstehe, aber reicht ein schnödes Form.Position:= poScreenCenter nicht aus?
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#10

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

  Alt 7. Apr 2018, 12:51
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.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

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 12:59 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