5,074,772 th visitor since 2017.2.1 ( Today : 1009 )
Programming
No. 298
Name. coolx
Subject. [API] 마우스 처리 #2
Main Cate. Win32
Sub Cate.
Date. 2006-07-20 09:45
Hit. 4609 (220.76.115.27)
File.
<< Mouse Event - Nonclient Range>>

Mouse는 21개의 Message를 가지고 있다.
이중 11개는 클라이언트 영역과 관계가 없다.

WM_NVMOUSEMOVE
WM_NCLBUTTONDOWN, WM_NCLBUTTONUP, WM_NCLBUTTONDBLCLK
WM_NCMBUTTONDOWN, WM_NCMBUTTONUP, WM_NCMBUTTONDBLCLK
WM_NCRBUTTONDOWN, WM_NCRBUTTONUP, WM_NCRBUTTONDBLCLK

wParam : 마우스가 움직이거나 눌려진 비클라이언트 영역
HT(Hit-Test)로 시작하는 식별자중의 하나로 설정
lParam : 하위 워드에 x, 상위 워드에 y좌표
화면 전체의 좌측 상단이 (0,0)

다음의 두개 함수로 화면 좌표를 클라이언트 영역 좌표로 변환

ScreenToClient(hwnd,pPoint);
ClientToScreen(hwnd,pPoint);

이들 두 함수는 예전의 값을 보관하지 않고 POINT형식의 구조체
안에 저장된 값을 변환.


<< WM_NCHITTEST >>
21개의 마우스 메시지중에서 마지막 메시지.
다른 모든 클라이언트 영역과 비클라이언트 영역 마우스 메시지에
우선.

lParam : 마우스의 x,y위치
wParam : 사용되지 않음

일반적으로 윈도우즈 작업은 이 메시지를 DefWindowProc에 전달하며,
윈도우즈는 WM_NCHITTEST 메시지를 마우스의 위치에 따라
다른 모든 마우스 메시지를 만드는데 사용.
비클라이언트 영역 마우스 메시지에서 WM_NCHITTEST를 처리할때
DefWindowProc에 되돌려진 값은 마우스 메시지의 wParam인자가 된다.
이 값은 비클라이언트 영역 마우스 메시지에 다음의 값을 더한 wParam
값의 어떤 것이 될 수 있다.

HTCLIENT 클라이언트 영역
HTNOWHERE 어떤 윈도우도 아님
HTTRANSPARENT 다른 윈도우에 겹쳐진 윈도우
HTERROR DefWindowProc에 beep 소리를 나게 함

DefWindowProc가 WM_NCHITTEST메시지를 처리한 후
HTCLIENT를 되돌린다면, 윈도우즈는 화면 좌표를 클라이언트 영역
좌표로 변환하고 클라이언트 영역 마우스 메시지를 발생시킨다.

모든 마우스 메시지를 무력화시키는 방법
case WM_NCHITTEST:
return (LRESULT) NTNOWHERE;


<< 마우스 Capture >>
SetCapture(hwnd);

이 함수 호출 후에 윈도우즈는 핸들이 hwnd인 윈도우의 윈도우
프로시저에 모든 마우스 메시지를 보낸다. 마우스가 비클라이언트
영역에 있더라도 항상 클라이언트 영역 메시지를 보낸다.

ReleaseCapture();

로 제거할 수 있다.


[바로가기 링크] : http://coolx.net/cboard/develop/298



Name
Password
Comment
Copyright © 1999-2017, swindler. All rights reserved. 367,611 visitor ( 1999.1.8-2004.5.26 ), 2,405,771 ( -2017.01.31)

  2HLAB   2HLAB_Blog   RedToolBox   Omil   Omil_Blog