3

次のコードでC++Builderを使用して、FireMonkeyフォームを2番目のモニターに表示しようとしています。

 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.Displays[]プロパティを持つグローバルScreen変数があります。Screen.DisplayCountプロパティは、ディスプレイの数を示します。これを使用するには、USES句に「FMX.Forms」を追加する必要があります。

于 2015-02-05T19:52:27.087 に答える
2

Windowsの場合、EnumDisplayMonitorsを使用して2番目のモニターを見つけることができます。これには、見つかった各モニターから情報を受け取るコールバック関数が必要です。以下のDelphiの例では、2番目のモニターに2番目の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 に答える