Как получить полезные координаты экрана в Delphi

С Экрана.DesktopHeight и экран.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 ответов


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

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


вы должны использовать экран.Рабочую область* свойства:

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

или

Screen.Monitors[I].WorkareaRect

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

BoundsRect := Monitor.WorkareaRect;

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

вы также должны взглянуть на TCustomForm.MakeFullyVisible метод.

из справки D2006:

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