Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How Do I Get the Usable Coordinates of the Screen in Delphi

With Screen.DesktopHeight and Screen.DesktopWidth, I can get the size of the "virtual" desktop and I believe that works for one or multiple monitors.

I save the position (top and left) and size (height and width) of my application into the registry when it closes. When it opens, I want to ensure it is entirely visible, since it may have been moved partly outside the visible area, or the screen size may have changed for example via screen settings or removal of a monitor.

I can basically do it with this 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;

This works okay, except it does not take into account the taskbar that is usually (but not always) at the bottom of the desktop. So if the taskbar is in the way of my application's window, my application gets obscured.

How can I get the usable position and size settings of the screen that exclude the location of the taskbar?

like image 952
lkessler Avatar asked Sep 15 '09 03:09

lkessler


3 Answers

I'm not sure that Windows really works the way you think it does - I have multiple monitors, but they don't have the same height - so my desktop doesn't have a uniform height across all monitors.

What I do is to use Screen.MonitorCount and the Screen.Monitors array to work out which monitor contains most of the window and then find a suitable rectangle on that screen. The WorkareaRect property of TMonitor gives you the bounds of the working area on a particular monitor, which excludes any taskbars or toolbars.

like image 93
garethm Avatar answered Nov 05 '22 06:11

garethm


You should use Screen.WorkArea* properties:

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

or

Screen.Monitors[I].WorkareaRect
like image 13
Cesar Romero Avatar answered Nov 05 '22 07:11

Cesar Romero


To determine the work area for the current form, use Monitor.WorkareaRect. e.g.

BoundsRect := Monitor.WorkareaRect;

to set the form size to the maximum area without maximising it.

You should also look at the TCustomForm.MakeFullyVisible method.

From D2006 help:

"MakeFullyVisible checks whether the form fits entirely on the specified monitor. If not, it repositions the form so that it fits, if possible."

like image 6
Gerry Coll Avatar answered Nov 05 '22 05:11

Gerry Coll