¿Cómo obtengo las coordenadas utilizables de la pantalla en Delphi?
Pregunta
Con Screen.DesktopHeight y Screen.DesktopWidth, puedo obtener el tamaño de " virtual " escritorio y creo que funciona para uno o varios monitores.
Guardo la posición (superior e izquierda) y el tamaño (alto y ancho) de mi aplicación en el registro cuando se cierra. Cuando se abre, quiero asegurarme de 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.
Básicamente puedo 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 suele estar (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 las configuraciones de posición y tamaño utilizables de la pantalla que excluyen la ubicación de la barra de tareas?
Solución
No estoy seguro de que Windows realmente funcione de la manera que crees: 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 utilizar Screen.MonitorCount y 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 ofrece los límites del área de trabajo en un monitor en particular, lo que excluye cualquier barra de tareas o barra de herramientas.
Otros consejos
Debe usar las propiedades Screen.WorkArea *:
Screen.WorkAreaRect
Screen.WorkAreaHeight
Screen.WorkAreaLeft
Screen.WorkAreaTop
Screen.WorkAreaWidth
o
Screen.Monitors[I].WorkareaRect
Para determinar el área de trabajo para el formulario actual, use Monitor.WorkareaRect. por ejemplo,
BoundsRect := Monitor.WorkareaRect;
para establecer el tamaño del formulario en el área máxima sin maximizarlo.
También debe mirar el Método TCustomForm.MakeFullyVisible .
De la ayuda de D2006:
" MakeFullyVisible verifica si el formulario se ajusta completamente al monitor especificado. Si no, reposiciona el formulario para que se ajuste, si es posible. & Quot;