관리 메뉴

ComputerVision Jack

[MFC - 마우스와 키보드] 본문

Image Processing/MFC Programming

[MFC - 마우스와 키보드]

JackYoon 2020. 9. 15. 13:38
반응형

마우스 다루기

마우스는 시스템에 한 개만 있는 자원이므로 한순간에 한 개의 프로그램만 입력을 받을 수 있다.

윈도우 운영체제는 마우스 메시지가 발생했을 때, 어느 프로그램에 이 메세지를 전달할지 결정해야한다.

마우스 메세지는 마우스 커서 밑에 있는 윈도우가 받는다.

 

클라이언트 영역 마우스 메시지

메시지 발생 시점
WM_LBUTTONDOWN 마우스 왼쪽 버튼을 누를 때
WM_LBUTTONUP 마우스 왼쪽 버튼 뗄 떄
WM_LBUTTONDBLCLK 마우스 왼쪽 버튼을 더블 클릭 할 때
WM_MBUTTONDOWN 마우스 가운데 버튼을 누를 때
WM_MBUTTONUP 마우스 가운데 버튼을 뗄 때
WM_MBUTTONDBLCLK 마우스 가운데 버튼을 더블 클릭 할 때
WM_RBUTTONDWON 마우스 오른쪽 버튼을 누를 때
WM_RBUTTONUP 마우스 오른쪽 버튼을 뗄 때
WM_RBUTTONDBLCLK 마우스 오른쪽 버튼을 더블 킬릭 할 때
WM_MOUSEMOVE 마우스를 움직일 때

메시지 맵

일반적인 윈도우 메시지와 마찬가지로 MFC에서는 마우스 메시지를 처리하기 위해 메시지 맵을 이용한다.

메시지를 선택하면 핸들러가 자동 생성되므로 쉽게 다룰 수 있다.

 

메시지 핸들러

Afx_msg void On*(UINT nFlags, CPoint point);

  • afx_msg : 내부적으로 공백으로 처리되며 메시지 핸들러임을 나타낸다.
  • nFlags : 메시지가 생성될 당시 키보드나 마우스 버튼의 상태를 나타낸다.
  • point : 메시지가 생성될 당시의 마우스 커서 위치
비트 마스크 의미
MK_CONTROL Ctrl 누름
MK_SHIFT Shift 누름
MK_LBUTTON 마우스 왼쪽 버튼 누름
MK_MBUTTON 마우스 가운데 버튼 누름
MK_RBUTTON 마우스 오른쪽 버튼 누름

실습 - 클라이언트 영역 마우스 메시지 처리하기

왼쪽 버튼을 누른 상태로 마우스를 움직이면 타원의 크기가 변하다가 버튼을 떼면 최종적으로 타원이 그려진다.

마우스 메시지 실습

마우스 캡처

위의 실습의 경우 마우스 커서가 클라이언트 영역 밖으로 벗어나면 뷰가 마우스 메시지를 받지 못한다.

마우스 캡처는 마우스 커서의 위치와 관계없이 모든 마우스 메시지가 특정 윈도우에 전달되게 하는 메커니즘이다.

API 함수 MFC 함수 의미
SetCapture() CWnd::SetCapture() 마우스 캡처를 시작한다.
ReleaseCapture() 없음 마우스 캡처를 해제한다.
GetCapture() CWnd::GetCapture() 윈도우 현재 마우스 캡처하는지 파악

실습 - 마우스 캡처 활용하기

위의 예제에서 마우스가 윈도우를 벗어나도 타원을 그릴 수 있다.

마우스 캡처 실습

비 클라이언트 영역 마우스 메시지

메시지 발생 시점
WM_NCLBUTTONDOWN 왼쪽 버튼을 누를 때
WM_NCLBUTTONUP 왼쪽 버튼을 뗄 때
WM_NCLBUTTONKBLCLK 왼쪽 버튼을 더블 클릭할 때
WM_NCMBUTTONDOWN 가운데 버튼을 누를 때
WM_NCMBUTTONUP 가운데 버튼을 뗄 때
WM_NCMBUTTONDBLCLK 가운데 버튼을 더블 클릭할 때
WM_NCRBUTTONDOWN 오른쪽 버튼을 누를 떄
WM_NCRBUTTONUP 오른쪽 버튼을 뗄 때
WM_NCRBUTTONDBLCLK 오른쪽 버튼을 더블 클릭할 때
WM_NCMOUSEMOVE 마우스를 움직일 때

메시지 맵

클라이언트 여역 마우스 메시지와 마찬가지로 메시지 핸들러를 통해 메시지를 처리할 수 있다.

 

메시지 핸들러

Afx_msg void OnNc*(UINT nHitTest, CPoint point);

  • nHitTest : 메시지가 생성될 당시의 마우스 커서 위치를 나타낸다.
  • point :  메시지가 생성될 당시의 마우스 커서 좌표를 나타낸다.
