Windows 창에서 키보드의 입력을 받고 화면에 그리는 작업을 해볼 것이다.
윈도우즈에서 특정 장치에 접근하기 위해 애플리케이션은 GDI(Graphics Device Interface)에게 적절한 디바이스 드라이버를 로드하고, 그리기 위한 장치를 준비해야한다고 알려준다.
이 과정은 디바이스컨텍스트(DC, Device Context)를 만들어서 수행한다.
DC는 Graphics객체와 속성을 정의하는 구조체이다.
윈도우즈 운영체제는 윈도우를 만들 때, DC를 만들어서 화면에 그린다.
그렇다면 키보드의 입력을 받아 윈도우 창에 입력받은 문자를 그리는 프로그램을 작성해 볼 것이다.
전에 포스팅했던 창 만들기 프로그램에서 다른 부분을 위주로 설명한다.
전역 변수와, 상수 부분이다.
(전역변수, 상수)
WinMain 함수이다.
(WinMain 함수)
동작은 창 만들기 프로그램과 같다.
다만 이제 이벤트 콜백 함수부분이 달라진다.
(추가된 부분)
바로 전에는 WM_DESTROY 메시지만 우리가 처리하였다. (종료되는 메시지)
이제 키보드의 입력을 받을 때인 WM_CHAR 메시지에 대한 처리를 추가해주면 된다.
(키보드 입력)
문자가 아닌 부분의 경우 비프음을 내고, 아무 동작을 하지 않게 끝난다.
하지만 표시할 수 있는 문자의 경우 ch 변수에 문자를 가져온다.
여기서 InvalidateRect 함수가 나오는데, 이는 윈도우즈 프로그램의 특징을 이해해야한다.
WM_PAINT 메시지를 발생시키기 위한 것인데, WM_PAINT 메시지는 flag 타입의 메시지이다. 메시지큐에 들어가서 처리되는 것이 아니라 해당 flag를 표시한다.
그리고 프로그램은 메시지큐를 처리한 후 해당 flag를 확인하고 표시 되어있으면
WM_PAINT를 처리한다.
WM_PAINT는 화면을 다시 그려주라는 메시지이다.
그래서 InvalidateRect 함수를 통해 WM_PAINT flag를 on 해준다.
그렇게 되면 메시지큐가 다 처리된 후 해당 비트를 확인하여 WM_PAINT를 처리할 때 아래와 같이 처리하도록 처리한다.
(WM_PAINT)
DC 핸들을 가져온다.
hdc에 가져오는 것이다.
그리고 윈도우 창에 사각형을 가져온다.
이제 TextOut을 통해 hdc를 가지고 화면에 그려준다.
다음은 CreateMainWindow 함수인데, 이전 창 만들기의 부분과 같다.
(CreateMainWindow)
등록까지 마쳤으면
윈도우를 생성하고 화면에 표시하는 부분이다.
(창 생성)
컴파일 후 실행해본다.
(실행)
해당 화면은 D 라는 키보드를 입력했을 때의 모습이다.
잘 동작한다.
그렇다면 키를 누르고 있는 것은 어떻게 인식시켜야할까?
바로 윈도우 메시지 중 WM_KEYDOWN, WM_KEYUP을 처리해주면 된다.
키보드를 눌렀을 때 현재 눌린 것을 T로 표시, 그렇지 않은 것을 F로 표시하는 프로그램을 작성해본다.
번저 키 입력에 대한 배열을 만들어준다.
(키 배열)
main함수에서 처음에 초기화 과정을 거친다.
(초기화)
WM_CREATE 부분이다.
(WM_CREATE)
WM_CREATE는 창이 생성될 때 발생하는 메시지로
창이 생성될 때, 화면에 배열을 그려주는 역할을 한다.
그 다음 키가 눌릴 때이다.
(키가 눌릴 때)
위 사진은 키가 눌렸을 때의 처리이다.
아래 스위치는 shift 키와 control 키를 누르는 것에 대한 처리이다.
아래 if문은 왼쪽과 오른쪽 shift 키를 구분하기 위한것이다.
(키 땔때)
키를 땔때의 메시지 처리는 해당 키 배열값을 false로 만들어준다.
WM_PAINT 메시지 처리 중 다른점은 배열 출력이다.
(WM_PAINT)
기존에는 해당 문자를 출력하는 것이었지만
이젠 배열에서 눌렸으면 T를 안눌렸으면 F를 출력하는 것으로 다르다.
(*참조 - 2D 게임 프로그래밍, 찰스 켈리)