728x90
'나우캠퍼스X아워즈팜'유튜브의 'Win32 API 2강. Win32 API 프로그래밍 구조 (1/5)'영상을 보고 정리한 내용입니다.
Win32 프로그램 구조
c, c++의 메인은 main() 하나이지만 Win32는 2개이다. 바로 WinMain(), WinProc()이다. c나 c++은 모든 것을 프로그래머가 해야하지만 Win32는 os의 부분과 프로그래머의 부분으로 나눈 것이다.
c나 c++은 논리적이고 전체적인 프로그램의 이해가 필요하지만 Win32는 실제적인 프로그램들이나 os와 연계되어서 하는 프로그램의 이해가 필요하다고 할 수 있다.
WinMain()
- 윈도우의 구조체, 즉 화면의 형태와 설정을 등록하고 그것을 바탕으로 윈도우 프로그램을 생성하고 출력한 후 계속 메시지 루프를 돌면서 메시지를 처리한다. 그리고 진입점이 종료되면 프로그램이 종료된다.(프로그램 종료 메시지가 있을 때까지 계속 반복문들 돌고 있음)
- 윈도우의 화면을 구조체로 등록하는데 그 이유는 각각의 변수들을 구조체 하나에 등록을 해두고 그 구조체 하나만 넘겨서 사용할 수 있도록 하기 위해서이다.(윈도우 구조체를 쓰지 않는다면 구조체의 모든 멤버들이 함수의 매개변수로 가야하기 때문에 구조체 사용. 여러개의 변수를 초기화해야할 때 -> 구조체를 생각해보기)
- 메시지 큐?
- 메모리의 일정 영역을 메시지를 담아놓는 곳으로 쓰기로 함. 그런 공간을 메시지 큐라고 함. 메시지 큐는 메모리에 있고 메모리는 os가 관리함.
- 메시지 루프
- 응용프로그램에서는 메시지 루프, 즉 반복문을 통해 메시지가 있는지 메시지 큐에서 조사를 한다.
- 메시지 체크를 하고 메시지가 있다면 전달
WinProc()
- 메시지에 대한 처리를 한다.
- 메시지의 모습 일부?
- WM_xxx, CB_xxx, LM_xxx, PBM_xxx 등등
- 윈도우에서 발생되는 기본이 되는 메시지는 WM_xxx('WM_'으로 시작. Window Message)
- 메시지는 모두 양의 정수 값!
- switch문으로 message값에 따라서 코드를 처리하도록 한다. switch문의 조건에 해당하는 값이 없다면 DefWndProc()을 처리한다. 처리하지 않은 가장 기본적인 처리를 하는 함수이다.
메시지 루프와 WndProc()
- 메시지 전달 -> 메시지 루프에서
- 메시지 처리 -> WndProc()에서
- 아래는 WinMain() 안의 메시지 루프이다.
while(GetMessage(&msg, NULL, 0, 0)) //GetMessage()를 통해 메시지를 가져옴
{
TranslateMessage(&msg); //키보드 입력과 관련된.. 어떤 키를 눌렀는지 정보를 발생시켜줌
DispatchMessage(&msg); //메시지를 WndProc()에 넘겨주고 WndProc()에서 메시지 처리를 끝내고 처리값을 줄 때까지 대기한다.
}
- GetMessage()함수는 응용프로그램에 해당하는 메시지가 있는지 os를 통해(?) 메시지큐를 검사한다. 없으면 대기하고, 있으면 메시지를 가져오며 while문 안의 처리를 한다.
- WinProc()이 DispatchMessage()함수에 의해 호출이 되며 GetMessage()에서 가져온 메시지를 DispatchMessage() 함수를 통해 WndProc()함수로 넘겨준다. DispatchMessage() 함수는 WndProc()함수에서 그 메시지의 처리를 끝낼 때까지 대기하고 있다가 WndProc()함수가 메시지 처리를 완료한 후 값을 넘겨주면 while문을 실행하며, 다시 GetMessage()함수에서 메시지를 받는다. 그렇게 반복한다.
- 만약 키 입력이 있다면 TranslateMessage()에서 어떤 키를 눌렀는지에 관해서 정보를 발생시켜주고, 그 메시지도 DispatchMessage()함수에 넘어간다.
- WndProc()함수는 CallBack함수라고 한다. 왜냐하면 DispatchMessage()함수에 의해서 호출되기 때문이다.
혹시 제가 잘못 이해한 부분이(잘못된 정보) 있다면 알려주시면 감사하겠습니다. :)
'무작정 따라해보기(정리, 문제풀기) > Win32API' 카테고리의 다른 글
6. Win32 API 프로그래밍 (0) | 2021.08.09 |
---|---|
5. Win32 API 프로그래밍 (0) | 2021.08.04 |
3. Win32 API 프로그래밍 (0) | 2021.07.30 |
2. Win32 API 프로그래밍 (0) | 2021.07.29 |
1. Win32 API 프로그래밍 (0) | 2021.07.27 |