본문 바로가기

Language/API

윈도우 생성

#include<windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
LPCTSTR lpszClass = TEXT("First");
//////////////////////////////////////////////////////////////////////////
//HINSTANCE hInstance : 프로그램의 인스턴스 핸들                        //
//HINSTANCE hPrevInstance : win32에서는 항상 NULL 16bit와 호환성을 위해 //
//                            존재                                        //
//LPSTR lpszCmdParam : 명령행으로 입력된 프로그램 인수, 도스의 argv에   //
//                        해당하며 실행 직후에 열 파일의 경로가 전달된다. //
//int nCmdShow : 프로그램이 실행될 형태, 최소화, 보통 모양등이 전달     //
//////////////////////////////////////////////////////////////////////////

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpszCmdParam, int nCmdShow)
{
    HWND hWnd;
    MSG Message;
    WNDCLASS WndClass;
    g_hInst = hInstance;//인스턴스를 g_hInst 에 대입. 기억 부류가 지역변수이며 WinMain에서만 사용가능.
//////////////////////////////////////////////////////////////////////////
//윈도우를 만드는 과정.
    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;//윈도우 클래스의 이름을 문자열로 정의.
    WndClass.lpszMenuName = NULL;//사용할 매뉴를 지정 링크를 걸때 합쳐진다.
    WndClass.style = CS_HREDRAW | CS_VREDRAW;//윈도우 스타일을 지정.
//////////////////////////////////////////////////////////////////////////
//윈도우 등록
    RegisterClass(&WndClass);//윈도우를 등록하는 과정.
//////////////////////////////////////////////////////////////////////////
//윈도우 생성과정.
    hWnd = CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,(HMENU)NULL,hInstance,NULL);
    //생성하고자 하는 윈도우 클래스를 지정하는 문자, 타이틀바 문자,윈도우 형태(현 기본),화면에 표시될 좌표x,y,크기w,h,MDI시 부모윈도우핸들,매뉴핸들,프로그램의 핸들,
    //CREATESTRUCT라는 구조체의 번지
    ShowWindow(hWnd,nCmdShow);//메모리에 올라가 있는 윈도우를 화면에 출력.
//////////////////////////////////////////////////////////////////////////
    //메시지 루프(무한루프)
    while(GetMessage(&Message,NULL,0,0))//GetMessage가 메시지 큐에서 메시지를 읽어드림.WM_QUIT일 경우 윈도우 종료
    {
        TranslateMessage(&Message);//키보드 입력 메시지를 가공하여 프로그램에서 쉽게 쓸 수 있도록 한다.
        DispatchMessage(&Message);//큐에서 꺼낸 메시지를 윈도우의 메시지 함수로 보낸다.

    }
    return (int)Message.wParam;
//////////////////////////////////////////////////////////////////////////

}
//CALLBACK함수 : 운영체제에 의해 호출되는 응용프로그램 내의 함수.
//WndProc 함수는 WinMain에서 호출되지 않고 운영체제를 통해서 호출.
//////////////////////////////////////////////////////////////////////////
//HWND hWnd : 메시지를 받는 윈도우 핸들                                    //
//UINT iMessage : 어떤 메시지인지                                        //
//WPARAM wParam : 메시지 부가정보                                        //
//LPARAM lParam : 메시지 부가정보                                        //
//////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage,WPARAM wParam, LPARAM lParam)
{
    switch(iMessage)//메시지 종류를 조건으로 case문으로 들어가서 메시지 처리.
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}