코드 4-11에서 마우스 이벤트를 처리하는 on_mouse() 함수에 대해 자세히 알아보겠습니다. on_mouse() 함수에서는 switch ~ case 구문을 이용하여 다양한 마우스 이벤트를 처리합니다. 사용자가 마우스 왼쪽 버튼을 누르면 “EVENT_LBUTTONDOWN: ” 문자열과 마우스 버튼이 눌린 좌표를 출력합니다. 눌렸던 왼쪽 마우스 버튼을 떼는 경우에는 “EVENT_LBUTTONUP: ” 문자열과 해당 마우스 좌표를 출력합니다. 코드 4-11의 39~44행은 마우스가 움직이는 MOUSE_MOVE 이벤트 처리 구문입니다. 이때 flags 인자에 EVENT_FLAG_LBUTTON 상태가 설정되어 있으면 line() 함수를 이용하여 img 영상에 노란색 마우스 궤적을 그립니다. flags 인자에서 EVENT_FLAG_LBUTTON 비트가 설정되어 있는지를 확인하기 위해 & 연산자를 사용하였습니다. 41~43행 코드는 사용자가 마우스 왼쪽 버튼을 누른 상태에서 마우스를 움직일 때 실행되는 코드 블록입니다.
코드 4-11의 mouse 예제 프로그램을 실행하여 마우스 이벤트를 처리한 결과 화면을 그림 4-8에 나타냈습니다. 레나 영상이 나타난 img 창에 마우스로 그린 노란색으로 선이 나타난 것을 볼 수 있고, 배경의 콘솔 창에는 마우스 왼쪽 버튼이 눌린 좌표와 뗀 좌표가 출력된 것을 확인할 수 있습니다. 영상 출력 창 위에서 두 번 마우스를 클릭하여 그림을 그렸기 때문에 콘솔 창에 EVENT_LBUTTONDOWN과 EVENT_LBUTTONUP 좌표가 각각 두 번 출력되었습니다.
▲ 그림 4-8 마우스 이벤트 처리 예제 실행 화면