2009-09-15 4 views
7

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

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

Я в принципе могу это сделать с этим кодом:

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; 

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

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

ответ

12

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

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

+0

Спасибо за подсказку. Вы не даете никаких подробностей о том, как это сделать, поэтому мне придется все это разобраться ... но это правильная идея. – lkessler

12

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

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

или

Screen.Monitors[I].WorkareaRect 
+0

Screen.Monitors [I] .WorkAreaRect - это функция, в которой я нуждаюсь, чтобы гарем не упоминал. Благодарю. Без мониторов [I] он дает только основной монитор. Мне нужно будет проходить через мониторы, чтобы сделать это правильно. – lkessler

3

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

BoundsRect := Monitor.WorkareaRect; 

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

Вы также должны посмотреть на метод TCustomForm.MakeFullyVisible.

С D2006 помощью:

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

+0

MakeFullyVisible не совсем правильная функция. Несмотря на то, что форма будет отображаться в видимой области, она также изменит местоположение формы, если она разделена на два монитора, но полностью видима - и я не хочу ее перемещать в этом последнем случае. Но спасибо, что указали эту функцию. – lkessler

+0

Я подозревал, что он может не делать именно то, что нужно, я только недавно «открыл» его. Похоже, он не использует рабочую область. –

Смежные вопросы