2009-09-15 21 views
7

Mit Screen.DesktopHeight und Screen.DesktopWidth, kann ich die Größe des "virtuellen" Desktops und ich glaube, dass funktioniert für einen oder mehrere Monitore.Wie bekomme ich die nutzbaren Koordinaten des Bildschirms in Delphi

Ich speichere die Position (oben und links) und Größe (Höhe und Breite) meiner Anwendung in die Registrierung, wenn es geschlossen wird. Wenn es geöffnet wird, möchte ich sicherstellen, dass es vollständig sichtbar ist, da es möglicherweise teilweise außerhalb des sichtbaren Bereichs verschoben wurde oder dass sich die Bildschirmgröße beispielsweise über Bildschirmeinstellungen oder das Entfernen eines Monitors geändert hat.

kann ich es im Grunde mit diesem Code:

if MyForm.Width > screen.DesktopWidth then 
    MyForm.Width := screen.DesktopWidth; 

if MyForm.Height > screen.DesktopHeight then 
    MyForm.Height := screen.DesktopHeight; 

if (MyForm.Left + MyForm.Width) > screen.DesktopWidth then 
    MyForm.Left := screen.DesktopWidth - MyForm.Width; 
if MyForm.Left < 0 then MyForm.Left := 0; 

if (MyForm.Top + LogoAppForm.Height) > screen.DesktopHeight then 
    MyForm.Top := screen.DesktopHeight - LogoAppForm.Height; 
if MyForm.Top < 0 then MyFormTop := 0; 

Diese Ordnung funktioniert, außer es berücksichtigt nicht nehmen Sie die Taskleiste, die in der Regel (aber nicht immer) am unteren Rand des Desktops. Wenn also die Taskleiste dem Fenster meiner Anwendung im Weg steht, wird meine Anwendung verdeckt.

Wie kann ich die nutzbare Position und Größe Einstellungen des Bildschirms, die die Position der Taskleiste ausschließen?

Antwort

12

Ich bin mir nicht sicher, ob Windows wirklich so funktioniert, wie Sie es denken - ich habe mehrere Monitore, aber sie haben nicht die gleiche Höhe - also hat mein Desktop keine einheitliche Höhe über alle Monitore.

Ich benutze Screen.MonitorCount und das Screen.Monitors-Array, um herauszufinden, welcher Monitor den größten Teil des Fensters enthält und dann ein geeignetes Rechteck auf diesem Bildschirm zu finden. Die WorkareaRect-Eigenschaft von TMonitor gibt Ihnen die Grenzen des Arbeitsbereichs auf einem bestimmten Monitor, der keine Taskleisten oder Symbolleisten ausschließt.

+0

Danke für den Tipp. Du gibst keine Details darüber, wie das geht, also muss ich alles ausarbeiten ... aber es ist die richtige Idee. – lkessler

12

Sie sollten Screen.WorkArea * Eigenschaften verwenden:

Screen.WorkAreaRect 
    Screen.WorkAreaHeight 
    Screen.WorkAreaLeft 
    Screen.WorkAreaTop 
    Screen.WorkAreaWidth 

oder

Screen.Monitors[I].WorkareaRect 
+0

Screen.Monitors [I] .WorkAreaRect ist die Funktion die ich brauche, die garethm nicht erwähnt hat. Vielen Dank. Ohne die Monitore [I] gibt es nur den primären Monitor. Ich werde die Monitore durchlaufen müssen, um dies richtig zu machen. – lkessler

3

Um den Arbeitsbereich für das aktuelle Formular zu bestimmen, verwenden Monitor.WorkareaRect. z.B.

BoundsRect := Monitor.WorkareaRect; 

, um die Formulargröße auf die maximale Fläche festzulegen, ohne sie zu maximieren.

Sie sollten auch die TCustomForm.MakeFullyVisible Methode betrachten.

Von D2006 Hilfe:

„Makefullyvisible überprüft, ob das Formular vollständig auf dem angegebenen Monitor paßt Wenn nicht, neu positioniert er die Form, so dass sie paßt, wenn möglich.“

+0

MakeFullyVisible ist nicht die richtige Funktion. Obwohl das Formular im sichtbaren Bereich angezeigt wird, ändert es auch die Position des Formulars, wenn es auf zwei Monitoren aufgeteilt wird, aber vollständig sichtbar ist - und ich möchte es im letzteren Fall nicht verschieben. Aber danke, dass du diese Funktion gezeigt hast. – lkessler

+0

Ich vermutete, dass es nicht genau das tun kann, was man wollte, ich habe es erst kürzlich "entdeckt". Es scheint auch nicht den Arbeitsbereich zu nutzen. –

Verwandte Themen