20

有没有办法指定应用程序出现在 Delphi 或 C++Builder 中的哪个监视器上?

我正在为客户开发一个简单的程序,该程序在辅助监视器上显示由酒店系统生成的厨房订单。目前,他们需要在启动后手动将窗口拖到第二台显示器上。

4

7 回答 7

28

全局 Screen 对象(Forms 的一部分)具有 Monitors 的概念。我认为这是在 Delphi 6 或 7 左右添加的。以下代码将起作用:

// Put the form in the upper left corner of the 2nd monitor
//   if more then one monitor is present.
if Screen.MonitorCount > 1 then
begin
  Left := Screen.Monitors[1].Left;
  Top := Screen.Monitors[1].Top;
end;

您可以使用从该位置的任何正偏移将其放在该监视器中的任何位置。您也可以从那里获取宽度和高度以了解尺寸。

于 2008-10-15T21:55:17.657 回答
23

在程序关闭之前保存窗口位置并在启动时恢复它们。多显示器显示只是增加了桌面的大小;其他监视器表面仅具有同一 X/Y 平面的不同部分,其原点位于主监视器的左上角。

这可以通过几个组件中的任何一个自动为您完成。

顺便说一句,Forms 单元中的 Screen 变量有一个名为 MonitorCount 的属性和另一个可索引的属性 Monitors[Index: Integer]: TMonitor。TMonitor 具有指示左侧、顶部、宽度、高度等的属性,因此您需要的所有信息都在那里。

于 2008-10-15T21:11:56.977 回答
2
procedure TMDIChild.btnShowMonClick(Sender: TObject);
begin
    if Screen.MonitorCount > 1 then
    begin
      FormShow.Left:=Screen.Monitors[1].Left;
      FormShow.Top:=Screen.Monitors[1].Top;
      FormShow.Width:=Screen.Monitors[1].Width;
      FormShow.Height:=Screen.Monitors[1].Height;
    end
    else
    begin
        FormShow.Show;
    end;
end;
于 2011-02-15T07:51:19.447 回答
1

并不是您的问题所暗示的答案,但是您不能在应用程序关闭时存储窗口设置(大小、位置、最大化状态),然后在启动时应用它们吗?

于 2008-10-15T20:52:01.900 回答
-2

不久前我在 Delphi 5 中做过类似的事情:

procedure TForm18.FormCreate(Sender: TObject);
var
  Mon: TMonitor;
  MonitorIdx: Integer;
begin
  MonitorIdx := 1; // better read from configuration
  if (MonitorIdx <> Monitor.MonitorNum) and (MonitorIdx < Screen.MonitorCount) then begin
    Mon := Screen.Monitors[MonitorIdx];
    Left := Left + Mon.Left - Monitor.Left;
    Top := Top + Mon.Top - Monitor.Top;
  end;
end;
于 2008-10-16T15:46:38.210 回答
-3

Windows 将允许您在 CreateWindow API 调用中指定窗口的坐标。我对 Delphi 或 C++Builder 的了解不够,不知道您是否有权访问该过程的那一部分。

您还可以在 WM_CREATE 处理程序中移动窗口。

EnumDisplayMonitors 将为您提供系统中每个监视器的坐标。


显然,Delphi 和 C++ Builder 具有使这个答案有些无关紧要的功能。我会把它留在这里,以防有人遇到这个问题,但需要在不同的环境中回答它。

于 2008-10-15T20:51:43.260 回答
-6

我对 Windows 系统做的不多,所以我建议像这样的 hack。

抓住可视桌面的宽度(两台显示器组合),将其除以一半,然后将其设为您的起始位置。

您还可以查看 api 告诉您 monitor2 的尺寸。

于 2008-10-15T20:50:03.700 回答