본문 바로가기
Windows/WIN32API

[main] winmain.cpp

by Planetis 2015. 1. 23.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <windows.h>
#include <tchar.h>        // unicode를 이용하기 위함.
 
// char *szString = "ABCD" // 기존 문자열 저장 방식으로, 알파벳과 일부 확장 문자만 가능했음.
// TCHAR *szString = L"ABCD" // L이 들어가면 unicode로 사용됨.
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
// LRESULT -> 자료형 long의 재정의.
// CALLBACK - OS 호출 규약
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR strCmdLine, int nShowCmd) {
// hInstance - 프로그램 번호
 
    WNDCLASSEX wcex;                                            // 윈도우 정보 구조체
 
    memset(&wcex, 0, sizeof(wcex));
 
    wcex.cbSize         = sizeof(wcex);                         // 구조체 크기
    wcex.style          = CS_HREDRAW | CS_VREDRAW;              // 구조체 스타일
    wcex.hbrBackground  = (HBRUSH)GetStockObject(DKGRAY_BRUSH); // 클라이언트 배경색
    wcex.hCursor        = LoadCursor(NULL, IDC_HELP);           // 커서 모양
    wcex.hIcon          = LoadIcon(NULL, IDI_ERROR);            // 아이콘
    wcex.hInstance      = hInstance;                            // 프로그램 번호
 
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
 
    wcex.hIconSm        = NULL;                                 // 작은 아이콘
    wcex.lpszMenuName   = NULL;                                 // 메뉴, 리소스 에디터로 제작.
    wcex.lpfnWndProc    = WndProc;                              // 메시지 처리 함수
    wcex.lpszClassName  = L"CustWnd";                           // 위 설정의 윈도우 클래스 이름
    RegisterClassEx(&wcex);                                     // 윈도우에 등록
 
    HWND hWnd = CreateWindow(L"CustWnd", L"Planitis", WS_OVERLAPPEDWINDOW, 0, 0, 192, 108, NULL, NULL, hInstance, NULL);
    //( 생성하고자 하는 클래스, 윈도우 캡션, 윈도우스타일(최소화, 닫기 등), 윈도우의 x 값, 윈도우의 y값, 
    //윈도우 넓이, 윈도우 높이, 부모 윈도우, MENU ID, 프로그램번호(윈도우와 연결), 특수목적)
 
    if (hWnd == NULL) {                                         // 윈도우 생성 실패시에 대한 예외 처리.
        MessageBox(NULL, L"MyWindow", L"MyWindow", MB_ICONERROR | MB_OK);
        return -1;
    }
 
    ShowWindow(hWnd, SW_SHOW);                                  // 호출할 윈도우, 윈도우 상태.
 
    MSG msg;
    memset(&msg, 0, sizeof(msg));
 
    while(GetMessage(&msg, NULL, 0, 0))                     //( 메시지 포인터, 메시지를 불러올 장소, 메시지 최소값, 최대값 )
    {
        TranslateMessage(&msg);                             // 키값 조사
        DispatchMessage(&msg);                              // 메시지 처리
    }
 
    return 0;
}
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {// ( 누가, 메시지, 내용1, 내용2 )
    switch(uMsg) {
        case WM_DESTROY :                                       // 창닫기
        {
            PostQuitMessage(0);                                 // WM_QUIT 발생
            break;
        }
    }
 
    return DefWindowProc(hWnd, uMsg, wParam, lParam);           // 윈도우에 무언가 보고됨.
}


320x100

댓글