상수값 의미
HTCAPTION 타이틀바
HTCLIENT 클라이언트 영역
HTCLOSE 종료 버튼
HTHSCROLL 기로 스크롤바
HTMENU 메뉴
HTMAXBUTTON 최대화 버튼
HTMINBUTTON 최소화 버튼
HTSYSMENU 시스템 메뉴
HTVSCROLL 세로 스크롤바

실습 - 비클라이언트 영역 마우스 메시지 처리하기

종료 버튼을 누르면 프로그램을 종료하는 대신 메시지 상자가 나타남

비클라이언트 영역 메시지 처리

마우스 커서 변경

MFC는 ::SetCursor( ) API 함수를 이용하여 커서를 변경한다.

  • CWinApp::LoadStandardCursor() : 운영체제가 제공하는 목록 커서 리소스 선택
  • CWinApp::LoadCursor() : 직접 제작한 커서 리소스 선택

WM_SETCURSOR 메세지를 통해 커서의 형태를 자유롭게 바꿀 수 있는 기회가 존재한다.

 

실습 - 마우스 커서 변경하기

타원 영역에 마우스 커서가 존재하면 커서가 사용자 리소스 커서로 변경된다.

마우스 커서 변경하기

마우스 커서 위치 추적

마우스 커서가 윈도우 영역에 들어오는 시점과 나가는 시점이 필요한 경우가 발생한다.

  • WM_MOUSEMOVE 메시지 : 윈도우 영역에 들어오는 시점 알 수 있음 
  • WM_MOUSELEAVE 메시지 :  윈도우 영역에 나가는 시점 알 수 있음

실습 - 마우스 커서 위치 추적하기

마우스 커서의 위치에 따라 클라이언트영역이 바뀜

마우스 커서 위치 추적

키보드 다루기

윈도우 운영체제는 키보드와 관련된 모든 이벤트를 마우스처럼 프로그램에 메시지 형태로 전달한다.

키보드도 시스템에 한개만 있는 자원이므로 운영체제는 어느 프로그램에 키보드 메시지를 전달할지 결정한다.

키보드 메시지는 키보드 포커스를 가진 윈도우가 받는다.

  • WM_SETFOCUS 메시지 : 키보드 포커스 얻은 윈도우에 발생하는 메시지
  • WM_KILLFOCUS 메시지 : 키보드 포커스 잃은 윈도우에 발생하는 메시지

캐럿

키보드 포커스를 갖고 있음을 나타내는 흔한 형태

함수 이름 기능
CreateCaret() 비트맵을 이용하여 캐럿을 생성한다.
CreateGrayCaret() 회색 직사각형 캐럿을 생성한다.
CreateSolidCaret() 검은색 직사각형 캐럿을 생성한다.
ShowCaret() 캐럿을 보인다.
HideCaret() 캐럿을 숨긴다
GetCaretPos() 캐럿의 위치를 얻는다
SetCaretPos() 캐럿의 위치를 설정한다.

실습 - 캐럿 사용하기

키보트 포커스를 가질 때만 캐럿을 표기한다.

캐럿 사용하기

키누름 메시지

키 누름 메시지는 키보드 키를 누르거나 떼는 동작할 때 발생하는 메시지이다.

메시지 발생 시점
WM_KEYDOWN F10 , Alt 이외의 키 누를 때
WM_KEYUP F10 , Alt 이외의 키를 뗄 때
WM_SYSKEYDOWN F10, Alt, Alt + [다른키]  누를 때
WM_SYSKEYUP F10, Alt, Alt + [다른키] 뗄 때

키 누름 메시지 핸들러

Afx_msg void On*(UINT nChar, UINT nRepCnt, UINT nFlags);

  • nChar : 키에 할당된 가상 키 코드값을 가진다.
  • nRepCnt : 키를 계속 누르고 있으면 1보다 큰 값을 가질 수 있다.
  • nFlags : 키와 관련된 부가적인 정보를 담고 있다.

실습 - 키 누름 메시지 처리하기

도형을 방향키로 이동하고, Space Bar를 누르면 도형이 반전되는 기능

키누름 메시지 처리

문자 메시지

MFC는 누른 키에 해당하는 문자열을 알기 어렵다.

따라서 윈도우 운영체제는 키가 눌리면 키누름 메시지와 더블어 문자 메시지를 발생시킨다.

 

문자 메시지 핸들러

Afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);

  • nChar : 키에 해당하는 문자 코드 값을 가진다.
  • nRepCnt : 키를 계속 누르고 있으면 1보다 큰 값을 가질 수 있다.
  • nFlags : 키와 관련된 부가적인 정보를 담고 있다.

실습 - 문자 메시지 처리하기

입력한 글자를 화면에 표시하는 프로그램을 만든다. back space를 누르면 한 글자씩 지워지게 한다.

문자 메시지 처리하기

 

반응형

'Image Processing > MFC Programming' 카테고리의 다른 글

[MFC - 사용자 인터페이스]  (0) 2020.10.28
[MFC - Chapter5 연습 문제]  (1) 2020.09.22
[MFC - Chapter4 연습문제]  (1) 2020.09.14
[MFC - 화면 출력]  (0) 2020.08.18
[MFC - Chapter3 연습 문제]  (0) 2020.08.17
Comments