윈도우 프로그램은 메인함수와 메시지 처리 함수로 나뉘어진다. 메인함수의 이름은 보통의 프로그램 main이 아니라
WINAPI라고 명시하고 WinMain으로 만들어준다.
메시지 처리 함수는 CALLBACK WndProc으로 만들어 준다.
윈도우에서의 메시지 처리
1 키보드, 마우스 등에 의해 이벤트가 발생한다.
2 발생한 이벤트를 윈도우 시스템이 감지한다.
3 이벤트 발생을 알린다. 이벤트 발생을 알리는 방식 중 정숫값인 메시지를 보내는 방식을 택한다. 보내온 메시지가 메시 지 큐에 차례로 쌓인다.
4 WinMain() 함수는 메시지 큐에서 맨 앞에 대기 중인 메시지를 꺼낸다.
5 꺼낸 메시지를 해석해 메시지 처리 함수에 보낸다. GetMessage() 함수가 메시지 큐에서 메시지를 꺼낸다.
꺼낸 메시지는 msg 변수에 저장하고 TranslateMessage() 함수로 변형한다. TranslateMessage() 함수는 두 메시지를 하나로 변형할 때 이용한다.
6 메시지 처리 함수가 WndProc()라면 WndProc() 함수는 메시지를 받아서 반응을 보인다.반응은 주로 화면 출력으로 나타난다.
#include <windows.h>
#include <TCHAR.H>
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM iParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR IpszCmdLine, int nCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASS WndClass;
WndClass.style = CS_HREDRAW || CS_VREDRAW;
WndClass.lpfnWndProc = WndProc;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hInstance = hInstance;
WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
WndClass.lpszMenuName = NULL;
WndClass.lpszClassName = _T("Window Class Name");
RegisterClass(&WndClass);
hwnd = CreateWindow(_T("Window Class Name"),
_T("Window Title Name"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL
);
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM IParam)
{
switch (iMsg)
{
case WM_CREATE:
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hwnd, iMsg, wParam, IParam);
}
코드를 입력하고 실행하면 이렇게 윈도우 화면이 뜬다.
출처 : 핵심 API로 배우는 윈도우 프로그래밍
강경우 지음 출판사 : 한빛아카데미
'GAME > 핵심 API로 배우는 윈도우 프로그래밍' 카테고리의 다른 글
실습 2-2 (0) | 2021.09.08 |
---|---|
실습 1-2 (0) | 2021.09.08 |