2011년9월2일_winAPI_WndProc()에서 switch문으로 메시지를 구분하여 처리하지 않고 메시지맵(Message Map)을 사용해 해당 메시지에 대한 기능을 수행하고 각 기능별 함수들을 따로 모아 분할 컴파일(빌드)
오늘 날짜 0902_file_div프로젝트관련 파일들의 구조는 아래와 같고,
프로젝트명과 같은 0902_file_div.cpp에 main함수인 WinMain()가 있다.
MsgProc.cpp 파일에는 메시지처리함수들이 모여 있고,
MsgProc.h 파일에는 메시지처리함수들의 원형이 있다.
● 0902_file_div.cpp
● MsgProc.h
● MsgProc.cpp
● 메시지맵
WndProc에서 인자로 받은 iMessage와 같은 자료형에 같은 이름을 가진 멤버변수와,
반환값이 LRESULT이고 인자가 HWND형, WPARAM형, LPARAM형인 함수포인터 멤버변수가 있다.
함수포인터를 만드는 법은 MsgProc.cpp에서 설명하겠다.
WndProc()내부에서,
MessageMaps라는 이름의 MESSAGEMAP 자료형으로 구조체배열을 선언하고 바로 초기화한다.
메시지는 자주 발생하니 구조체배열을 메시지가 발생할 때마다 초기화할 필요는 없다.
어짜피 각 메시지별 기능은 동일할테니 말이다.
MessageMaps[0] 부터 [5]까지 메시지와 함수의 주소를 넣었으니 메시지를 검사하여 호출하는 일만 남았다.
0번 인덱스 부터 5번 인덱스까지(메시지맵 전체의 크기에서 각 원소의 크기를 나눈 값 = 원소의 갯수) 반복하여,
메시지맵에 담긴 메시지값과 WndProc() 호출시 받은 메시지 인자(iMessage)의 값을 비교하여 일치하면,
해당메시지의 기능을 수행하는 함수를 호출한다.
이 때 WndProc() 호출시 받은 hWnd(윈도우 핸들), wParam, lParam을 인자로 건네준다.
왼쪽 마우스버튼을 눌렀을 때,
”클릭”이라는 문자열을 윈도우에 표시하고 커서를 이동시킨다.
OnPaint()는 WM_PAINT메시지가 발생되었을 때 호출되는 함수로 윈도우가 지워지거나 변경되는 등 변화가 일어나면,
윈도우에 그려진 문자, 그림, 사진등등을 다시 그리는 일을 수행해야 한다.
여기서는 아무 일도 하지 않는다.
<빌드>
Rebuild All을 수행하니 프로젝트내의 모든 소스파일들이 재컴파일 & 링크되었다.
헤더파일은 소스파일이 아니니 포함이 되지 않고 참조만 할 뿐이다.
이렇게 파일을 나누고 switch문 대신 메시지맵 구조체배열을 사용하니 소스코드가 더 간결해 보인다.
파일을 분할하면 여럿이 작업할 수 있으니 꼭 분할컴파일은 알아둬야 할 것이다.
<실행결과>
아쉽게도 OnPaint()에서 윈도우를 다시 그려주지 않으니 사이즈를 변경하거나 가리면 다시 그려주지 않는다.
'내장형하드웨어 > 일일보고서' 카테고리의 다른 글
2011년9월5일_winAPI_리소스, 메뉴만들기 예제 (0) | 2011.09.05 |
---|---|
2011년9월2일_ARM_AT91SAM7S256 DBGU(디버그유닛)으로 ARM↔PC간 시리얼통신하기 위해 DBGU초기화와 1Byte송신/수신 함수들을 만들자. (0) | 2011.09.02 |
2011년9월1일_ARM_외부핀(PIOA)로 인터럽트를 받기. 확인은 LED (0) | 2011.09.02 |
2011년8월31일_winAPI_두 개의 타이머, 백그라운드 작업, 콜백함수(CALLBACK) (0) | 2011.09.01 |
2011년8월31일_ARM_AT91SAM7S256 MCU의 인터럽트벡터테이블(예외처리테이블)과 내부 인터럽트 발생원의 입력단 블록다이어그램 (0) | 2011.09.01 |