본문 바로가기
WinAPI 32

02 WinAPI) 기본(2)

by Dev_Hugh 2023. 11. 7.
728x90
반응형

주석을 보고 함수명을 보면 알겠지만 이 부분에서 윈도우 창을 생성한다.

Window 생성 함수

WS_OVERLAPPEDWINDOW가 가장 기본이 되는 윈도우 창인데, 여러 게임을 보면 창을 다 예쁘게 꾸미는데 여기 인자 값을 통해 바꾸면 된다.

 

WS_OVERLAPPEDWINDOW의 F12를 눌러 살펴보면 define 부분이 뜬다.

WS_OVERLAPPEDWINDOW define 이미지

여기서 잘 보면 WS_SYSMENU가 있는데 이는 시스템 메뉴로 프로그램 실행했을 때 다음과 같이 메뉴 창을 의미한다. (이거 하나는 알고 있어서 다행이닼ㅋㅋㅋ)

프로그램 실행시 뜨는 윈도우 창

CreateWindow를 통해 윈도우 핸들이 만들어 지고 우리는 이 윈도우 핸들을 이용해 마우스 좌표나 출력 도구등을 다뤄 이 위에서 만들어야 한다!!

CreateWindow의 인자 중 CW_USERDEFAULT, 0, CW_USERDEFAULT, 0 4개의 값은 실제 클라이언트 영역으로 위 윈도우 창의 메뉴를 제외한 흰색 바탕 부분을 의미한다. 윈도우 좌표계는 기본적으로 좌측 위가 (0,0)이다.

CreateWindow

중요!! 우리가 컴퓨터를 사용하면 내 모니터 스크린이 있고 이 위에 윈도우 창을 띄운다. 둘 다 좌상단 위가 (0,0)이다. 그러나 엄연히 스크린 좌표와 윈도우 창의 클라이언트 좌표는 다른 세상의 좌표다. 즉 윈도우 좌표는 스크린 좌표 기반과 클라이언트 좌표 기반 총 2개가 존재한다.  

CW_USERDEFAULT, 0으로 하여 실행하면 다음과 같은 위치에 클라이언트 창이 생성된다.

CW_USERDEFAULT, 0
0, 0, CW_USERDEFAULT, 0으로 인자 변경

이렇게 함수를 바꿔서 실행하면 아래와 같이 좌상단 위에 붙어서 윈도우 창 즉 클라이언트 영역이 생성된다.

0,0

결론으로 4개의 정수 인자 (CW_USERDEFAULT, 0, CW_USERDEFAULT, 0)에서 앞에 CW_USERDEFAULT, 0은 스크린 좌표 기준 어디에 윈도우 창을 생성할건지 뒤의 CW_USERDEFAUlT, 0은 가로 세로 비율을 이야기 한다.

300, 500으로 변경

잘 보면 300, 500으로 변경했을 때 우리가 필요로 하는 클라이언트 영역만을 기준으로 하는게 아니라 창의 테두리와 타이틀 바 등을 포함한 주변까지 포함하여 만들기에 실제 비율이 아니다. 따라서 이를 이런식으로 사용한다면 게임의 해상도 이슈가 백퍼 생기므로 실제 우리가 필요한 클라이언트 영역을 정확하기 원하는 가로 세로 비율로 생성하고 싶다면 클라이언트 영역을 제외한 영역(메뉴 바, 테두리)등의 영역을 고려해 조정해줘야 한다. 

300, 500으로 변경
CreateWindowW define 부분

윈도우 창은 계층 구조를 이루고 있기에 hWndParent 있다. 그러므로 내가 어떤 창 위에 창을 띄울 때 계층 구조를 이룬다면 hWndParent를 지정해줘야 한다. 내 경험상 게임 개발시 주로 새 창을 띄우기 보단 하나의 창 내에서 장면으로 처리하는 경우가 많았던거 같다.

 

지금까지 윈도우 창을 실행시켜 사용자에게 컴퓨터에 어떤 입력을 통해 무언가를 출력하는 기본을 살펴봤다.

그런데 여기서 중요한건 윈도우 != 프로세스

이 말이 무슨 뜻이냐면 내가 만든 프로그램을 실행하면 하나의 프로세스로서 OS가 관리하면서 프로그램이 실행되는데 윈도우는 인터페이스 역할을 하고 특정 프로세스는 윈도우를 가질 수도 안 가질 수도 있다.


오늘도 기본적인걸 공부해서 그런지 할만한거 같다... 아마 다음 공부 부터는 직접 이것저것 만들면서 GitHub에 기록해두려고 한다. 혹시나 관심 있으시면 GitHub 주소도 올릴테니 같이 공부하면 좋을거 같습니다~ follow도 해주시면 감사합니다 (- - (_ _ 꾸벅

728x90
반응형

'WinAPI 32' 카테고리의 다른 글

06 WinAPI) Singleton  (0) 2023.11.12
05 WinAPI) PeekMessage  (0) 2023.11.11
04 WinAPI) 핸들과 DC(2)  (0) 2023.11.10
03 WinAPI) 핸들과 DC(1)  (0) 2023.11.09
01 WinAPI) 기본(1)  (0) 2023.11.06