Programming/Delphi

[Delphi] 듀얼모니터일 때 주모니터에 폼 띄우기

통통만두 2022. 5. 24. 21:47
반응형

듀얼모니터를 사용하면서 폼을 실행할 때 보조모니터에 띄울까~? 메인모니터에 띄울까~?

고민될 때 있지 않으셨습니까?

저의 경우에는 전체 스크린(메인모니터 + 보조모니터)의 크기를 구한 다음 계산해서 메인모니터 또는 보조모니터 등 원하는 모니터에 폼을 띄울 수 있었습니다.

우선, Delphi 에서는 Screen 이라는 강력한 클래스를 제공합니다.

Screen.MonitorCount

위의 객체를 통해서 모니터의 갯수를 알 수 있습니다.

 

procedure TfrmMain.scButton1Click(Sender: TObject);
var
  i : Integer;
begin
  Log('monitor count : ' + IntToStr(Screen.MonitorCount));
  Log(Format('[Desktop] top: %d, left: %d, width: %d, height: %d', [Screen.DesktopRect.Top, Screen.DesktopRect.Left, Screen.DesktopRect.Width, Screen.DesktopRect.Height]));
  Log(Format('[WorkArea] top: %d, left: %d, width: %d, height: %d', [Screen.WorkAreaRect.Top, Screen.WorkAreaRect.Left, Screen.WorkAreaRect.Width, Screen.WorkAreaRect.Height]));
  for i := 0 to Screen.MonitorCount - 1 do
  begin
    Log(Format('[%d] top: %d, left: %d, width: %d, height: %d', [i, Screen.Monitors[i].Top, Screen.Monitors[i].Left, Screen.Monitors[i].Width, Screen.Monitors[i].Height]));
  end;
end;

모니터의 갯수와 데스크톱 좌표, 자업영역 좌표 그리고, 각 모니터의 좌표를 출력하는 예제입니다.

어떻게 하면 메인모니터에 접근하고, 어떻게 하면 보조모니터에 접근을 할 수 있을까 이리저리 찾아봤는데 제가 찾은 정답은 Screen.Monitors[0] 은 무조건 메인모니터이다~ 입니다. 왜 듀얼모니터 위치 및 순서 정할 때 1, 2, 3.. 이런 식으로 표시되는데 그거에 따라서 구성되는 것 같습니다.

또한 Screen.DesktopRect 는 전체 모니터를 합한 좌표가 나옵니다. 이 때, 각 모니터의 좌표를 계산해서 폼을 어디에 띄울지 선택하시면 되는데요. 이 때, 반드시!! 해당하는 폼은 Form.DefaultMonitor := dmDesktop; 를 해줘야 합니다. 어설프게 Form.Left := Screen.DesktopRect.Left; 이런식으로 하면 안먹힙니다. (물론, 재수좋게 또는 모니터가 1개일 때는 원하는데로 됨) 반드시 dmDesktop 를 해줘야 전체 좌표(메인모니터와 보조모니터의 순서에 따라서 -값이 나올 수 있습니다.)로 계산되어져서 지정이 되기 때문입니다.

 

백문이 불여일견이라고, 예제에 있는 부분을 실행해 보시면서 이러쿵 저러쿵 한 번 해보시면서 시행착오를 겪으시면 어떤 것인지 더 빠르게 감이 오리라 예상됩니다.

반응형