WM_SETCURSOR

인수

wParam : 커서 위치의 윈도우 핸들이다. 차일드 위에 커서가 있을 수도 있으므로 이 메시지를 받은 윈도우 핸들과는 다르다.

LOWORD(lParam) : 히트 테스트 코드이며 커서가 윈도우의 어디쯤에 있는지 알려 준다. 이 값에 대해서는 WM_NCHITTEST 메시지를 참조하기 바란다.

HIWORD(lParam) : 이 메시지를 보낼 때의 마우스 메시지 ID, 메뉴가 열려있는 상태이면 0이다.

설명

커서가 윈도우 영역에서 이동될 때마다 이 메시지가 보내지며 새 위치에서 커서를 어떤 모양으로 바꿀 것인가를 질문한다. 단, 커서가 캡처되어 있을 때는 이 메시지가 보내지지 않는다. DefWindowProc은 이 메시지를 받았을 때 직접 처리하기 전에 부모 윈도우에게 이 메시지를 먼저 보내 처리하도록 한다. 그래서 차일드의 커서 모양은 부모 윈도우가 우선적으로 변경할 수 있는 기회를 준다. 부모 윈도우가 이 윈도우를 처리한 후 TRUE를 리턴하면 더 이상의 커서 관련 처리를 하지 않는다. 그렇지 않을 경우 DefWindowProc은 디폴트 처리한다.

디폴트로 커서는 작업 영역에 있을 때 윈도우 클래스에 등록된 커서로 변경되며 경계선이나 타이틀 바 등의 비작업 영역에 있을 때는 크기조절 모양이나 화살표 모양의 커서로 변경된다. 이 방식대로 커서를 처리하려면 WM_SETCURSOR를 처리하지 않고 DefWindowProc으로 보내주기만 하면 된다. 만약 커서를 조건에 따라 다른 모양으로 바꾸고 싶다면 이 메시지를 받았을 때 좌표, 커서 위치의 컨트롤 등을 참고하여 적절히 커서를 변경하고 TRUE를 리턴하면 된다.

리턴

이 메시지를 처리했으면 TRUE를 리턴하여 더 이상의 처리를 하지 않도록 한다. 그렇지 않으면 FALSE를 리턴한다.

예제

예제 1

다음 예제는 작업 영역에 버튼, 리스트 박스 등 두 개의 컨트롤을 생성해 놓고 각 컨트롤 위에서 커서를 다른 모양으로 바꾼다.

HWND hBtn, hList;
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	TCHAR Mes[]="커서의 위치에 따라 모양을 바꿉니다";

	switch(iMessage) {
	case WM_CREATE:
		hBtn=CreateWindow("button","버튼",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
			20,20,100,25,hWnd,(HMENU)0,g_hInst,NULL);
		hList=CreateWindow("listbox",NULL,WS_CHILD | WS_VISIBLE | WS_BORDER,
			20,50,100,100,hWnd,(HMENU)1,g_hInst,NULL);
		return 0;
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		TextOut(hdc,150,20,Mes,lstrlen(Mes));
		EndPaint(hWnd, &ps);
		return 0;
	case WM_SETCURSOR:
		if ((HWND)wParam==hBtn) {
			SetCursor(LoadCursor(NULL,IDC_WAIT));
			return TRUE;
		}
		if ((HWND)wParam==hList) {
			SetCursor(LoadCursor(NULL,IDC_IBEAM));
			return TRUE;
		}
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

버튼 위에 있을 때는 모레 시계 모양으로 바꾸며 리스트 박스 위에 있을 때는 I자 모양의 커서로 바꾸었다. 커서를 직접 바꾸었으므로 TRUE를 리턴하여 더 이상의 커서 관련 처리를 하지 않도록 하였다. 만약 그 외의 영역에 있을 경우는 break하여 DefWindowProc으로 처리를 넘긴다.

플랫폼

95이상

참조

 


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