WinMain
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
모든 API 프로그램을 만들기 전에 작성하는 가장 기본적인 코드이다.
#include <Windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE g_hInst;
HWND hWndMain;
LPCTSTR IpszClass=TEXT("Class");
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR IpszCmdParam, int nCmdShow)
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst = hInstance;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)GetStockObject(COLOR_WINDOW+1);
WndClass.hCursor=LoadCursor(NULL, IDC_ARROW);
WndClass.hIcon=LoadIcon(NULL, IDI_APPLICATION);
WndClass.hInstance=hInstance;
WndClass.lpfnWndProc=WndProc;
WndClass.lpszClassName=IpszClass;
WndClass.lpszMenuName=NULL;
WndClass.style=CS_HREDRAW | CS_VREDRAW;
RegisterClass(&WndClass);
hWnd=CreateWindow(IpszClass, IpszClass, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, (HMENU)NULL, hInstance, NULL);
ShowWindow(hWnd, SW_RESTORE); // nCmdShow
while (GetMessage(&Message, NULL, 0, 0)) {
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return (int)Message.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
switch(iMessage) {
case WM_CREATE:
hWndMain=hWnd;
return 0;
case WM_PAINT:
hdc=BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
WinMain의 분석
windows.h 헤더 파일은 기본적인 데이터 타입, 함수 원형, 매크로 상수 등을 정의
그 외 윈도우즈 프로그래밍에 필요한 보조 헤더 파일을 포함한다.
모든 도스 프로그램이 #include <stdio.h>를 포함하는 것과 같이 윈도우즈 프로그램은 windows.h를 포함한다.
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR IpszCmdParam, int nCmdShow)
WinMain의 원형은 다음과 같이 고정되어 있다.
APIENTRY 지정자: 윈도우즈의 표준 호출 규약인 __stdCall을 사용한다는 뜻
인스턴스(Instance): 실행 중인 프로그램 하나를 칭하는 용어
hInstance: 프로그램의 인스턴스 핸들. 즉, 프로그램 자체를 일컫는 정수값. 프로그램 자기 자신을 가리키는 1인칭 대명사.
hPrevInstance: 바로 앞에 실행된 현재 프로그램의 인스턴스 핸들. Win32에서는 항상 NULL. 16비트와의 호환성을 위해 아직도 존재하고 있는 유물과 같은 인수
IpszCmdParam: 명령행으로 입력된 프로그램 인수(도스의 argv인수). 보통 실행 직후에 열 파일의 경로가 전달된다.
nCmdShow: 프로그램이 실행될 형태(최소화, 보통 모양 등)
hInstance 이외에는 잘 사용되지 않는다.
많은 API 함수들이 hInstance 값을 인수로 요구하기 때문에 WinMain의 인수로 전달된 hInstance값을 전역변수 g_hInst에 대입해둔다.
hInstance 인수는 지역변수이므로 WinMain 바깥에서는 사용할 수 없다.
IpszClass라는 전역 문자열은 윈도우 클래스를 정의하는데 사용하며 윈도우의 타이틀 바에 표시되기도 한다.
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
메세지 처리함수
정의된 두 개의 함수 WinMain, WndProc 중 메세지를 처리하는 함수는 WndProc이다.
WinMain은 프로그램을 초기화하고 시작시키는 함수이므로 코드가 대체로 일정하다.
WndProc은 사용자와 시스템이 보내오는 메세지를 처리하는 아주 중요한 일을 담당한다. 즉, 프로그램의 실질적이고도 고유한 처리를 하는 함수다.
윈도우즈에서는 아주 특별한 경우를 제외하고는 위의 두 함수가 모두 있어야 한다.
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
CALLBACK 매크로: APIENTRY와 마찬가지로 __stdcall로 정의되어 있다.