【问题标题】:How Do I Get the Usable Coordinates of the Screen in DelphiDelphi如何获取屏幕的可用坐标
【发布时间】:2009-09-15 03:04:20
【问题描述】:

使用 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;

这可以正常工作,只是它没有考虑通常(但不总是)位于桌面底部的任务栏。因此,如果任务栏挡住了我的应用程序窗口,我的应用程序就会被遮挡。

如何获得不包括任务栏位置的屏幕可用位置和大小设置?

【问题讨论】:

    标签: delphi size screen position taskbar


    【解决方案1】:

    我不确定 Windows 是否真的像您想象的那样工作 - 我有多个显示器,但它们的高度不同 - 所以我的桌面在所有显示器上的高度不一致。

    我所做的是使用 Screen.MonitorCount 和 Screen.Monitors 数组来确定哪个监视器包含大部分窗口,然后在该屏幕上找到一个合适的矩形。 TMonitor 的 WorkareaRect 属性为您提供特定监视器上工作区域的边界,不包括任何任务栏或工具栏。

    【讨论】:

    • 感谢您的提示。您没有提供有关如何执行此操作的任何详细信息,因此我必须全力以赴……但这是正确的想法。
    【解决方案2】:

    您应该使用 Screen.WorkArea* 属性:

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

    Screen.Monitors[I].WorkareaRect
    

    【讨论】:

    • Screen.Monitors[I].WorkAreaRect 是 garethm 没有提到的我需要的功能。谢谢。如果没有 Monitors[I],它只会提供主监视器。我必须遍历监视器才能正确执行此操作。
    【解决方案3】:

    要确定当前表单的工作区,请使用 Monitor.WorkareaRect。例如

    BoundsRect := Monitor.WorkareaRect;
    

    将表单大小设置为最大区域而不最大化它。

    您还应该查看TCustomForm.MakeFullyVisible 方法。

    来自 D2006 帮助:

    “MakeFullyVisible 检查表单是否完全适合指定的监视器。如果不是,它会重新定位表单以使其适合,如果可能的话。”

    【讨论】:

    • MakeFullyVisible 不是很合适的功能。虽然它会使表单出现在可见区域内,但如果它在两个监视器上拆分但完全可见,它也会改变表单的位置 - 我不想在后一种情况下移动它。但是感谢您指出此功能。
    • 我怀疑它可能不完全符合我的要求,我最近才“发现”它。它似乎也不使用工作区。
    猜你喜欢
    • 1970-01-01
    • 2021-10-22
    • 2015-08-01
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 2019-08-22
    相关资源
    最近更新 更多