티스토리 뷰

SetCapture() GetCapture() ReleaseCapture()


함수 설명

  • CWnd* SetCapture(HWND)
    • 반환값
      • 이미 해당 함수를 사용한 윈도우가 있을 경우, 그 윈도우의 핸들을 반환함
      • 그런 윈도우가 없을 경우 NULL을 반환함
    • 기능
      • 매개변수로 전달된 윈도우가 자신의 윈도우 밖에서 발생하는 마우스 이벤트도 입력받을 수 있도록 함
  • CWnd* GetCapture()
    • 반환값
      • 이미 해당 함수를 사용한 윈도우가 있을 경우, 그 윈도우의 핸들을 반환함
      • 그런 윈도우가 없을 경우 NULL을 반환함
  • BOOL ReleaseCapture()
    • 반환값
      • 해제 성공시 0이 아닌 값을 반환함
      • 해제 실패시 0을 반환함
    • 기능
      • 해당 윈도우가 SetCapture()로 마우스 캡쳐를 강제한 것을 해제함

배경

  • mouse capture
    • 마우스 입력 이벤트를 받는 상태
  • (일반적으로) 윈도우즈에서의 윈도우는, 자신의 클라이언트 영역 밖에서 발생하는 마우스 입력 이벤트를 받지 못함
    • 윈도우 A에서 윈도우 B로 마우스가 이동할 경우, 윈도우 B로 마우스 캡쳐가 넘어감

문제

  • 윈도우 밖으로 드래그를 해야하는 경우
  • 윈도우를 나갈 때의 좌표부터 윈도우를 들어올 때의 좌표까지를 잇고 싶은 경우
  • 윈도우 밖의 마우스 입력도 처리해야할 필요가 있을 경우

해결

  • SetCapture() 호출 후 마우스 왼쪽/중간/오른쪽 버튼을 클릭하면서 클라이언트 영역을 벗어날 경우, WM_MOUSEMOVE 메시지를 계속 받을 수 있음
    • 따라서 WM_MOUSEMOVE 메시지에서 드래그 시 수행해야할 작업을 작성하여 해결할 수 있음
  • SetCapture()를 호출했던 윈도우의 클라이언트로 돌아오지 않고, 외부에서 마우스 클릭을 끝낼 경우 WM_LBUTTONUP / WM_MBUTTONUP / WM_RBUTTONUP 메시지를 받을 수 있음
    • 외부의 어느 좌표에서 마우스 클릭이 끝났는지 검출 가능

한계

  • 외부에서 마우스 클릭이 끝날 경우, SetCapture()를 호출한 윈도우는 마우스 캡쳐를 잃어버림
    • 외부에서 마우스 클릭을 지속적으로 입력받기 어려움 → DirectInput 필요
  • 마우스 클릭이 유지되고 있어야함

활용 예시

switch(msg)
{
	// when mouse left click starts
	case WM_LBUTTONDOWN:
		SetCapture(hWnd);
		return 0;
	
	// when mouse moves
	case WM_MOUSEMOVE:
		if(GetCapture() == hWnd)
		{
			[feature]
		}
		return 0;
	
	// when mouse left click ends
	case WM_LBUTTONUP:
		ReleaseCapture();
		return 0;
}
  • 마우스를 누르고 뗄 때까지의 시간동안, 해당 윈도우 외부에서도 마우스 입력 이벤트( WM_MOUSEMOVE 한정 )를 처리할 수 있음

참고 영상

  • ① 클라이언트 영역 내부에서 클릭이 시작되고 외부에서 끝날 경우 WM_LBUTTONUP까지 메시지를 입력받음
  • ② SetCapture()를 사용하지 않은 경우, 클라이언트 영역 밖에서의 좌표를 입력받지 못하므로 의도하지 않은 선이 그려짐
  • ③ SetCapture()를 사용하는 경우, 클라이언트 영역 밖에서의 좌표도 입력받으므로 의도한 대로 선이 그려짐




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

cpp-lib-and-dll-on-visual-studio (2/2)  (0) 2019.03.17
cpp-lib-and-dll-on-visual-studio (1/2)  (0) 2019.02.23
refresh in console program  (0) 2018.03.11
pause in console program  (0) 2018.03.08
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함