ScreenToClient

원형

BOOL ScreenToClient(HWND hWnd, LPPOINT lpPoint);

MFC 원형

void CWnd::ScreenToClient( LPPOINT lpPoint ) const;

인수

▶hWnd : 좌표 변환에 사용할 윈도우의 핸들. 이 윈도우의 작업 영역을 기준으로 하는 좌표로 변환된다.

▶lpPoint : 변환 대상 좌표이며 논리 단위가 아닌 장치 단위(픽셀)이다.

리턴

성공하면 0이 아닌 값을 리턴하며 실패하면 0을 리턴한다.

설명

화면의 원점을 기준으로 하는 좌표 lpPoint를 hWnd의 작업 영역을 기준으로 하는 좌표로 변환한다. hWnd윈도우의 작업 영역 원점의 화면 좌표가 cx, cy일 때 lpPoint는 lpPoint.x - cx, lpPoint - cy로 변환된다. GetCursorPos, MoveWindow, GetWindowRect 등과 같이 화면 좌표를 리턴하는 함수로부터 작업 영역의 좌표로 변환하고자 할 때 이 함수를 사용한다.

예제 1

다음 예제는 대화상자에 배치된 버튼의 오른쪽과 아래쪽으로 각각 100픽셀만큼 떨어진 위치에 두 개의 문자열을 출력한다.

BOOL CALLBACK MainDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	RECT rt;
	HWND hBtn;
	char Mes1[]="수평 위치";
	char Mes2[]="수직 위치";
	
	switch(iMessage)
	{
	case WM_INITDIALOG:
		hDlgMain = hDlg;
		return TRUE;
	case WM_COMMAND:
		switch (LOWORD(wParam))
		{
		case IDOK:
		case IDCANCEL:
			EndDialog(hDlg,IDOK);
			return TRUE;
		}
		return FALSE;
	case WM_PAINT:
		hdc=BeginPaint(hDlg, &ps);
		hBtn=GetDlgItem(hDlg,IDOK);
		GetWindowRect(hBtn,&rt);
		ScreenToClient(hDlg,(LPPOINT)&rt);

		SetBkMode(hdc,TRANSPARENT);
		TextOut(hdc,rt.left+100,rt.top,Mes1,lstrlen(Mes1));
		TextOut(hdc,rt.left,rt.top+100,Mes2,lstrlen(Mes2));
		EndPaint(hDlg, &ps);
		return 0;
	}
	return FALSE;
}

hBtn의 작업 영역상의 좌표를 구하기 위해 GetWindowRect 함수와 ScreenToClient 함수를 사용하였다. GetWindowRect는 윈도우의 화면상의 좌표를 구해주는데 이 좌표를 hDlg의 작업 영역을 기준으로 하는 좌표로 변환하였다. 이 방법은 부모 윈도우에서 차일드 윈도우의 작업 영역 좌표를 구하는 일반적인 방법이다. 실행 결과는 다음과 같다.

예제 2

다음 예제는 0.2초마다 마우스의 현재 위치에 조그만 원을 그린다. 주기적으로 마우스의 위치를 표시하기 위해 WM_TIMER 메시지를 사용했으며 WM_TIMER는 현재의 마우스 좌표를 제공하지 않으므로 GetCursorPos 함수로 마우스 좌표를 조사하였다. 그러나 이 함수가 조사해주는 마우스 좌표는 화면을 기준으로 하는 좌표이므로 이 좌표에 원을 출력하기 위해서는 ScreenToClient 함수를 사용해야 한다.

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	POINT pt;

	switch(iMessage) {
	case WM_CREATE:
		SetTimer(hWnd,1,200,NULL);
		return 0;
	case WM_TIMER:
		hdc=GetDC(hWnd);
		GetCursorPos(&pt);
		ScreenToClient(hWnd,&pt);
		Ellipse(hdc,pt.x-3,pt.y-3,pt.x+3,pt.y+3);
		ReleaseDC(hWnd,hdc);
		return 0;
	case WM_DESTROY:
		KillTimer(hWnd,1);
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

실행 결과는 다음과 같다.

작업 영역 기준 좌표의 원점은 윈도우의 작업 영역 좌상단이므로 이 원점보다 더 왼쪽 또는 더 위쪽에 있는 좌표는 변환 결과 음수값을 가질 수도 있다.

이 함수는 POINT형 구조체, 즉 한 좌표에 대해서만 좌표 변환을 해 준다. 만약 여러개의 좌표를 연속으로 변환하거나 POINT구조체가 두 개 겹쳐 있는 RECT형 좌표를 변환하려면 이 함수를 다음과 같이 두 번 호출해 주면 된다.

ScreentToClient((LPPOINT)&rt);
ScreenToClient((LPPOINT)&rt+1);

참고함수

ClientToScreen : 작업 영역 좌표를 화면 좌표로 변환한다.

플랫폼

95이상

참조

 


written by http://www.winapi.co.kr