Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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
Archives
Today
Total
관리 메뉴

Typing diary

WinApi 기본 윈도우 본문

WinAPI

WinApi 기본 윈도우

Jcon 2022. 8. 17. 21:50

2018. 4. 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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
/*
    Api : 플랫폼마다 사용할 수 있는 기능을 함수로 제공해줌
    
    유니코드 : 16비트의 단일한 값으로 지구상의 모든 문자를 표현할 수 있는 문자 코드 체계이다.
    ┌──────────────┬─────────────────┐
    │   c 타입     │  유니코드 타입   │
    ├──────────────┴─────────────────┤
    │    char             TCHAR      │
    │    char*            LPSTR    │
    │ const char*         LPCTSTR    │
    └────────────────────────────────┘
    ※TCHAR : 프로젝트 설정에 따라 타입이 멀티 바이트와 유니코드 타입으로 알맞게 바꿔준다.
        #ifdef UNICODE
        typedef wchar_t TCHAR;
        #else
        typedef char TCHAR;
        #endif
    ※lstrlen : TCHAR과 char타입 둘다 작동한다.
    ※TEXT메크로 : 문자열 상수를 프로젝트 설정에 따라 멀티바이트와 유니코드 타입으로 알맞게 바꿔준다.
    ※_PTR : _PTR이 붙은 타입은 운영체제 비트수에 따라 크기가 
            가변적으로 바뀌며 포인터와 같은 길이를 가진다.(윈도우즈 Api 1 22p)
*/
 
 
 
// WinApi기본 윈도우창.cpp: 응용 프로그램의 진입점을 정의합니다.
//
 
#include "stdafx.h"
#include "WinApi 03~.h"
 
#define MAX_LOADSTRING 100
 
// 전역 변수:
HINSTANCE hInst;                                // 현재 인스턴스입니다.
// WCHAR : ※F12... -> typedef wchar_t WCHAR;  2byte유니코드 문자형 ( 변수 하나에 모든 문자를 저장할 수 있다. )
// 프로젝트 -> 우클릭 -> 속성 -> 문자집합에서 유니코드,멀티바이트 설정 변경 가능 
WCHAR szTitle[MAX_LOADSTRING];                  // 제목 표시줄 텍스트입니다.
WCHAR szWindowClass[MAX_LOADSTRING];            // 기본 창 클래스 이름입니다.
 
// 이 코드 모듈에 들어 있는 함수의 정방향 선언입니다.
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
 
//wWinMain : Win32의 진입점 함수 
//    ┌>※F12...-> __stdcall : 함수 호출귀약
//    │                    ┌> H(Handle) : 어떤 대상에 붙여진 번호이고 문법적으론 32비트(또는 64비트) 정수값이다.
//    │                    │              핸들을 사용하는 목적은 오로지 구분을 위한 것이므로 핸들끼리는 중복되지 않아야 한다.
//    │                    │              핸들은 운영체제가 발급하며 사용자는 쓰기만 한다.
//    │                    │  ┌>HINSTANCE : 운영체제가 프로그램마다 식별하기 위해 식별번호를 부여하는것, 프로그램 내부에서
// │ 자기 자신을 가리키는 1인칭 대명사이다.
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);
 
    // TODO: 여기에 코드를 입력합니다.
 
    // 전역 문자열을 초기화합니다.
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_WINAPI03, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);
 
    // 응용 프로그램 초기화를 수행합니다.
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }
 
    HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINAPI03));
 
    /* MSG : 메시지를 받아오는 구조체 변수이다    
       typedef struct tagMSG
       {
            HWND    hwnd;        메시지를 받을 윈도우 핸들이다.
            UINT    message;    어떤 종류의 메시지인가를 나타낸다. 
            WPARAM    wParam;        전달된 메시지에 대한 부가적인 정보를 가진다. 32비트 값이다.
            LPARAM    lParam;        전달된 메시지에 대한 부가적인 정보를 가진다. 32비트 값이다.
            DWORD    time;        메시지가 발생한 시간이다.
            POINT    pt;            메시지가 발생했을 때의 마우스 시간이다.
        } MSG;
    */
    MSG msg;
 
    /*
    메시지큐가 비어있는 시간을 윈도우 데드타임이라고 한다.
    게임은 윈도우 데드타임을 이용하여 제작한다.
    */
 
    // 기본 메시지 루프입니다.
    //                    ┌>메시지 큐에서 읽어들인 메시지를 msg에 저장합니다.
    while (GetMessage(&msg, nullptr, 00))
        //GetMessage : 메시지가 발생하지 않는한은 GetMessage함수를 빠져나오지 않는다.
        //               읽어들인 메시지가 WM_QUIT라는 프로그램 종료 메시지일 경우 FALSE를 리턴하고
        //               그 외의 경우는 TURE를 리턴한다.
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {         
            //TranslateMessage : WM_KEYDOWN메시지가 발생했을때 눌러진 키가 문자키인지 확인하여 문자키 일때 WM_CHAR메시지를
발생시킨다. WM_CHAR메시지를 받을 필요가 없다면 생략해도 된다. 
            TranslateMessage(&msg);
            //DispatchMessage : 메시지 큐에서 꺼낸 메시지를 윈도우의 메시지 처리 함수(WndProc)로 전달한다.
            DispatchMessage(&msg);
        }
    }
 
 
 
    return (int) msg.wParam;
}
 
 
 
