본문 바로가기
C & C++/C & C++

[이벤트] WM_NCHITTEST 메시지로 캡션(타이틀바)가 없는 윈도우의 드래그하기

by izen8 2011. 4. 14.
반응형

캡션(타이틀바)가 없는 윈도우의 드래그를 어떻게 할까 자료를 찾아보다가 WM_NCHITTEST 메시지를 조작하는 멋진 방법이 있어서 간략하게 이 메시지에 대해서 몇자 적어봅니다.

 

 

전 이렇게 생각했습니다. 타이틀바가 없으니 드래그는 할수가 없고 어쩔수없이 전역으로 BOOL형 플래그를 하나 두고 마우스가 눌리면 TRUE, 마우스를 떼면 FALSE로 셋하고 이 변수가 TRUE일때만 WM_MOUSEMOVE 메시지 안에서 처리하려고 했습니다. 그런데 막상 짤려고 하니 전역변수를 하나 더 둬서 마지막으로 마우스가 있던 자리를 저장해놓고 현재의 위치와 비교, 윈도우 이동 시키고.. 이런식으로 할려고 하니까 썩 내키질 않더군요.

 

 

분명히 더 근사한 방법이 있을거라 생각하고 찾아낸게 바로 WM_NCHITTEST 메시지의 조작입니다. 이 메시지는 윈도우 위로 마우스가 올라갈때 일어나는 메시지인데 현재 마우스가 어느 위치에 있는가를 알려주는 메시지죠. 어느 위치에 올려져 있는지 알기위해선 이 메시지가 일어났을때DefWindowProc의 리턴값을 보면 알 수 있습니다.

 

 

쉽게 예를들어서 가령 윈도우 작업영역위에 마우스가 올라가면 운영체제는 현재 마우스가 어디위에 있는지 알아내기 위해서 윈도우로 WM_NCHITTEST 를 보냅니다. 우리는 DefWindowProc의 리턴값을 리턴해서 운영체제에게 현재 어느위치에 있다는것을 알려줍니다. 운영체제는 그에 따른 처리를 해주는 것이죠. 가령 윈도우 모서리같은 부분으로 이동하면 마우스 커서를 바꾸는 행동같은거 말예요.

 

다음은 어느위치인지를 알려주는 플래그 목록의 일부분 입니다.

 

HTCAPTION - 타이틀바

HTCLIENT - 작업영역

HTCLOSE - 닫기버턴

HTMENU - 메뉴

...

 

우리는 타이틀바가 없는 윈도우를 이동시키기 위해선 HTCLIENT 값을 HTCAPTION 으로 샤샥~ 바꿔버리면 되겠죠!! 소스를 간단하게 작성해 보자면

 

 

case WM_NCHITTEST:

    // 현재 마우스가 어느 위치에 있는지 알아보고

    dwHit = DefWindowProc(hWnd, iMsg, wParam, lParam);

 

    // 작업영역에 있다면 타이틀바 위에 있는 것으로 조작해준다.

    if(HTCLIENT == dwHit)   

        return HTCAPTION;

 

    // 나머지 메시지는 그대로 처리해준다.

    else dwHit;

반응형

'C & C++ > C & C++' 카테고리의 다른 글

자료 타입  (0) 2011.04.14
프로그램이 실행된 폴더 구하기  (0) 2011.04.14
#pragma ?  (0) 2011.04.14
파일 정보(File information)  (0) 2011.04.14
[Message] Getmessage, Translatemessage, DispatchMessage, PeekMessage  (0) 2011.04.14

댓글