winmain

2015. 4. 11. 07:47프로그래밍/ETC

728x90
728x90

1. 서론

무엇을 배우던 가장 중요한 것은 역시 메인이다.

메인 함수와 내부 구조를 익히는 것이 빠르게 개념을 이해하는 지름길!

아카데미에서 winmain을 10분 컷으로 메모장에 작성하는 타임어택을 했다.

이미 싱글, 더블 리스트에서 효과를 봤던지라 믿어 의심치 않고 외웠다!!!


대학 학부시절에 많이 했을듯(?) 하지만 어차피 학부땐 공부를 안했으므로..(고통)

정말 생소한 변수와 함수들 때문에 고생을 많이 하긴 했지만

단어의 뜻과 주석을 보며 열심히 공부했다. 내부 구조는 그리 어렵지 않았다.

전전체적으로

윈도우 클래스 작성 > 윈도우 클래스 등록 > 윈도우 생성 > 메시지 루프


지금은 진도가 조금 더 나가서 초기화, 랜더 등등을 더 구현해야 하지만

일단 그건 오늘 저녁에 정리하는 것으로 하자


2. 코드

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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
// Win32Project2.cpp : 응용 프로그램에 대한 진입점을 정의합니다.
//
 
#include "stdafx.h"
#include "Win32Project2.h"
 
//< 헤더 파일
#include <windows.h>            //윈도우 헤더파일 인크루드
 
//< 윈도우 출력을 위한 define 
// 윈도우의 시작 위치
#define        START_X        100        
#define        START_Y        100
 
// 윈도우의 크기 
#define        WINSIZE_X    1024 
#define        WINSIZE_Y    768
 
 
//< 전역변수(인스턴스 핸들과 클래스이름, 윈도우 이름, 윈도우 핸들
HINSTANCE    g_hInst;                        //인스턴스의 핸들선언(운영체제에서 정해줄 번호)
//< 유니코드, 바이트에 다 둘 다 반응할 수 있는 TCHAR형 타입
TCHAR          g_ClassName[128= _T("Janus");        //클래스 이름
TCHAR          g_WinName[128= _T("Janus");            //윈도우 이름
HWND        g_hWnd;                            //윈도우의 핸들(윈도우를 대표하는 번호)
 
//< 콜백함수
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
 
//< 메인 앤트리 함수
// apientry            ==  winmain함수의 호출 방식을 의미한다
// hInstance        ==    프로그램의 인스턴스 핸들이다(윈도우즈 운영체제에서 정해줄 윈도우의 코드번호(고유명사)).
// hPrevInstance    ==    바로 앞에 실행된 프로그램의 인스턴스 핸들.
// lpszCmdParam        ==    실행 직후에 열 파일의 경로가 전달된다.
// nCmdShow            ==  윈도우를 화면에 출력할 방법(윈도우를 활성화 하여 보여준다라는 의미,또는 숨긴다.)
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance
          ,LPSTR lpszCmdParam, int nCmdShow)
{
    //< 초기 선언
    WNDCLASS    WndClass;        //윈도우 클래스 선언
    g_hInst =    hInstance;        //인스턴스선언과 동시에 대입한다.
    int            nWidth, nHeight;//윈도우 크기 
 
    //윈도우창 크기 만들기.
    nWidth = WINSIZE_X + GetSystemMetrics(SM_CXFRAME) * 2;
    nHeight = WINSIZE_Y + GetSystemMetrics(SM_CYFRAME ) * 2 +
        GetSystemMetrics(SM_CYCAPTION);
 
    //< 1. 윈도우 클래스 작성 (윈도우의 속성을 정의 한다)
    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)WndProc;                        //윈도우 프로시저의 이름(윈도우의 메시지 처리 함수를 지정)
    WndClass.lpszClassName    = g_ClassName;                            //윈도우 클래스의 이름(어디까지나 클래스 이름일 뿐이다)
    WndClass.lpszMenuName    = NULL;                                    //메뉴의 이름(리소스 에디터 의해 별도로 만들어짐, 사용을 안하면 NULL)
    WndClass.style            = CS_HREDRAW | CS_VREDRAW;                //윈도우의 스타일(윈도우의 크기가 변할때 다시 그린다.)
 
    //< 2. 클래스를 등록한다 (정의한 윈도우 클래스를 등록한다)
    RegisterClass(&WndClass);                                        
    
    //< 3. 윈도우를 만든다 (메모리 상에 윈도우를 생성한다)
 
    g_hWnd = CreateWindow(g_ClassName,                // 윈도우클래스 문자열 
                          g_WinName,                // 타이틀바에 나타날 문자열
                          WS_OVERLAPPEDWINDOW,        // 윈도우의 형태 옵션(OR 연산자 사용)타이틀바, 스크롤바, 크기조절가능 등등
                          START_X, START_Y,            // 윈도우 시작위치
                          nWidth, nHeight,            // 윈도우 크기
                          NULL,                        // 부모윈도우의 핸들 (부모 윈도우가 없고 자신이 최상위 윈도우 일때 NULL)
                          (HMENU)NULL,                // 메뉴의 핸들 (메뉴를 사용 안하므로 NULL)            
                          hInstance,                // 인스턴스
                          NULL);                    // createStruct라는 구조체의 주소 (여러개의 윈도우를 만들때 사용 되나 거의 사용하지 않는다.)
    
    //< 4. 윈도우를 화면에 보여준다
    ShowWindow(g_hWnd, nCmdShow);
 
    //< 5. 메시지 루프
    MSG            Message;        //메세지 구조체 선언    
    //GetMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterJanus, UINT wMsgFilterMAx)메시지큐에서 읽어들인  메세지가 WM_QUIT면 false 리턴 나머지는 true 리턴
    //lpMsg : 메시지의 주소
    //hWnd : 윈도우의 핸들 0이면 모든 윈도우의 메시지를 가져오고, 핸들 값을 지정하면 그핸들값에 포함된 메시지만 가져온다.
    //wMsgFilterJanus, wMsgFilterMAx : 메시지를 읽어들일 범위 최소값 최대값(사용할경우 시스템이 무한루프에 빠질수 있다.)
    // 4 메세지 루프(사용자로부터의 메시지를 처리한다 !메시지 구동시스템)
    while(GetMessage(&Message,0,0,0))
    {
        TranslateMessage(&Message);// 키보드 입력 메시지를 관리한다(a라는  키가 눌렸을때 a라는 키가 눌렸다는 메세지를 만들어낸다.)
        DispatchMessage(&Message); // 메시지를 가지고 프로시져함수를 호출하는 역활 
    }
//    Release(); (해제 해주는곳)
    
    return Message.wParam;
}
 
//< 프로시저 함수 구현, 메세지 
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,
                         LPARAM lParam)
{
    HDC            hdc;
    PAINTSTRUCT    ps;
    
    
    switch(iMessage)
    {
        case WM_TIMER:
        
        break;
 
        case WM_PAINT:
            hdc = BeginPaint(hWnd, &ps);
            
            EndPaint(hWnd, &ps);
        break;
 
        case WM_LBUTTONDOWN:
            
        
        break;
 
        case WM_RBUTTONDOWN:
            
        break;
 
        case WM_KEYDOWN:
            switch(wParam)
            {
                //(esc key)
                case VK_ESCAPE:
                    PostQuitMessage(0);
                break;
            }
        break;
        case WM_DESTROY:
            PostQuitMessage(0);
        return 0;
    }
 
    //wndProc에서 처리 되지 않은 나머지 메시지들을 처리해준다.
    // 윈도우크기 변경이나, 이동 등를 처리해준다.
    return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
cs




728x90
반응형