제목을 정하기 힘드네요..
[개요]
개인적으로
사무실에서는 노트북을 미니독에 연결해 19" , 17"
듀얼모니터로 작업합니다.
출장을 가거나 집에 퇴근하면 노트북
기본모니터에서 작업을 하게되죠
그런데
회사의 업무용 어플에
프로그램의 초기위치 저장 기능이 있는데..
이 프로그램을 집에서 사용하려면?
화면밖을 벗어나서 제어가 안되는 경우가 있습니다.
사무실에선 sub모니터에 프로그램을 실행시켜 작업하다가 종료했기에..
집에서난 출장가서 프로그램을 실행하면 .. 곤란해지는 경우가 종종 있게 됩니다.
즉 초기위치가
현재 시스템의 모니터(Desktop) 영역을 벗어나 있는경우..
메인모니터 안으로 들어오도록 하는 기능이 필요하더군요
[코드]
//---------------------------------------------------------------------------
// Main폼이 Desktop영역을 벗어났는지 체크해서, PrimaryMonitor 영역안으로 넣는 함수
//---------------------------------------------------------------------------
void __fastcall SetAppDesktopBounds()
{
int SrcWid,SrcHei;
TRect MainRc,ScrRc;
MainRc=Application->MainForm->BoundsRect;
TPoint ptMain(MainRc.left,MainRc.top);
//좌상단이 Desktop 영역을 벗어났는지 체크.
for( int i=1 ;i< Screen->MonitorCount;i++)
{
if(PtInRect( Screen->Monitors[i]->BoundsRect,ptMain))return;
};
//메인모니터 영역안으로 메인폼을 옮김
//방법1. 그냥 (0,0)으로 옮기는 방안
//Application->MainForm->SetBounds(0,0, Application->MainForm->Width, Application->MainForm->Height);
//방법2. 현재 주 모니터크기를 기준으로 Offset만큼 옮기는 방안
//이 방법은 보조모니터에서의 위치를 기준으로 주모니터로 옮기는 방안인데..
//만약 주 모니터 해상도가 변경되면 좀 엉뚱한 위치에 가게 됩니다. 문론 화면안에 있기는 하죠
ScrRc=Screen->PrimaryMonitor->BoundsRect;
SrcWid=ScrRc.Right- ScrRc.Left;
SrcHei=ScrRc.Bottom- ScrRc.Top;
if( MainRc.Left > ScrRc.right )
{
MainRc.Left=MainRc.Left- ((MainRc.Left-ScrRc.left)/SrcWid)*SrcWid;
}
else if( MainRc.Left < ScrRc.Left )
{
MainRc.Left=MainRc.Left+((ScrRc.Left-MainRc.Left)/SrcWid+1)*SrcWid;
}
//-------------------------
if( MainRc.top > ScrRc.bottom )
{
MainRc.top=MainRc.top - ((MainRc.top-ScrRc.top)/SrcHei)*SrcHei;
}
else if( MainRc.top < ScrRc.top )
{
MainRc.top=MainRc.top+((ScrRc.Top-MainRc.Top)/SrcHei+1)*SrcHei;
}
MainRc.right =MainRc.Left+Application->MainForm->Width;
MainRc.bottom=MainRc.Top+Application->MainForm->Height;
Application->MainForm->BoundsRect=MainRc;
}
//---------------------------------------------------------------------------
사용예는..
//---------------------------------------------------------------------------
void __fastcall TForm6::FormCreate(TObject *Sender)
{
// (파일이나 , 레지스터 등에서 초기위치를 불러와서 셋팅 )
this->Left=2000;
this->Top=100;
}
//---------------------------------------------------------------------------
void __fastcall TForm6::FormShow(TObject *Sender)
{
//메인Form이 show될때 Desktop 영역을 벗어났는지 체크함
SetAppDesktopBounds();
}
[코드 설명]
코드를 보시면 아시겠지만..
1. 화면을 벗어났는지 체크는 메임폼의 좌상단의 위치로만 확인합니다.
2. Screen이라는 전역객체에 Monitor관련 몇가지 property와 함수가 있습니다.
그것을 잘 사용하시면 될것 같습니다.
[프로그램 실행중 갑자기 모니터가 하나 빠지는 경우엔]
위 함수는 프로그램 실행할때 체크했는데..
이미 실행된 상황에서 갑자기 모니터가 하나 빠진경우에는 어떻게
메인모니터로 프로그램을 가져올까요?
이 기능은 VCL에서 자동으로 지원합니다.
( RAD2010 기준 )
[사족..]
초기위치 저장 기능이 없으면.. 고민안해도 되는 문제인데..
기능을 추가면서 새로운 문제가 발생하게 된 상황이죠...
뭐 사소한 기능이지만
사용자에 대한 이런 배려가 어플의 완성도를 더욱 높여줄것이라 생각합니다.
그럼..