Как показать форму firemonkey на втором мониторе - PullRequest
3 голосов
/ 11 февраля 2012

Я пытаюсь отобразить форму 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?

Ответы [ 3 ]

4 голосов
/ 12 февраля 2012

FMX пока не поддерживает несколько мониторов.Вам нужно будет написать специфический для платформы код и переключить поведение, используя условные определения платформы.

2 голосов
/ 05 февраля 2015

В XE7 теперь есть глобальная переменная Screen, которая имеет свойство Screen.Displays [], которое можно использовать для получения информации о доступных дисплеях.Свойство Screen.DisplayCount может указать количество отображаемых экранов.Вы должны добавить «FMX.Forms» в ваше предложение USES, чтобы использовать это.

2 голосов
/ 10 июня 2012

Для окон вы можете использовать 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;
...