728x90
'나우캠퍼스X아워즈팜'유튜브의 'Win32 API 2강. Win32 API 프로그래밍 구조 (3/5)'영상을 보고 정리한 내용입니다.
WinMain안의 코드들에 대한 설명
윈도우 구조체 설정과 등록
- 윈도우 클래스의 정보를 담을 구조체 설정하기
WNDCLASSEX wc; - 필요한 정보로 구조체를 채웁니다.
wc.cbSize = sizeof(WNDCLASSEX);
//구조체 크기를 설정.
wc.style = CS_HREDRAW | CS_VREDRAW;
//윈도우가 이동하거나 크기가 변할 때 윈도우를 다시 그리겠다는 뜻. 모두 픽셀로 이루어져있기 때문에 다시 그림.
wc.lpfnWndProc = WindowProc;
//사용하려는 윈도우 프로시저의 함수명(함수의 메모리 주소)을 설정해서 윈도우 프로시저 함수를 연결시켜준다.(그래서 포인터 변수)
wc.hInstance = hInstance;
//WinMain의 매개변수 hInstance를 넘겨준다.
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
//h가 붙어있는 것은 모두 핸들이고 각각을 나누며 os의 자원을 빌려서 쓴다.(양의 정수값)
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
//IDC_ARROW는 운영체제에 설정되어있다. 가장 기본적인 화살표 커서로 쓰겠다는 뜻
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
//배경 색을 흰색으로 설정해준다.
wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
//바탕화면에 생길 아이콘(더블클릭하여 실행하는)을 설정. 운영체제에서 사용하는 기본 아이콘으로 설정
//MAKEINTRESOURCE는 매크로 함수이다. id를 양의 정수로 바꾸어 준다. IDI_APPLICATION는 기본 아이콘.
wc.hIconSm = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
//작은 아이콘
wc.lpszMenuName = nullptr;
//메뉴에 대한 것을 지정해 줄 수 있다.
wc.lpszClassName = L"WindowClass1";
//레지스터 클래스로 해당하는 구조체를 os에 등록을 하는데 등록을 할 때 쓰이는 이름이다.
RegisterClassEx(&wc);
//RegisterClassEx 클래스에 구조체를 등록한다.
윈도우 생성
- CreateWindow 함수(윈도우 생성을 위한 함수. 윈도우를 생성 후 그것에 대한 아이디인 핸들(양의 정수값)을 리턴)
HWND WINAPI CreateWindow(
LPCSTR lpClassName, //구조체명/wc.lpszClassName = L"WindowClass1";
위에서 설정한 이름과 같아야함/윈도우 클래스의 이름
LPCSTR lpWindowName, //타이틀바 이름. 윈도우 제목
DWORD dwStyle, //윈도우 형태(윈도우 스타일)
int x, int y, //출력 좌표
int nWidth, int nHeight, //윈도우 전체 크기
HWND hWndParent, //부모 윈도우
HMENU hMenu, //메뉴바
HINSTANCE hInstance, //인스턴스
LPVOID lpPAram); //여분 - 윈도우 생성
// 창을 만들고 결과를 핸들로 사용
hWnd = CreateWindow(
L"WindowClass1", // 윈도우 클래스의 이름
L"Our First Windowed Program",//타이틀바 이름. 윈도우 제목
WS_OVERLAPPEDWINDOW, // 윈도우 스타일. 윈도우 스타일은 WS_OVERLAPPEDWINDOW가 가장 기본적인 형태
300, // 윈도우의 x- 위치(기본: CW_USEDEFAULT)
300, // 윈도우의 y- 위치(기본: CW_USEDEFAULT)
500, // 윈도우의 너비
400, // 윈도우의 높이
NULL, // 부모 창 없음, NULL
NULL, // 메뉴를 사용하지 않음, NULL
hInstance, // 응용 프로그램 핸들
NULL); // 여러 창에 사용, NULL
윈도우 출력
- ShowWindow(hWnd, nCmdShow); //해당하는 윈도우를 출력하기. nCmdShow와 SW_SHOW는 같다.
UpdateWindow(hWnd); // WM_PAINT에 출력할 내용들이 들어간다. 화면을 갱신한다.
MSG 구조체
- typedef struct tagMSG {
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
#ifdef _MAC
DWORD lPrivate;
#endif
} MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG; - hwnd -- 윈도우의 핸들
- message -- 보내질 메시지 ex) 마우스가 움직였을 때
- wParam, lParam -- 부가적인 메시지 ex) 마우스 좌표
메시지 루프
- MSG msg;
//다음 메시지를 기다렸다가 메시지가 오면 결과를 msg에 저장
while (GetMessage(&msg, NULL, 0, 0))
{
// 키 입력 메시지가 있을 경우 키 입력 메시지를 msg에 저장
TranslateMessage(&msg);
// msg를 WndProc(윈도우 프로시저)에 보내줍니다.
DispatchMessage(&msg);
}
// WM_QUIT 메시지가 발생하면 while문을 빠져나오며 프로그램이 종료됩니다.
return 0; - 메시지 루프에 이 3가지의 함수가 있다.
GetMessage(&msg, NULL, 0, 0)
TranslateMessage(&msg);
DispatchMessage(&msg); - GetMessage함수를 통해서 메시지를 가져오며 MSG 구조체를 채워준다.
메시지 WM_QUIT가 발생할 때 FALSE를 리턴하며 while문을 빠져나와 프로그램이 종료된다. - TranslateMessage함수는 키와 관련된 정보가 발생됐을 때 반응한다.
키 입력이 있으면 그 키 입력이 os의 메시지 큐에 모두 저장되며 메시지 큐에 있는 것을 응용 프로그램에서 메시지 큐를 체크하며 처리한다. - DispatchMessage함수는 메시지가 발생하였을 때 WndProc함수를 호출하며 WndProc함수에서 메시지 처리를 끝내고 메시지를 전달할 때까지 기다린다.
혹시 제가 잘못 이해한 부분이(잘못된 정보) 있다면 알려주시면 감사하겠습니다. :)
'무작정 따라해보기(정리, 문제풀기) > Win32API' 카테고리의 다른 글
8. WIN32 API 프로그래밍 (0) | 2021.08.10 |
---|---|
7. Win32 API 프로그래밍 (0) | 2021.08.10 |
5. Win32 API 프로그래밍 (0) | 2021.08.04 |
4. Win32 API 프로그래밍 (0) | 2021.08.01 |
3. Win32 API 프로그래밍 (0) | 2021.07.30 |