1. WM_NCHITTEST
- Cursor가 움직이거나 마우스 버튼을 누르거나 놓을 때, System은 커서 아래 있는 윈도우(마우스를 캡쳐한 경우 캡쳐한 윈도우)에게 WM_NCHITTEST 메시지를 보낸다.(sent)
- 이때 대부분 윈도우 프로시저는 이 메세지를 직접 처리 하지 않고 DefWindowProc으로 보내는데 DefWindowProc는 커서의 좌표를 조사해서 커서가 현재 윈도우의 어느 부분에 커서가 있는지 나타내는
Hit Test Code 를 리턴한다.
- WM_NCHITTEST의 결과로 얻어진 HitTestCode가 다음 메시지를 결정하는데 사용된다.
- 예제 코드( Control키를 누른 상태에서 클라이언트 영역에서 마우스의 왼쪽 버튼을 누르면 윈도우를 이동 )
// WM_NCHITTEST 를 처리하는 방법
case WM_NCHITTEST:
{
// 1. 먼저 DefWindowProc()으로 전달해서 hit test code를 얻는다.
int code = DefWindowProc( hwnd, msg, wParam, lParam );
// 2. code를 조작한다.
if( code == HTCLIENT && GetKeyState( VK_CONTROL ) < 0 )
code = HTCAPTION;
// 3. code를 리턴한다. - 다음 메세지는 이 리턴값에 의해 결정된다.
return code;
}
- Cursor가 움직이거나 마우스 버튼을 누르거나 놓을 때, System은 커서 아래 있는 윈도우(마우스를 캡쳐한 경우 캡쳐한 윈도우)에게 WM_NCHITTEST 메시지를 보낸다.(sent)
- 이때 대부분 윈도우 프로시저는 이 메세지를 직접 처리 하지 않고 DefWindowProc으로 보내는데 DefWindowProc는 커서의 좌표를 조사해서 커서가 현재 윈도우의 어느 부분에 커서가 있는지 나타내는
Hit Test Code 를 리턴한다.
- WM_NCHITTEST의 결과로 얻어진 HitTestCode가 다음 메시지를 결정하는데 사용된다.
- 예제 코드( Control키를 누른 상태에서 클라이언트 영역에서 마우스의 왼쪽 버튼을 누르면 윈도우를 이동 )
// WM_NCHITTEST 를 처리하는 방법
case WM_NCHITTEST:
{
// 1. 먼저 DefWindowProc()으로 전달해서 hit test code를 얻는다.
int code = DefWindowProc( hwnd, msg, wParam, lParam );
// 2. code를 조작한다.
if( code == HTCLIENT && GetKeyState( VK_CONTROL ) < 0 )
code = HTCAPTION;
// 3. code를 리턴한다. - 다음 메세지는 이 리턴값에 의해 결정된다.
return code;
}