C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[1094] [Forms] 초기위치 저장 기능이 있는 어플이 듀얼/싱글 모니터 왔다갔다 하는경우에..
장성호 [nasilso] 8485 읽음    2012-06-20 16:49
제목을 정하기 힘드네요..


[개요]
개인적으로
사무실에서는 노트북을 미니독에 연결해 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 기준 )




[사족..]

초기위치 저장 기능이 없으면.. 고민안해도 되는 문제인데..
기능을 추가면서 새로운 문제가 발생하게 된 상황이죠...

뭐 사소한 기능이지만
사용자에 대한 이런 배려가 어플의 완성도를 더욱 높여줄것이라 생각합니다.


그럼..
아루스 [tinydew4]   2012-08-08 15:13 X
영역체크에서 i 변수가 0 부터 시작해야 하는게 아닌지요?

+ -

관련 글 리스트
1094 [Forms] 초기위치 저장 기능이 있는 어플이 듀얼/싱글 모니터 왔다갔다 하는경우에.. 장성호 8485 2012/06/20
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.