안녕하십니까?
듀얼 모니터를 사용하시는 방법은 Citect KnowledgeBase 파일(설치 CD에 포함되어 있음)에서 'CitectSCADA > Whitepapers > Q4688 : Multi-Monitors with CitectSCADA' 파트를 보시면 자세한 설명이 있습니다. 이 내용을 간추리면 다음과 같습니다.
1. 하드웨어 준비
Multi Monitor를 사용하기 위해서는 다음의 3 가지 중의 한 가지 방법을 사용해야 합니다.
- Spanned 모드의 듀얼 모니터 카드 사용
- Extended 모드의 듀얼 모니터 카드 사용
- Extended 모드의 Single 모니터 카드 2장 사용
1.1 Extended (또는 Expended) 모드
이 모드는 윈도우에서 일반적으로 사용되는 기본 모드입니다. 이 모드에서는 각각의 모니터가 서로 다른 설정으로 사용이 가능합니다. 하지만 CitectSCADA에서는 이 모드를 지원하지 않습니다.(이것은 기본 기능으로 지원하지 않는 다는 의미 입니다. 이 모드를 사용할 때는 Cicode로 Multi-Monitor 관리를 할 수 있습니다.)
따라서 듀얼 모니터 카드를 사용하시면 쉽게 듀얼 모니터 기능을 구현할 수 있습니다.
1.2 Spanned (또는 Stretched) 모드
이 모드는 모든 모니터가 하나의 스크린 모드로 설정되는 경우입니다.
듀얼 모니터 카드를 사용하는 경우 Spanned 모드를 설정하는 방법은 바탕화면을 우클릭하여 '디스플레이 등록 정보 > 설정 탭'으로 이동하여 다음과 같이 설정하면 됩니다.
- '고급 설정' 버튼을 클릭하고 Single Resolution을 사용하도록 설정합니다. (이 설정은 그래픽 카드 메이커마다 GUI 구성이 다를 수 있습니다.)
- 다시 설정 화면으로 와서 해상도를 설정합니다. (예를 들어, 이전의 하나의 모니터 해상도가 1024*768 이었다면 2048*768로 설정하는 것입니다.)
2. 프로젝트 설정
간단하게 Multi-Monitor를 사용하려면 CSV_Include 프로젝트를 Include하여 사용하시면 됩니다.
우선 citect.ini에서 다음의 파라미터 설정이 필요합니다.
[Page]DynamicSizing=0
[Animator]FullScreen=1
그리고 컴퓨터 설정 마법사에서는 "타이틀바 표시'를 해제 합니다.
2.1 방법 A - 가장 간단한 방법
INI 파일에서 다음의 파라미터들을 설정합니다.
[MultiMonitors]
Monitors=n ! n에는 모니터의 개수를 입력합니다. 듀얼 모니터를 사용하면 2를 입력합니다.
ScreenWidth=m ! m에는 하나의 모니터 수평 해상도의 값을 입력합니다. 예를 들어1024를 입력합니다.
StartupPagen=PageName ! n은 모니터의 번호이고, PageName은 그 모니터에서 기동시 표시할 화면입니다.
! 만약 2개의 모니터를 사용한다면 StartupPage1과 StartupPage2 설정이 필요합니다.
이렇게 설정한 다음에는 CSV_MM_* 또는 CSV_* Cicode 함수들을 사용하시면 됩니다.
2.2 방법 B - 수동으로 사용하는 방법
어떤 경우에는 모니터 설정이 아주 복잡하게 될 수도 있습니다. 예를 들어 1개의 듀얼 모니터 카드와 2개의 싱글 모니터 카드를 사용할 수도 있습니다. (듀얼 모니터 카드는 DLP로 출력하고, 2개의 싱글 모니터 카드는 LCD 모니터를 사용하는 경우 등등 다양한 경우가 있을 수 있습니다.)
이런 경우 뿐만이 아니라 모든 경우에 대해서 CitectSCADA에서는 WinNewAt("PageName", x, y) 함수를 사용하여 원하는 위치에 표시를 할 수 있습니다. (참고: 그래픽 카드에 따라서 (x,y)의 원점 좌표를 (0,0)으로 설정할 수도 있으며(기본), (1,1)로 설정해야 할 수도 있습니다.)
다음에 팝업 창을 어느 모니터에서 띄워야 하는지를 결정해야 하는데 이것은 DspGetMouse(x, y) 함수를 사용하여 x, y 좌표를 얻고, 이 값으로 첫번째 모니터인지(예, x가 1024보다 작음) 또는 두번째 모니터인지(예, x가 1024보다 크거나 같음)를 확인한 후에 WinNewAt() 함수에서 x, y 좌표를 지정하는 것입니다.
또 다른 방법으로는 WinNumber() 또는 WinGetFocus() 함수를 사용하여 마우스가 클릭이된 창의 번호를 가지고 옵니다. 런타임 시스템이 기동하면서 첫번째 모니터의 WinNumber 값(대체로 1번 값을 가짐)과 두번째 모니터의 WinNumber 값(대체로 2번 값을 가짐)을 확인하여 버퍼로 관리를 하면 마우스 클릭시 이 값과 비교하여 어느 모니터에서 호출이 되었는지도 확인할 수가 있습니다.
이 방법은 기동시 두 화면을 띄우면서부터 WinNumber를 관리하고, 마우스를 클릭하여 팝업 화면을 띄울 때(또는 메시지 박스를 띄울 때) 등의 모든 경우를 고려하여 페이지 표시를 관리하도록 프로그래밍을 해야 합니다.
3. 런타임 이슈
3.1 모든 창이 왼쪽 모니터에만 나타나는 경우
우선 Spanned 모드를 사용하는지 아니면 Extended 모드를 사용하는지를 확인하시기 바랍니다. 만약 Spanned 모드를 사용한다면 2.1에서 설명된 내용을 다시 한번 검토하여 보시기 바랍니다. 이 모드에서는 설정이 정상적으로 되어 있으면 이 현상이 나타나지 않습니다.
만약 Extended 모드를 사용하고, WinNewAt("PageName", 1024, 0) 호출시 오른쪽 모니터에 표시되지 않고 왼쪽 모니터에 표시된다면 좌표를 (1025,1)로 바꾸어 봅니다. 만약 이 좌표로도 안되는 경우에는 WinNewAt() 함수 다음에 WinMove(1024, 0) 함수를 사용하여 창을 이동시킬 수 있습니다.
3.2 팝업 창이 다른 모니터에 표시되는 경우
이 현상은 XP Style의 템플리트를 사용할 때는 나타나지 않습니다. Standard 템플리트를 사용할 때 이 문제가 발생할 수 있으며, 이 때는 창을 띄우는 좌표를 검사하고, 그 창이 화면 바깥쪽에 표시되지 않도록 주의해야 합니다.
3.3 팝업 창이 두 모니터에 걸쳐서 표시되는 경우
만약 프로젝트가 standard 템플리트를 기반으로 하고 있고, 첫번째 모니터에서 호출된 팝업 창이 화면 바깥쪽까지 표시되도록 지정된 경우에 그럴 수 있습니다. 이 문제도 3.2절과 같이 조치하면 됩니다.
4. Extended 모드에서 Multi-Monitor를 사용하는 방법
이 방법에 대해서는 Citect KnowledgeBase Q3735를 참조하시면 됩니다.
간단하게 함수를 만들어보면 다음과 같습니다.
function MM_AdjustWindow(int iMonitorWidth, int iMonitorHeight, int iXPos, int iYPos)
IF StrToInt(PageInfo(12)) > iMonitorWidth OR StrToInt(PageInfo(13)) > iMonitorHeight THEN
WinSize(0, 0) // Somehow this is required
WinMove(iXPos, iYPos, iMonitorWidth, iMonitorHeight);
// Resize the window including the window frame
END
// Reposition the window to destination
IF iXPos >= iMonitorWidth OR iYPos >= iMonitorHeight THEN
WinPos(iXPos, iYPos);
END
END
만약 창의 크기를 조정해야 한다면 WinSize() 함수를 사용하면 됩니다. 이 함수에 대한 예제는 아래와 같습니다.
FUNCTION
MM_WinSize(INT iXSize, iYSize)
INT iXPos, iYPos;
// Remember exisiting position of the window
iXPos = StrToInt(PageInfo(14));
iYPos = StrToInt(PageInfo(15));
// Resize the window
WinSize(iXSize, iYSize); // the 1st WinSize() may just send the window to 1st monitor
WinSize(iXSize, iYSize); // the 2nd WinSize() ensure the window is resized properly
WinPos(iXPos, iYPos); // reposition the window to original position
END
정리 :
어느 방법이든지 CitectSCADA에서는 Muli-Monitor를 사용할 수 있습니다. 그런데 Extended 모드에서는 Cicode 프로그래밍이 필요하고, Cicode 프로그래밍이 번거로운 경우에는 Spanned 모드가 지원되는 듀얼 모니터 카드를 사용하면 됩니다.
이상입니다.
<내용출처 : 본인작성>