180 likes | 303 Views
Windows Programming 제대로 배우기. Chapter 8. Mouse Event Details. 학습 목표. 마우스를 이용한 다양한 이벤트 처리기법 학습. Mouse 의 위치 정보. lParam - 마우스가 눌려졌을 경우에 어느 부분이 눌려졌다는 정보를 기록하는 변수 32 비트 LONG 형 마우스 정보를 입력하여 정보를 알려주게 됨 상위 16 비트 : Y 좌표 하위 16 비트 : X 좌표 LOWORD, HIWORD 32 비트를 16 비트로 나누어주는 함수
E N D
Windows Programming제대로 배우기 Chapter 8. Mouse Event Details
학습 목표 마우스를 이용한 다양한 이벤트 처리기법 학습
Mouse의 위치 정보 lParam - 마우스가 눌려졌을 경우에 어느 부분이 눌려졌다는 정보를 기록하는 변수 • 32비트 LONG형 • 마우스 정보를 입력하여 정보를 알려주게 됨 • 상위 16비트 : Y 좌표 • 하위 16비트 : X 좌표 LOWORD, HIWORD • 32비트를 16비트로 나누어주는 함수 int y=HIWORD(lParam) int x=LOWORD(lParam)
POINT p; case WM_RBUTTONDOWN: p.x=LOWORD(lParam); p.y=HIWORD(lParam); // Do something with POINT p …. break;
예제 : MousePoint • 왼쪽 마우스가 눌리는 위치에 적당한 크기의 원을 그림 • 마우스 위치가 다른 곳에 눌리면 원은 다른 위치에 출력 • 힌트 : 마우스가 눌리는 Point를 기준으로 상,하,좌,우 반경의 원을 만들어 출력
// 필요 데이터 설정 : 원이 그려질 영역과 색 지정 // 윈도우 영역의 가운데 점을 얻음 // 위의 점을 얻은 후 그 위치에 따라 반경 50의 원 영역 만들기 // 마우스가 눌려진 위치를 얻음 // 마우스 위치에 따라 반경 50 Pixel로 m_Rect를 변경 // Paint 메시지 호출
예제 : MousePoint2 • 앞의 예제에 추가적으로 다음을 구현 • 마우스 오른쪽 버튼이 원의 내부에 클릭되면 원의 색을 다른색으로 바꿈 • 힌트 : 특정 영역 내에 마우스 Point가 클릭되었는 가에 대한 검사는 PtInRect(CONST RECT *lprc, POINT pt); 함수 사용
// 필요 데이터 설정 : 원의 색을 2가지로 해야 하기 때문 // 두 가지 색 중 어떤 색을 사용할 것인지를 결정하는 flag // 두 가지 색 초기화 // 변경될 색 변수 // 마우스 오른쪽 버튼에 대한 메시지를 처리 // 마우스 포인트를 p에 얻어온 뒤, 다음과 같이 그 Point가 // 영역 m_Rect내부에 클릭되었는 지 검사하여 // Flag를 toggle시킨 후 Paint메세지 호출
예제 : Catch Me • 적당한 간격으로 임의의 위치를 발생시켜 원을 나타내는 프로그램 작성 • 이때 원의 내부를 마우스로 클릭하면, HitCount를 증가하고, 화면에 Count를 표시함 • 2.5초 간격으로 원의 움지임을 점점 빠르게 하고, 1분 30초 뒤에 프로그램을 종료 • 종료시까지의 Count를 메시지 박스로 출력하여 표시
힌트 : (1) Rand함수 사용 • rand()함수를 2번 사용하여 x와 y위치를 각각 만듬 (2) MessageBox함수 사용
MessageBox() • 프로그램 실행 중 간단한 사용자 입력이 필요한 경우 주로 MessageBox를 띄워서 사용자에게 Yes, No, OK, Cancel 등을 물음 • 메시지 박스는 메시지와 타이틀, 조합하여 사용할 수 있는 미리 정의된 Icon과 Button을 포함하는 간단한 사용자 입력 다이얼로그 제공함 • int MessageBox( HWND hWnd, // handle of owner window LPCTSTR lpText, // address of text in message box LPCTSTR lpCaption, // address of title of message box UINT uType); // style of message box
// 윈도우 전체 영역을 보관할 변수 // 만들어질 원과 관련된 정보 : 원을 그리게 될 영역, 색, Hit 된 카운드 변수 // 원의 발생 속도를 점점 빠르게 할 때 사용되는 변수 // 화면에 마우스 위치를 표시하기 위한 스트링 변수 // 윈도우 영역 Bound의 가운데 중심점 얻기 // 위의 중심점으로 반경 50의 원 영역 초기화 // 칼라, 카운트 초기화 // 마우스 위치 출력 // 3개의 타이머 설정 // 타이머 1 : m_nSpeed의 주기로 셋팅 // 타이머 2 : 2.5초 (1번 타이머의 주기를 바꾸기 위한 타이머) // 타이머 3 : 1분 30초
// 원의 위치 랜덤 생성 // 2번 타이머 - 2.5초 간격으로, 1번 타이머의 // 주기를 점점 빠르게 만든다 // 3번 타이머 – 1분 30초 후에 //메시지 박스 띄우고 종료 준비
1번 타이머 WM_PAINT DATA m_Rect m_Color m_szPos Data를 출력한다 Data를 변경하고 WM_TIMER