WM_NCHITTEST

인수

wParam : 사용되지 않는다.

lParam : 화면상의 커서 좌표가 전달된다. 하위 워드에 x좌표, 상위 워드에 y좌표가 전달된다.

설명

마우스를 이동하거나 버튼을 누르거나 놓을 때마다 이 메시지가 발생한다. 이 메시지는 커서가 있는 위치가 윈도우의 어디쯤인지를 윈도우에게 질문을 하며 운영체제는 이 메시지의 리턴값에 따라 마우스를 처리한다. 예를 들어 이 메시지가 HTBOTTOM을 리턴하면 아래쪽 경계선에 커서가 있는 것으로 판단하며 이 상태에서 마우스를 드래그하면 윈도우의 수직 크기를 변경한다.

DefWindowProc은 커서가 있는 위치를 정확하게 계산하여 적절한 위치값을 리턴해 준다. 이 메시지를 처리하여 리턴값을 조작하면 운영체제의 커서 관리 동작을 변경할 수 있다. 예를 들어 작업 영역에 커서가 있을 때 HTCLIENT 대신 HTCAPTION을 리턴해 주면 작업 영역을 드래그하여 윈도우의 위치를 변경한다. 이런 조작을 하려면 현재 위치를 먼저 조사해야 하므로 DefWindowProc을 먼저 호출한 후 현재 커서 위치를 파악하고 그 결과로부터 리턴값을 조작해야 한다.

리턴

커서가 위치한 곳이 어디쯤인지를 나타내는 다음 값 중 하나를 리턴한다.

설명

HTBORDER

크기 조정이 불가능한 경계선

HTBOTTOM

아래쪽 경계선. 이 부분을 드래그하여 수직 크기를 변경할 수 있다.

HTOTTOMLEFT

아래 왼쪽 경계선

HTBOTTOMRIGHT

아래 오른쪽 경계선

HTCAPTION 타이틀 바
HTCLIENT 작업 영역
HTCLOSE 닫기 버튼
HTERROR 화면 배경 또는 윈도우간의 구분선에 있다. 이 부분에 있으면 DefWindowProc은 비프음을 낸다.
HTHELP 도움말 버튼
HTHSCROLL 수평 스크롤 바
HTLEFT 왼쪽 경계선
HTMENU 메뉴
HTMAXBUTTON
=HTZOOM
최대화 버튼

HTMINBUTTON
=HTREDUCE

최소화 버튼
HTNOWHERE 화면 배경 또는 윈도우간의 구분선에 있다.
HTRIGHT 오른쪽 경계선
HTSIZE
=HTGROWBOX
크기 조정 박스
HTSYSMENU 시스템 메뉴. 또는 차일드의 닫기 버튼
HTTOP 위쪽 경계선
HTTOPLEFT 위 왼쪽 경계선
HTTOPRIGHT 위 오른쪽 여계선
HTTRANSPARENT 같은 스레드의 다른 윈도우에 의해 가려진 부분.
HTVSCROLL 수직 스크롤 바
예제

예제 1

다음 예제는 이 메시지를 사용하는 가장 전형적인 예제이다. 작업 영역을 드래그하여 윈도우의 위치를 옮길 수 있도록 한다.

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	LRESULT hittest;
	TCHAR Mes[]="작업 영역을 드래그하여 위치를 옮길 수 있다";

	switch(iMessage) {
	case WM_NCHITTEST:
		hittest=DefWindowProc(hWnd,iMessage,wParam,lParam);
		if (hittest==HTCLIENT) {
			return HTCAPTION;
		} else {
			return hittest;
		}
	case WM_LBUTTONDOWN:
		MessageBox(hWnd,"왼쪽 마우스 버튼 누름","알림",MB_OK);
		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));
}

DefWindowProc으로 WM_NCHITTEST 메시지를 먼저 보내 현재 커서가 있는 영역이 어디인가를 조사한다. 만약 작업 영역에 커서가 있다면 HTCAPTION을 리턴하여 마치 커서가 타이틀 바에 있는 것처럼 속여 윈도우 위치를 옮기도록 한다. 그러나 이렇게 되면 작업 영역에서 마우스 클릭 메시지를 받을 수 없게 된다. 왜냐하면 WM_LBUTTONDOWN 메시지는 WM_NCHITTEST가 HTCLIENT를 리턴할 때 생성되는 메시지이기 때문이다.

플랫폼

95이상

참조

 


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