如何在第二个显示器上显示FireMonkey窗体

3

我正在尝试使用以下代码在第二个显示器上显示一个 FireMonkey 表单,使用 C++Builder 进行操作:

 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中怎么做呢?


这可能是FireMonkey的限制。除非表单位置属性有某种指定方式。 - Warren P
3个回答

4

目前FMX不支持多显示器。您需要编写特定于平台的代码并使用平台条件定义来切换行为。


3

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


3

对于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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接