창이란?
창이란?
물론 창은 Windows의 핵심입니다. 창은 매우 중요하므로 그 이름을 따서 운영 체제의 이름을 지었습니다. 그렇다면 창이란 무엇일까요? 창을 생각할 때 다음과 같이 생각할 수 있습니다.
이 유형의 창을 애플리케이션 창 또는 주 창이라고 합니다. 일반적으로 제목 표시줄, 최소화, 최대화 단추 및 기타 표준 UI 요소가 있는 프레임이 있습니다. 이 프레임은 운영 체제가 창의 해당 부분을 관리하기 때문에 창의 비클라이언트 영역이라고 합니다. 프레임 내의 영역은 클라이언트 영역입니다. 프로그램이 관리하는 창의 일부입니다.
다음과 같은 다른 유형의 창도 있습니다.
Windows 프로그래밍을 접하는 경우 단추 및 편집 상자와 같은 UI 컨트롤 자체가 창이라는 사실에 놀랄 수 있습니다. UI 컨트롤과 애플리케이션 창의 주요 차이점은 컨트롤 자체가 존재하지 않는다는 것입니다. 대신 컨트롤은 애플리케이션 창을 기준으로 배치됩니다. 애플리케이션 창을 끌면 컨트롤이 예상대로 컨트롤이 함께 이동합니다. 또한 컨트롤과 애플리케이션 창이 서로 통신할 수 있습니다. (예를 들어 애플리케이션 창은 단추에서 클릭 알림을 받습니다.)
따라서 창을 생각할 때 단순히 애플리케이션 창을 생각하지 마세요. 대신 창을 다음과 같은 프로그래밍 구성 요소로 생각하세요.
- 화면의 특정 부분을 차지합니다.
- 특정 시점에 표시될 수도, 표시되지 않을 수도 있습니다.
- 자신을 그리는 방법을 알고 있습니다.
- 사용자 또는 운영 체제의 이벤트에 응답합니다.
부모 창 및 소유자 창
UI 컨트롤의 경우 컨트롤 창은 애플리케이션 창의 자식이라고 합니다. 애플리케이션 창은 컨트롤 창의 부모입니다. 부모 창은 자식 창을 배치하는 데 사용되는 좌표계를 제공합니다. 부모 창이 있으면 창 모양에 영향을 줍니다. 예를 들어 자식 창의 일부가 부모 창의 테두리 밖에 나타나지 않도록 자식 창이 잘립니다.
또 다른 관계는 애플리케이션 창과 모달 대화 상자 창 간의 관계입니다. 애플리케이션에 모달 대화 상자가 표시되면 애플리케이션 창은 소유자 창이고 대화 상자는 소유된 창입니다. 소유된 창은 항상 소유자 창 앞에 나타납니다. 소유자가 최소화되면 숨겨지고 소유자와 동시에 제거됩니다.
다음 이미지는 두 개의 단추가 있는 대화 상자를 표시하는 애플리케이션을 보여 줍니다.
애플리케이션 창은 대화 상자 창을 소유하며 대화 상자 창은 두 단추 창의 부모입니다. 다음 다이어그램은 이러한 관계를 보여 줍니다.
창 핸들
Windows는 개체이며 코드와 데이터가 모두 있지만 C++ 클래스는 아닙니다. 대신 프로그램은 핸들이라는 값을 사용하여 창을 참조합니다. 핸들은 불투명 형식입니다. 기본적으로 운영 체제에서 개체를 식별하는 데 사용하는 숫자일 뿐입니다. Windows가 생성된 모든 창의 큰 테이블을 가지고 있다고 상상할 수 있습니다. 이 테이블을 사용하여 핸들로 창을 조회합니다. (이것이 내부적으로 정확히 어떻게 작동하는지 여부는 중요하지 않습니다.) 창 핸들의 데이터 형식은 일반적으로 "에이치윈드"로 발음되는 HWND입니다. 창 핸들은 창을 만드는 함수인 CreateWindow 및 CreateWindowEx에서 반환됩니다.
창에서 작업을 수행하려면 일반적으로 HWND 값을 매개 변수로 사용하는 일부 함수를 호출합니다. 예를 들어 화면의 창 위치를 변경하려면 MoveWindow 함수를 호출합니다.
BOOL MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint);
첫 번째 매개 변수는 이동하려는 창에 대한 핸들입니다. 다른 매개 변수는 창의 새 위치와 창을 다시 그려야 하는지 여부를 지정합니다.
핸들은 포인터가 아닙니다.
hwnd가 핸들을 포함하는 변수인 경우 *hwnd
를 작성하여 핸들을 역참조하려고 하면 오류가 발생합니다.
화면 및 창 좌표
좌표는 장치 독립적 픽셀로 측정됩니다. 그래픽에 대해 논의할 때 장치 독립적 픽셀의 디바이스 독립적 부분에 대해 더 많은 내용을 다루기로 합니다.
작업에 따라 화면을 기준으로, 창(프레임 포함)을 기준으로 또는 창의 클라이언트 영역을 기준으로 좌표를 측정할 수 있습니다. 예를 들어 화면 좌표를 사용하여 화면에 창을 배치하는 반면 클라이언트 좌표를 사용하여 창 내부에 그립니다. 각각의 경우 원점(0, 0)은 항상 지역의 왼쪽 위 모서리입니다.
다음