마우스 캡쳐란 마우스가 윈도우 영역을 벗어나 이동을 했을 경우에도 마우스의 위치를 알아내는 것을 말한다.


 MOUSE_DOWN 상태에서만 가능하고, MOUSE_UP 상태에서는 캡쳐는 무효화된다.


 각각의 윈도우 마다 마우스 이벤트를 받는 것은 동일한데, A윈도우에서 B윈도우위로 이동한다고 해도, 마우스 캡쳐가 동작하고 있는 것으로, A윈도우에서의 마우스 위치 값을 갖게 된다.


 B윈도우에서는 기본적인 마우스 동작 방식에 위배되어 B윈도우가 마우스 메세지를 가로 책 수 없게 된다.


 A의 마우스 캡쳐를 종료하는 시점이 필요한데, 이것이 MOUSE_UP으로 잡는것이다.


 참조 : https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms646262.aspx


 HWND SetCapture(

HWND hWnd); // 윈도우 핸들


 리턴값은 이전의 마우스를 캡쳐하고 있던 윈도우 핸들을 리턴하되 캡쳐한 윈도우가 없으면 NULL을 리턴하게 된다.


 마우스 캡쳐를 종료하는 함수는


 참조 : https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms646261.aspx


 ReleaseCapture(void)


 성공시 1을 실패시 0값을 리턴한다.


 case WM_LBUTTONDOWN:

SetCapture(hWnd);

break;

 case WM_LBUTTONUP:

ReleaseCapture();

break;


 마우스 왼쪽 버튼을 누르면 마우스 캡쳐가 시작되고, 버튼을 떼면 마우스 캡쳐가 종료된다.


 다음과 같은 예제로 마우스 왼쪽 버튼을 눌렀을 때 마우스 캡쳐를 시작하고, 버튼을 뗐을때 마우스 캡쳐를 종료하는 예제이다.


 WM_MOUSEMOVE 메시지 발생시 실시간으로 마우스 좌표를 윈도우 상에 출력하도록 되어있다.


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <stdio.h>
#include <stdlib.h>
 
#include <tchar.h>
#include <windows.h>
 
#include <string.h>
 
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
 
WNDCLASS WndClass;
 
int numbers = 0;
 
int WINAPI WinMain(HINSTANCE hInstance,
            HINSTANCE hPrevInstance,
            LPSTR lpszCmdParam,
            int nCmdShow)
{
    HWND hWnd;
    MSG Message;
    g_hInst = hInstance;
 
    WndClass.cbClsExtra=0;
    WndClass.cbWndExtra=0;
    WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
    WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
    WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    WndClass.hInstance=hInstance;
    WndClass.lpfnWndProc=(WNDPROC)WndProc;
    WndClass.lpszClassName="ApiBase";
    WndClass.lpszMenuName=NULL;
    WndClass.style=CS_HREDRAW|CS_VREDRAW;
 
    RegisterClass(&WndClass);
    
    hWnd = CreateWindow("ApiBase",
                        "Test",
                        WS_OVERLAPPEDWINDOW,
                        10,// X
                        100,// Y
                        400,// Width
                        400,// Height
                        NULL,
                        (HMENU)NULL,
                        hInstance,
                        NULL);
 
                        
    ShowWindow(hWnd,nCmdShow);
    
    while(GetMessage(&Message,0,0,0))
    {
        TranslateMessage(&Message);
        DispatchMessage(&Message);
    }
    
    return Message.wParam;
}
 
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    static int nX = 0, nY = 0;
    static char strTemp[MAX_PATH];
    long dwStyle;
    
    RECT rc;
    HWND nHwnd;
    
    POINT polyline[5= {60,50,40,30,20};
    POINT polygon[5= {10,20,30,40,50};
    
    switch(iMessage)
    {
        case WM_CREATE:
            strcpy(strTemp, "");
            break;
        case WM_MOUSEMOVE:
            nHwnd=SetCapture(hWnd);
            printf("Cature : %d, hWnd : %d\n",SetCapture(), hWnd);
            if(nHwnd==hWnd)
            {
                nX=LOWORD(lParam);
                nY=HIWORD(lParam);
                sprintf(strTemp, "point (%d, %d), keyboard state %d\0", nX, nY, wParam);
                InvalidateRect(hWnd, NULL, TRUE);
            }
            break;
        case WM_LBUTTONUP:
            printf("%d\n",ReleaseCapture());
            //ReleaseCapture();
            break;
        case WM_PAINT:
            hdc=BeginPaint(hWnd,&ps);
            GetWindowRect(hWnd,&rc);
            SetTextAlign(hdc,TA_CENTER);
            TextOut(hdc, (rc.right - rc.left)/2, (rc.bottom - rc.top)/2, strTemp, strlen(strTemp));
            EndPaint(hWnd,&ps);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
    }
    return DefWindowProc(hWnd,iMessage,wParam, lParam);
}
 
cs


Posted by JunkMam
,