SetCursor

원형

HCURSOR SetCursor(HCURSOR hCursor);

MFC 원형

해당하는 함수 없음

인수

▶hCursor : 변경하고자 하는 커서의 핸들이며 보통 LoadCursor나 LoadImage로 읽어온 커서 리소스의 핸들이다. 또는 CreateCursor 함수로 직접 커서를 만들어 사용할 수도 있다. 이 인수가 NULL이면 커서를 화면에서 제거한다.

리턴

이전에 설정되어 있던 커서의 핸들을 리턴하며 이 핸들은 커서를 원래 상태로 되돌릴 때 사용된다. 만약 이전에 커서가 설정되어 있지 않았다면 NULL이 리턴된다.

설명

마우스의 현재 위치를 알려주는 커서를 hCursor로 변경하되 만약 이미 hCursor가 설정되어 있다면 아무 일도 하지 않는다. 즉, 같은 커서를 두번 설정할 때는 불필요한 커서 변경을 하지 않는다. 여러벌의 커서를 준비해 두고 현재 상태에 따라 다른 모양의 커서를 사용하고자 할 경우 이 함수로 커서를 변경하면 된다.

예제 1

다음 예제는 3초간의 긴 작업을 하기 전에 커서를 모래시계로 변경하고 작업이 끝나면 다시 원래의 커서로 복구시킨다.

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	char Mes[]="마우스 왼쪽 버튼을 누르십시오";
	HCURSOR hOld;

	switch(iMessage) {
	case WM_LBUTTONDOWN:
		hOld=SetCursor(LoadCursor(NULL,IDC_WAIT));
		Sleep(3000);
		SetCursor(hOld);
		return 0;
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		TextOut(hdc,10,10,Mes,lstrlen(Mes));
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

왼쪽 버튼을 눌렀을 때 3초간의 작업을 하는데 작업에 들어가기 전에 SetCursor 함수로 커서를 IDC_WAIT로 변경해 주었다. 리소스에 정의되어 있는 커스텀 커서를 사용하는 것도 물론 가능하다. 이 함수가 리턴해 주는 이전 커서 핸들을 hOld에 보관해 놓은 후 작업이 끝나면 원래의 커서로 복구시켰다. 시간이 오래 걸리는 작업을 할 때는 이런 커서 변경 코드를 반드시 삽입하여 작업중임을 알려주어야 한다.

예제 2

다음 예제는 마우스의 왼쪽 버튼을 누르면 모래시계 모양의 커서를 보여주고 오른쪽 버튼을 누르면 화살표 모양의 커서를 보여준다. 일정한 조건에 따라 커서의 모양을 변경하는 예제이다.

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	char Mes[]="왼쪽=모래시계, 오른쪽=화살표";

	switch(iMessage) {
	case WM_LBUTTONDOWN:
		SetCursor(LoadCursor(NULL,IDC_WAIT));
		return 0;
	case WM_RBUTTONDOWN:
		SetCursor(LoadCursor(NULL,IDC_ARROW));
		return 0;
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		TextOut(hdc,10,10,Mes,lstrlen(Mes));
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

WM_LBUTTONDOWN에서 IDC_WAIT로 커서를 변경하고 WM_RBUTTONDOWN에서 IDC_ARROW로 커서를 변경하였다. 그러나 이 예제는 원하는대로 동작하지 않으며 커서를 움직이면 항상 화살표 모양으로 변경되어 버린다. 왜냐하면 마우스 커서가 움직일 때마다 WM_SETCURSOR 메시지가 발생하며 이 메시지의 디폴트 처리 루틴에서 커서를 윈도우 클래스에 등록된 것으로 바꾸어 버리기 때문이다. 만약 이런 방법대로 한번 변경한 커서가 그대로 유지되기를 바란다면 윈도우 클래스의 커서를 NULL로 지정해야 한다.

WndClass.hCursor=NULL;

이렇게 하면 WM_SETCURSOR 메시지가 발생해도 현재 설정된 커서가 변경되지 않는다. 그러나 이 방법은 비작업영역에 있던 커서가 갑자기 작업 영역에 들어올 때 제대로 커서 모양이 변경되지 않으므로 문제가 있다.

예제 3

다음 예제는 앞의 예제를 수정하여 제대로 동작하도록 바꾸어 본 것이다.

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	char Mes[]="왼쪽=모래시계, 오른쪽=화살표";
	static HCURSOR hNowCursor;

	switch(iMessage) {
	case WM_LBUTTONDOWN:
		hNowCursor=LoadCursor(NULL,IDC_WAIT);
		return 0;
	case WM_CREATE:
	case WM_RBUTTONDOWN:
		hNowCursor=LoadCursor(NULL,IDC_ARROW);
		return 0;
	case WM_SETCURSOR:
		if (LOWORD(lParam) == HTCLIENT) {
			SetCursor(hNowCursor);
			return TRUE;
		}
		break;
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		TextOut(hdc,10,10,Mes,lstrlen(Mes));
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

hNowCursor라는 정적 변수에 현재 설정할 커서의 핸들만을 대입해 놓고 WM_SETCURSOR 메시지를 받았을 때 이 핸들이 가리키는 커서를 사용하도록 하였다. 이렇게 되면 프로그램의 상태에 따라 원하는 커서를 마음대로 사용할 수 있다.

참고함수

GetCursor : 현재 설정되어 있는 커서의 핸들을 구한다.

플랫폼

95이상

참조

 


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