//
//  함수: MyRegisterClass()
//
//  목적: 창 클래스를 등록합니다.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    //┌> 구조체로 정의됨
    WNDCLASSEXW wcex; 
 
    wcex.cbSize = sizeof(WNDCLASSEX);
 
    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    //바타화면 아이콘 
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINAPI03));
    //마우스 커서 모양
    wcex.hCursor        = LoadCursor(nullptr, IDC_ARROW);
    //프로그램 창 배경 색
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    //타이틀바 아래 메뉴
    wcex.lpszMenuName = NULL;//MAKEINTRESOURCEW(IDC_WINAPI03);
    wcex.lpszClassName  = szWindowClass;
    //프로그램 타이틀바 왼쪽 상단의 작은 아이콘 
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
 
    return RegisterClassExW(&wcex);
}
 
//
//   함수: InitInstance(HINSTANCE, int)
//
//   목적: 인스턴스 핸들을 저장하고 주 창을 만듭니다.
//
//   설명:
//
//        이 함수를 통해 인스턴스 핸들을 전역 변수에 저장하고
//        주 프로그램 창을 만든 다음 표시합니다.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   hInst = hInstance; // 인스턴스 핸들을 전역 변수에 저장합니다.
 
   //CreateWindowW : 프로그램 창을 만드는 함수               ┌>※F12.... -> 프로그램 창의 기본 UI설정들을 or연산으로 정의해논 것 
   HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
   //       └───┬───┘          └───┬───┘     └>한 프로그램에서 여러개의 창을 띄우고 싶을때 hWnd를 인자로 넣어준다.
   //            │         프로그램 실행시 최초 창(스크린 창)의 크기   ※스크린창 : 타이틀바와 양옆 프레임을 포함함 크기
   //프로그램 실행시 최초 프로그램 창의 위치   
 
   if (!hWnd)
   {
      return FALSE;
   }
 
   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);
 
   return TRUE;
}
 
//
//  함수: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  목적:  주 창의 이벤트 발생에 따른 사용자 정의 기능을 수행합니다. 
//
//  WM_COMMAND  - 응용 프로그램 메뉴를 처리합니다.
//  WM_PAINT    - 주 창을 그리거나 갱신될때 처리합니다.
//  WM_DESTROY  - 종료 메시지를 게시하고 반환합니다.
//
//
 
//                                                           ┌>키보드 부가정보 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
//                                                                          └>마우스 부가정보
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 메뉴 선택을 구문 분석합니다.
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            //HDC : 화면에 그리기 위한 도구
            HDC hdc = BeginPaint(hWnd, &ps);
            // TODO: 여기에 hdc를 사용하는 그리기 코드를 추가합니다.
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        //아무 메시지도 들어오지 않았을때 윈도우 기본 프로시져 함수로  처리한다.
        return DefWindowProc(hWnd, message, wParam, lParam);    
    }
    return 0;
}
 
// 정보 대화 상자의 메시지 처리기입니다.
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;
 
    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}
 
cs

'WinAPI' 카테고리의 다른 글

WinApi키입력  (0) 2022.08.20
WinApi InvalidateRect  (0) 2022.08.17