#1 . 단순한 윈도우 생성.
기초가되는 윈도우창을 생성.
#include<windows.h>
// WINAPI : 09년 2월 10일
/* WndClass 정의 -> 클레스 등록- > 메모리상의 윈도우 생성 -> 윈도우 화면에 표시 -> 사용자로부터의 메시지 처리. */
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hlnst; //인스턴스 핸들형 g_hlst 선언.
LPCTSTR lpszClass=TEXT("first"); //LPCTSTR -> const char* 형태 .
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpszCmdLine, int nCmdshow)
{
/*hInstance : 프로그램의 인스턴스 핸들, hPrevInstance : 앞에서 실행된 현재프로그램의 인스턴스 핸들*/
/*lpszCmdLine : 명령행,입력된 프로그램의 인수. 도스의 argv, 보통 실행직후에 열 파일의 경로. */
/*nCmdshow : 프로그램이 실행될 형태, 최소화,보통모양등*/
HWND hWnd; // 윈도으 핸들을 생성.
MSG Message; // MSG구조체인 Message생성.
WNDCLASS WndClass; // 윈도우 클래스 생성.
g_hlnst=hInstance; //
WndClass.cbClsExtra = 0; //예약 영역, 내부적으로 사용하며 아주 특수한 목적에 사용되는 여분의 공간.
WndClass.cbWndExtra = 0; //사용하지 않을시에는 0으로 지정
WndClass.hbrBackground = CreateSolidBrush(RGB(0,0,255)); // RGB색상으로 배경을 칠함.
// (HBRUSH)GetStockObject(LTGRAY_BRUSH); //LTGRAY_brush(회색)로 배경을 칠함. (기본)
// (HBRUSH)GetStockObject(BLACK_BRUSH); //black_brush(검정색)로 배경을 칠함.(기본)
// (HBRUSH)GetStockObject(WHITE_BRUSH); //white_brush(백색)로 배경을 칠함. (기본)
// 기본 브러쉬는 위의 3개임. <- 10/02/09
WndClass.hCursor = LoadCursor(NULL,IDC_ARROW); // 윈도우 기본제공하는 커서
WndClass.hIcon = LoadIcon(NULL,IDI_APPLICATION); // 기본제공하는 아이콘
WndClass.hInstance = hInstance; // 윈도 클래스를 등록하는 프로그램의번호.
WndClass.lpfnWndProc = WndProc; // 윈도우의 메시지 처리함수 지정.
// 메세지 발생시 이 멤버가 지정하는 함수가 호출됨
WndClass.lpszClassName = lpszClass; // 클레스 이름을 저장한 lpszClass값을 대입.
WndClass.lpszMenuName = NULL; // 메뉴
WndClass.style = CS_HREDRAW|CS_VREDRAW; // 윈도우의 스타일 ,CS_HREDRAW : 수평크기가 달라지면 다시 그림
// CS_VREDRAW :수직의 크기가 달라지면 다시 그려줌.
RegisterClass(&WndClass); //WndClass를 등록함(번지를 통해서 ).
hWnd=CreateWindow(
lpszClass, // lpszClassName : 클래스 이름
lpszClass, // lpszWindowName : 윈도우 이름, 타이틀바에 나타날 문자열.
WS_OVERLAPPEDWINDOW, // dwStyle : 윈도우의 형태를 지정하는 인수.
// WS_OVERLAPPEDWINDOW스타일을 사용시 무난함.
CW_USEDEFAULT, // X : X축 시작위치.
CW_USEDEFAULT, // Y : Y축 시작위치.
CW_USEDEFAULT, // nWidth : 폭의 크기.
CW_USEDEFAULT, // nHeight : 높이의 크기.
NULL, // hWndParent : 부모윈도가 있을경우 부모윈도의 핸들 최상위의 경우 NULL
(HMENU)NULL, // hmenu : 윈도우에서 사용할 핸들을 지정.
hInstance, // hinst : 윈도우를 만드는주체, 핸들을 지정. 프로그램 종료시
// 파괴되지 않은 윈도우를 자동으로 파괴.
NULL // lpvParam : 여러 개의 윈도우를 만들 때 각 윈도우에 고유의 파라미터를 전달. 특수목적.
);
ShowWindow(hWnd,nCmdshow); // 윈도우의 핸들을(hWnd)가지고 화면 출력하는 방법을 지정.
while(GetMessage(&Message,NULL,0,0)) // 메시지큐에서 메시지를 읽어옴. WM_QUIT일경우 FALSE출력. 그외의 경우 TRUE
{
TranslateMessage(&Message); // 키보드의 입력을 가공하여 프로그램에 쓸수 있도록 한다.
// ex) A를 누르면 A문자가 입력되었다는 메시지를 만들어냄.
DispatchMessage(&Message); // 메시지 큐에서 꺼낸 메시지를 윈도우의 메시지 처리함수 (WndProc)로 전달.
// 그후 다시 루프의 선두로 돌아가 다음 메시지를 기다린다.
}
return (int)Message.wParam; // WM_QUIT 메시지로부터 전달된 탈출코드. 운영체제로 리턴된다.
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage ,WPARAM wParam,LPARAM lParam)
// hWnd : 메세지 받는 윈도우 핸들, iMessage :어떤 종류의 메시지인가, WPRAM,LPARAM :부가적인 정보를 가진다.
// 메시지 발생시 프로그램의 반응을 처리하는 일을 함. 운영체제에 의해 호출됨.
// 이렇게 운영체제에 의해 호출되는 응용 프로그램 내의 함수를 callback함수라고 한다.
{
switch(iMessage)
{
case WM_DESTROY:
PostQuitMessage(0); //창을 단으려하거나 alt+f4의 경우 WM_QUIT 메시지를 생성.
return 0;
}
return DefWindowProc(hWnd,iMessage,wParam,lParam); //default
}