#include <windows.h>
// 프로시저 [콜백] 함수 선언
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
LPCTSTR lpszClass=TEXT("First");
// == const char* ptr = "First"; => const char* ptr = TEXT("first");
// 운영체제가 ANSI 형식이면 상관없지만, 유니코드면 오류 발생. 반드시 TEXT 안에 글자를 넣을것.
//메인 [콜백] 함수 <- 운영체제가 메인함수에 인수 전달 // - 메인함수가 전달받는 인수 4가지
int APIENTRY WinMain(HINSTANCE hInstance, // 1.프로그램에 핸들 전달.
HINSTANCE hPrevInstance, // 2.이전 버전 윈도우에 사용했던 인수 (현재사용X)
LPSTR lpszCmdParam, // 3.콘솔창에 입력한 내용을 하나의 문자열로 인식, 인수 전달.
int nCmdShow) // 4.콘솔창을 어떤식으로 뜨게 할건지 결정.
{
HWND hWnd; // 핸들만을 저장하는 변수
MSG Message; // 메시지를 저장하는 클래스
WNDCLASS WndClass; // 윈도우클래스 구조체
g_hInst=hInstance; // 프로그램 식별번호 Instance
/*************선언해둔 윈도우클래스 구조체 설정 == 메인 윈도우 디자인 결정.****************/
WndClass.cbClsExtra=0; // 여분 메모리를 사용하기 위함.
WndClass.cbWndExtra=0; //
WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); // 배경색 지정
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW); // 마우스 커서
WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION); // 윈도우 아이콘
WndClass.hInstance=hInstance; // 해당 디자인을 사용할 윈도우의 식별번호 지정.
WndClass.lpfnWndProc=WndProc; /**중요** 윈도우 프로시저 함수 포인터 ******/
// 메시지를 처리할 함수(프로시저)가 누구인지 지정
WndClass.lpszClassName=lpszClass; // **중요** 클래스 이름 지정 :: lpszClass; == " First "********/
WndClass.lpszMenuName=NULL; // 메뉴 설정 :: NULL == 없음.
WndClass.style=CS_HREDRAW | CS_VREDRAW; // 가로(Horizon). 세로(Vertical) 길이 변경시 다시 그림(ReDraw)
RegisterClass(&WndClass); // 디자인 설정을 완료한 후 스타일 등록.
/****************************** 디자인 설정 종료 ****************************************/
// 등록한 스타일로 윈도우(창) 생성
hWnd=CreateWindow (
lpszClass, // 클래스 이름.
lpszClass, // 제목 표시줄 내용.
WS_OVERLAPPEDWINDOW, // 제목표시줄 - (최소,최대화, 닫기 아이콘), 시스템 메뉴 만들기
CW_USEDEFAULT, // 좌상 점 좌표.
CW_USEDEFAULT, // 우하 점 좌표.
CW_USEDEFAULT, // 가로 크기.
CW_USEDEFAULT, // 세로 크기.
NULL, // 생성 윈도우의 부모 윈도우 핸들. // NULL == 바탕화면이 부모
(HMENU)NULL, // 메뉴의 핸들
hInstance, // 현재의 핸들
NULL ); // 왠만하면 NULL . . . . . ;;;;;;
ShowWindow(hWnd,nCmdShow); // hWnd 핸들에 저장된 설정대로 윈도우 창 출력.
//SW_HIDE : 숨김 / ShowWindow(hWnd,SW_HIDE); 프로세스는 실행되나, 창은 뜨지않음.
while (GetMessage(&Message,NULL,0,0)) { //GetMessage : 메시지 큐에서 큐 하나를 가져 옴
TranslateMessage(&Message); // 키입력 메시지만 받음.
DispatchMessage(&Message); // 키보드 이외의 입력(마우스)에 반응. 메시지를 받아서 프로시저 콜백함수에 전달. 프로시저에서 리턴해주기까지 대기.
}
return (int)Message.wParam;
}
// 프로시저 [콜백] 함수 정의
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
switch (iMessage) {
case WM_DESTROY:
PostQuitMessage(0); // Quit 메시지 전달.
return 0;
}
// **중요** 기본작업(창 크기 설정, 창 이동 등등) 에 해당되는 메시지 처리. *****
// DefWindowProc 가 0이되면 아무것도 뜨지 않음.
return (DefWindowProc(hWnd,iMessage,wParam,lParam));
}