2012-02-11 180 views
3

我想显示第二个监视器上FireMonkey形式,用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中如何做到这一点?

+0

这可能是firemonkey的限制。除非表单位置属性有某种方式在那里指定它。 – 2012-02-11 19:09:07

回答

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; 
4

FMX还没有多显示器支持。您必须使用平台条件定义编写特定于平台的代码并切换行为。

2

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