Как получить полезные координаты экрана в Delphi - PullRequest
8 голосов
/ 15 сентября 2009

С помощью Screen.DesktopHeight и Screen.DesktopWidth я могу получить размер «виртуального» рабочего стола и считаю, что он подходит для одного или нескольких мониторов.

Я сохраняю позицию (вверху и слева) и размер (высоту и ширину) моего приложения в реестре, когда оно закрывается. Когда он открывается, я хочу убедиться, что он полностью виден, поскольку он мог быть частично перемещен за пределы видимой области или размер экрана мог измениться, например, из-за настроек экрана или удаления монитора.

Я могу сделать это с помощью этого кода:

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;

Это работает нормально, за исключением того, что не учитывает панель задач, которая обычно (но не всегда) находится внизу рабочего стола. Поэтому, если панель задач находится на пути окна моего приложения, мое приложение скрывается.

Как я могу получить полезные настройки положения и размера экрана, исключающие расположение панели задач?

Ответы [ 3 ]

15 голосов
/ 15 сентября 2009

Я не уверен, что Windows действительно работает так, как вы думаете - у меня есть несколько мониторов, но они не имеют одинаковую высоту, поэтому мой рабочий стол не имеет одинаковой высоты для всех мониторов.

Я использую Screen.MonitorCount и массив Screen.Monitors, чтобы определить, какой монитор содержит большую часть окна, а затем найти подходящий прямоугольник на этом экране. Свойство WorkareaRect TMonitor определяет границы рабочей области на конкретном мониторе, исключая любые панели задач или панели инструментов.

13 голосов
/ 15 сентября 2009

Вы должны использовать свойства Screen.WorkArea *:

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

или

Screen.Monitors[I].WorkareaRect
4 голосов
/ 15 сентября 2009

Чтобы определить рабочую область для текущей формы, используйте Monitor.WorkareaRect. например,

BoundsRect := Monitor.WorkareaRect;

, чтобы установить максимальный размер формы, не увеличивая ее.

Вам также следует обратиться к методу TCustomForm.MakeFullyVisible .

Из справки D2006:

«MakeFullyVisible проверяет, полностью ли помещается форма на указанном мониторе. Если нет, то перемещает форму так, чтобы она подходила, если это возможно.»

...