2009-09-15 27 views
7

Con Screen.DesktopHeight y Screen.DesktopWidth, puedo obtener el tamaño del escritorio "virtual" y creo que funciona para uno o varios monitores.Cómo obtengo las coordenadas utilizables de la pantalla en Delphi

Guardo la posición (arriba y a la izquierda) y el tamaño (alto y ancho) de mi aplicación en el registro cuando se cierra. Cuando se abra, quiero asegurar que sea completamente visible, ya que puede haberse movido parcialmente fuera del área visible, o el tamaño de la pantalla puede haber cambiado, por ejemplo, a través de la configuración de la pantalla o la eliminación de un monitor.

Yo, básicamente, puede hacerlo con este código:

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; 

Esto funciona bien, excepto que no tiene en cuenta la barra de tareas que es por lo general (pero no siempre) en la parte inferior del escritorio. Entonces, si la barra de tareas está en el camino de la ventana de mi aplicación, mi aplicación se oscurece.

¿Cómo puedo obtener la configuración de tamaño y posición utilizable de la pantalla que excluye la ubicación de la barra de tareas?

Respuesta

12

No estoy seguro de que Windows realmente funcione de la manera que usted cree, tengo varios monitores, pero no tienen la misma altura, por lo que mi escritorio no tiene una altura uniforme en todos los monitores.

Lo que hago es usar Screen.MonitorCount y la matriz Screen.Monitors para determinar qué monitor contiene la mayor parte de la ventana y luego encontrar un rectángulo adecuado en esa pantalla. La propiedad WorkareaRect de TMonitor le proporciona los límites del área de trabajo en un monitor particular, que excluye cualquier barra de tareas o barras de herramientas.

+0

Gracias por la sugerencia. No da ningún detalle sobre cómo hacer esto, así que tendré que trabajarlo todo ... pero es la idea correcta. – lkessler

12

Debe utilizar Screen.WorkArea * Propiedades:

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

o

Screen.Monitors[I].WorkareaRect 
+0

Screen.Monitors [I] .WorkAreaRect es la función que necesito que garethm no mencionó. Gracias. Sin los monitores [I], solo da el monitor principal. Tendré que iterar a través de los monitores para hacer esto correctamente. – lkessler

3

Para determinar el área de trabajo para la forma actual, utilice Monitor.WorkareaRect. p.ej.

BoundsRect := Monitor.WorkareaRect; 

para establecer el tamaño de formulario en el área máxima sin maximizarlo.

También debe consultar el método TCustomForm.MakeFullyVisible.

De D2006 ayuda:

"MakeFullyVisible comprueba si la forma encaja por completo en el monitor se especifique lo contrario, se reposiciona el formulario para que se ajuste, si es posible."

+0

MakeFullyVisible no es exactamente la función correcta. Aunque hará que el formulario aparezca dentro del área visible, también cambiará la ubicación del formulario si está dividido en dos monitores pero completamente visible, y no quiero moverlo en este último caso. Pero gracias por señalar esta función. – lkessler

+0

Sospecho que puede no hacer exactamente lo que se quiere, solo lo "descubrí" recientemente. No parece usar el área de trabajo tampoco. –

Cuestiones relacionadas