개요
블로그 글을 하도 안썼더니 쓰는 감각이 다 죽어버렸습니다.
아무튼 오늘 글은 저번 [WinAPI/C++] | WinAPI 기초 에 이어서 쓰는 글이고 VS에서 Windows 데스크톱 애플리케이션을 만들었을때 자동으로 들어있는 프레임 워크에 대해 알아볼겁니다.
wWinMain
일반 C++ 프로그램에 main이라는 진입점이 있다면 WinAPI에선 wWinMain 이라는 진입점이 있습니다.
차이점이라고 하면 매개변수가 4개나 달려있다는 것 정도이죠.
하나하나 살펴보자면... 먼저 hInstance는 저번 글에서 말했던 그 인스턴스를 가르키는 핸들입니다.
웬만해서 구조체가 H로 시작하면 핸들이라고 생각하면 돼요.
그리고 다음으로 들어오는 hPrevInstance는 쓸일도 없고 넘어오는 값 또한 NULL입니다.
매개변수 앞에 SAL 주석 언어로 적혀있는거 보세요. _In_opt_ 즉 Input, Optional 라는 뜻이죠.
넣어주긴 넣어주는데 Optional, 선택적으로 사용해라. 라는 뜻입니다.
물론 말이 선택적이지 NULL이라서 사용하고 싶어도 못합니다.
그리고 lpCmdLine은 CMD 창에서 실행할 시 전달할 문자열을 담습니다.
일반 main 함수로 치면 char* argv[] 같은 느낌입니다.
마지막으로 nCmdShow는 윈도우가 화면에 출력될 때의 형태를 정의합니다.
이건 나중에 윈도우 창을 만들때 같이 넘겨줍니다.
...사실 이거 다 외울 필욘 없습니다. 이미 다 친절하게 표기해줬거든요.
UNREFERENCED_PARAMETER... 뭔 매크로냐구요?
아무일도 안합니다. 그냥 친절하게 '이거 안쓰는 파라미터입니다~~~~' 라고 광고하는거라서 지워도 상관 없습니다.
그리고 바로 나오는게 LoadStringW 라는 함수입니다.
어짜피 윈도우 내부 함수라서 뜯어볼 수도 없지만 대충 szTitle, szWindowClass라는 전역 변수를 넣어준 값으로 초기화 해주는 그런 함수입니다.
그리고 중요하게 봐야할 거 하나 나옵니다.
MyRegisterClass
일단 딱 봤을때 뭔가 생성자같다는 느낌이 들죠.
WNDCLASSEXW 라는 구조체를 만들어서 이것저것 초기화 해주는 함수입니다.
이 곳에서 아이콘, 보여지는 커서, 뒷배경 색, 기타 등등을 정해줄 수 있습니다.
말 그대로 MyRegisterClass 내 클래스를 등록 하겠다는 겁니다.
InitInstance
뭐 이상한 윈도우 클래스의 등록을 마쳤으니 이제 윈도우를 만들면 되겠죠?
그건 이곳에서 해줍니다.
일단 인스턴스 핸들을 전역 변수에 저장합니다. 이건 당장은 무시해도 되는 절차에요.
그리고 HWND. H가 붙으면 뭐라구요? 핸들이죠. HandleWND. 그러니까 현재 만들어질 윈도우 창을 가르킬 핸들이란 뜻입니다.
CreateWindowW 라는 매크로에 의해서 만들어지는데 여기서 각종 파라미터가 넘어가죠.
매크로에 마우스를 올리면 파라미터 이름이 다 적혀있긴 하지만 일단 하나하나 풀...기는 귀찮으니까 사진 하나 첨부하죠.
좀 주의깊게 봐야하는 것들은 2~7 번째 파라미터 들입니다.
이거 말곤 딱히 안봐도 돼요.
아무튼 간단한 예외처리를 마치고 ShowWindow와 UpdateWindow 함수를 실행한 뒤에 끝납니다.
메시지 루프
저희가 저번 글에서 운영체제에서 메시지를 발생시킨 후 메시지 큐에 저장해놓는다고 말한 바 있죠.
그리고 그걸 가져오는게 저 GetMessage 매크로 입니다.
msg 변수의 주소를 넘겨줌으로써 매크로 내부에서 메시지를 받아서 나온다는 뜻이죠.
그리고 메시지를 받아왔다면 Translate와 Dispatch를 거칩니다.
Dispatch는 메시지를 처리하는 부분입니다.
Traslate는 다른 글에서 짤막하게 다루기로 합시다.
근데 저희가 메시지를 받아왔으면 그 메시지에 대한 행동을 저희가 직접 정해야 하지 않을까요?
만약 메모장을 만든다고 치면 사용자가 키보드 입력한 것들을 전부 읽어와서 그려줘야 하는데 말이죠.
당연하게도 메시지 처리 함수가 있고 저흰 그걸 만질 수 있죠.
메시지 처리
메시지를 처리하는 부분이 Dispatch라고 했었는데 반은 맞고 반은 틀립니다.
실제로 처리하는 부분은 WndProc 함수입니다.
일단 HWND 파라미터가 넘어오는 이유는 메시지를 보내는 주체를 알기 위해서입니다.
그리고 다음으로 오는 파라미터는 메시지, 키보드 관련 파라미터, 마우스 관련 파라미터 입니다.
그리고 함수 내부에서 switch 문을 돌려 메시지에 맞는 행동을 하도록 코드를 적습니다.
...그러고보니 WndProc을 호출하는 곳이 없지 않나요? 대체 어떻게 이 메시지들을 처리하는 걸까요?
그 비밀은 MyRegisterClass 함수 내부의 이부분에서 드러납니다.
함수 포인터로 WndProc을 넘겨주기 때문에 WndProc의 별개 호출 없이 내부에서 호출하는 것이죠.
마치는 말
블로그를 안 쓴지 조금 돼서 급하게 글 하나 써봤습니다.
언젠간 정리해야 될 것이기도 했구요.
요즘은 픽셀아트가 참 재밌습니다. 쓸 수 있을만큼의 퀄리티 업이 되길 바래봅니다.
'개발 > WinAPI' 카테고리의 다른 글
[WinAPI/C++] | WinAPI 기초 (0) | 2024.08.17 |
---|