bdfgdfg
Winapi 구조 - 2 본문
유니코드
유니코드는 한문자당 2바이트.
winapi의 함수는 유니코드로 받는 함수가 많기에 문자나 문자열을 유니코드 자료형으로 사용하는게 좋다.
ex) wchar_t, wstring
윈도우 구조체
윈메인 함수에서 처음에 레지스터클래스라는 함수를 통해 윈도우 클래스를 설정 및 등록한다.
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_WINDOWSPROJECT2));
wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT2); // NULL로 할시 메뉴바 삭제
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
return RegisterClassExW(&wcex);
}
WNDCLASSEXW는 구조체. 등록하려는 윈도우 클래스의 속성을 정의함.
중요하게 봐야할 것은
wcex.IpfnWndProc = WndProc -> 함수포인터에 함수주소를 저장한다. 여기에는 메시지를 처리할 WndProc함수를 등록한다.
wcex.lpszClassName = szWindowClass -> 윈도우 클래스 이름을 문자열로 저장.
윈도우 클래스를 등록하고 윈도우 초기화 함수를 호출한다 (이때 초기화가 실패하면->핸들이 NULL이면 종료)
초기화 함수에서 중요한 CreateWindow함수.
HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
이녀석은 핸들을 반환한다.
순서대로 인자순
LPCTSTR lpClassName // 구조체명
LPCTSTR lpWindowName // 타이틀바
DWORD dwStyle // 윈도우 형태
int x,int y // 출력 좌표
int nWidth, int nHeight // 윈도우 전체크기
HWND hWndParent // 부모 윈도우
HMENU hMenu // 메뉴바 핸들
HINSTANCE hIntance // 인스턴스
LPVOID lpParam // 여분 / null
중요한것은
LPCTSTR lpClassName // 구조체명
LPCTSTR lpWindowName // 타이틀바
앞에서 WNDCLASSEXW라는 구조체를 등록할 때 사용한 윈도우 클래스이름이 다르면 안된다.
타이틀바는 윈도우 프로그램의 타이틀 그 자체. 내가 바꾸고싶은 타이틀명으로 바꿔주면 된다.
그리고 바로 밑에서
ShowWindow(hWnd, nCmdShow); // 두번째인자로 SW_SHOW로 해도된다
UpdateWindow(hWnd);
핸들이 잘 생성이 되었다면 윈도우를 출력한다.
UpdateWindow는 hdc를 통해 윈도우 클라이언트 영역에 무언가를 그릴때 그것이 적용되도록 갱신하는 함수.
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;
어떤 메시지인지 message변수를 통해 처리하고
메시지만으로는 처리하기 힘든 정보들을 wParam, lParam으로 처리할 수 있다.
(마우스,키보드 사용유무 마우스 좌표등)
WndProc 기본 메시지
WM_PAINT -> 화면 출력
- 최초 UpdateWIndow 함수에 의해 발생
- 윈도우의 일부 영역을 새로 출력할 때 발생
WM_DESTORY
- 윈도우가 화면에서 사라진 후에 보내지는 메시지
- 메모리에서 제거되기 직전에 보내짐
'게임프로그래밍 > Win32 API' 카테고리의 다른 글
키보드와 마우스 (0) | 2021.09.26 |
---|---|
WinAPI 그래픽 (0) | 2021.09.25 |
PeekMessage와 GetMessage, 키입력 (0) | 2021.09.22 |
Win32 API 구조 - 1 (0) | 2021.09.13 |
Win32 API 프로그래밍 (0) | 2021.09.12 |