Typing diary
WinApi 기본 윈도우 본문
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, 0, 0)) //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 |