3

我正在尝试使用带有以下代码的 C++Builder 在第二台显示器上显示 FireMonkey 表单:

 void __fastcall ShowFormOnScreen( int OutMon )
 { 
   MyForm->Top = 0;
   MyForm->BorderStyle = bsNone;
   MyForm->WindowState = wsNormal;
   MyForm->Left   = Screen->Monitors[OutMon]->Left;
   MyForm->Height = Screen->Monitors[OutMon]->Height;
   MyForm->Width  = Screen->Monitors[OutMon]->Width;
   MyForm->Show();
 }

不幸的是,该Screen对象没有该Monitors属性,那么如何在 FireMonkey 中做到这一点?

4

3 回答 3

4

FMX 尚不支持多显示器。您将不得不使用平台条件定义编写特定于平台的代码并切换行为。

于 2012-02-11T20:25:43.853 回答
3

在 XE7 中,现在有一个全局 Screen 变量,它具有 Screen.Displays[] 属性,您可以使用它来获取有关可用显示器的信息。Screen.DisplayCount 属性可以告诉您有多少显示器。您必须在您的USES 子句中添加“FMX.Forms”才能使用它。

于 2015-02-05T19:52:27.087 回答
2

对于 Windows,您可以使用 EnumDisplayMonitors 来定位第二个监视器。这需要一个回调函数,该函数将从找到的每个监视器接收信息。下面的 Delphi 示例在第二个监视器上显示第二个 Firemonkey 表单并使背景变黑

// Callback function in function MonitorCount
function MonCountCB(hm: HMONITOR; dc: HDC; r: PRect; l: LPARAM): Boolean; stdcall;
var
  mInfo : MonitorInfoEx;
//  SecondaryRect: RECT;
begin

  minfo.cbSize := sizeof(mInfo);
  GetMonitorInfo(hm, @mInfo);

  if mInfo.dwFlags <> MONITORINFOF_PRIMARY then
  begin
     MonitorForm.Left := mInfo.rcWork.Left;
     MonitorForm.Top := mInfo.rcWork.Top;
     MonitorForm.Width := mInfo.rcWork.Width;
     MonitorForm.Height := mInfo.rcWork.Height;
  end;

  inc(Integer(pointer(l)^));
  result := true;
end;


procedure TForm1.CornerButton1Click(Sender: TObject);
var
  MonitorCount : Integer;
begin
  EnumDisplayMonitors(0,nil,MonCountCB, Integer(@MonitorCount));
  MonitorForm.Viewport3D1.Color := TAlphaColors.Black;
  MonitorForm.Show;
end;
于 2012-06-10T04:33:48.293 回答