일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 딥러닝 스터디
- c++
- object detection
- pytorch
- 딥러닝 공부
- 컴퓨터 비전
- 골빈해커
- 팀프로젝트
- 미디언 필터링
- 모두의 딥러닝 예제
- 파이토치 김성훈 교수님 강의 정리
- c언어
- 딥러닝
- c++공부
- 김성훈 교수님 PyTorch
- 파이토치
- 케라스 정리
- Pytorch Lecture
- C언어 공부
- 모두의 딥러닝
- tensorflow 예제
- 파이토치 강의 정리
- matlab 영상처리
- 영상처리
- TensorFlow
- c언어 정리
- 가우시안 필터링
- 해리스 코너 검출
- MFC 프로그래밍
- pytorch zero to all
- Today
- Total
ComputerVision Jack
[MFC - 마우스와 키보드] 본문
마우스 다루기
마우스는 시스템에 한 개만 있는 자원이므로 한순간에 한 개의 프로그램만 입력을 받을 수 있다.
윈도우 운영체제는 마우스 메시지가 발생했을 때, 어느 프로그램에 이 메세지를 전달할지 결정해야한다.
마우스 메세지는 마우스 커서 밑에 있는 윈도우가 받는다.
클라이언트 영역 마우스 메시지
메시지 | 발생 시점 |
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 |