본문 바로가기
게임 공부/Windows API

3. What is a Window?

by woohyeon 2020. 3. 31.
반응형

다음 링크를 참고하여 학습용으로 작성합니다.

https://docs.microsoft.com/ko-kr/windows/win32/learnwin32/what-is-a-window-

 

[What is a window?]
아래와 같은 창(window)를 애플리케이션 윈도우 또는 메인 윈도우라고 부른다. 보통 제목바, 최소화, 최대화 버튼 등이 있는 frame을 가진다. frame은 윈도우의 비 유저(non-client) 영역이며 운영 체제가 관리하는 일부의 영역이다. 그리고 윈도우 안에 있는 나머지 영역이 우리가 관리하는 영역이다. 

 

아래 버튼은 또 다른 타입의 윈도우이며 UI control 중 하나이다. UI 컨트롤과 애플리케이션 윈도우의 차이점은 UI 컨트롤은 자기 스스로는 존재하지 않고 애플리케이션 윈도우에 종속되어 있다는 점이다.


따라서 윈도우를 생각할 때 단순히 애플리케이션 윈도우만 생각하지 말고, 다음과 같은 프로그래밍 구조 관점에서의 윈도우를 생각하자.

- 화면의 어떤 영역을 점유한다.
- 어떤 상황에서 보일 수도 보이지 않을 수도 있다.
- 자기 자신을 어떻게 그릴지 안다.
- 유저 또는 OS로부터 이벤트에 응답한다.

 

[Parent Windows and Owner Windows]
보통 UI 컨트롤과 같은 컨트롤 윈도우를 애플리케이션 윈도우의 child라고 한다. 애플리케이션의 윈도우는 컨트롤 윈도우의 parent이다. 또다른 관계는 애플리케이션 윈도우와 modal 다이얼로그 윈도우의 소유 관계이다. (modal은 팝업과 같은 창을 말한다)

애플리케이션이 다이얼로그를 보여줄 때 애플리케이션 윈도우는 다이얼로그를 소유한다. 그리고 다이얼로그 윈도우는 애플리케이션 윈도우에 속한다(소유된다)고 말한다.

다음 사진의 애플리케이션 윈도우는 다이얼로그 윈도우를 소유하며 다이얼로그 윈도우는 두 버튼의 parent이다. 

 

 

다음은 소유와 부모/자식 관계를 보여준다.

 

[Window Handles]
윈도우는 객체(object)이며 코드와 데이터를 모두 가지고 있다. 하지만 C++ 클래스는 아니다. 대신 프로그램은 handle이라 불리는 값을 사용함으로써 윈도우를 참조(가리킨다)한다. 핸들이란 값은 오파크 타입(Opaque type)이다. "Opaque" 는 불투명한이란 뜻이며 대략적으로 정확한 구현을 숨겨 캡슐화처럼 그 구현을 내부에 감추고 있는 타입을 말한다. 기본적으로 핸들은 OS가 오브젝트를 식별하기 위해 사용하는 단순한 숫자이다. 

윈도우 핸들을 위한 데이터 타입은 HWND 이며 보통 에이치윈드라고 발음한다. 윈도우 핸들은 윈도우를 생성하는 함수에 의해 반환된다: CreateWindow / CreateWindowEx

윈도우에서 동작을 수행하기 위해 우리는 HWND 타입을 매개변수로 받는 몇몇 함수를 사용해야 할 것이다. 예를 들어 화면의 창을 재배치하기 위해 MoveWindow 함수를 호출한다. 아래 함수의 프로토 타입에서 첫번째 매개변수인 HWND 타입의 변수는 움직이길 원하는 창에 대한 handle이다. 그리고 handle은 포인터가 아니라는 것을 명심하자. 만약 *hWnd와 같이 핸들을 역참조 하면 에러를 발생시킬 것이다.

BOOL MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint);

 

[Screen and Window Coordinates]
화면 및 창의 좌표는 device 독립적인 픽셀로 측정된다. 자세한 것은 그래픽 부분에서 다룬다.

(0, 0) 좌표는 항상 맨왼쪽 맨위를 가리키며 우리는 Client Coordinates 영역에 그려야한다.

 

'게임 공부 > Windows API' 카테고리의 다른 글

HINSTANCE 타입과 HWND 타입의 차이  (0) 2020.06.12
윈도우의 메시지 처리 과정  (0) 2020.04.02
4. WinMain: The application entry point  (0) 2020.03.31
2. Working with Strings  (0) 2020.03.31
1. Windows coding conventions  (0) 2020.03.31



댓글