Share via


Windows 정보

이 항목에서는 애플리케이션이 창을 만들고 사용하는 데 사용하는 프로그래밍 요소에 대해 설명합니다. 창 간의 관계 관리; 및 크기를 지정하고 창을 이동하고 표시합니다.

개요에는 다음 topics 포함됩니다.

바탕 화면 창

시스템을 시작하면 바탕 화면 창이 자동으로 만들어집니다. 바탕 화면 창은 화면 배경을 칠하고 모든 애플리케이션에서 표시하는 모든 창의 기본으로 사용되는 시스템 정의 창입니다.

바탕 화면 창은 비트맵을 사용하여 화면의 배경을 그립니다. 비트맵에서 만든 패턴을 바탕 화면 배경 화면이라고 합니다. 기본적으로 바탕 화면 창은 레지스트리에 지정된 .bmp 파일의 비트맵을 바탕 화면 배경 화면으로 사용합니다.

GetDesktopWindow 함수는 바탕 화면 창에 핸들을 반환합니다.

제어판 항목과 같은 시스템 구성 애플리케이션은 wAction 매개 변수가 SPI_SETDESKWALLPAPER 로 설정된 SystemParametersInfo함수와 비트맵 파일 이름을 지정하는 lpvParam 매개 변수를 사용하여 바탕 화면 배경 화면을 변경합니다. SystemParametersInfo 는 지정된 파일에서 비트맵을 로드하고, 비트맵을 사용하여 화면의 배경을 그리고, 레지스트리에 새 파일 이름을 입력합니다.

Application Windows

모든 그래픽 Windows 기반 애플리케이션은 사용자와 애플리케이션 간의 기본 인터페이스 역할을 하는 기본 창이라고 하는 하나 이상의 창을 만듭니다. 또한 대부분의 애플리케이션은 직접 또는 간접적으로 다른 창을 만들어 기본 창과 관련된 작업을 수행합니다. 각 창은 출력을 표시하고 사용자로부터 입력을 받는 역할을 합니다.

애플리케이션을 시작할 때 시스템은 작업 표시줄 단추도 애플리케이션과 연결합니다. 작업 표시줄 단추에는 프로그램 아이콘과 제목이 포함됩니다. 애플리케이션이 활성화되면 해당 작업 표시줄 단추가 푸시된 상태로 표시됩니다.

애플리케이션 창에는 제목 표시줄, 메뉴 모음, 창 메뉴(이전의 시스템 메뉴), 최소화 단추, 최대화 단추, 복원 단추, 닫기 단추, 크기 조정 테두리, 클라이언트 영역, 가로 스크롤 막대 및 세로 스크롤 막대와 같은 요소가 포함됩니다. 애플리케이션의 기본 창에는 일반적으로 이러한 구성 요소가 모두 포함됩니다. 다음 그림에서는 일반적인 기본 창에서 이러한 구성 요소를 보여 줍니다.

일반적인 창

클라이언트 영역

클라이언트 영역은 애플리케이션이 텍스트 또는 그래픽과 같은 출력을 표시하는 창의 일부입니다. 예를 들어 데스크톱 게시 애플리케이션은 클라이언트 영역에 있는 문서의 현재 페이지를 표시합니다. 애플리케이션은 창에 대한 입력을 처리하고 클라이언트 영역에 출력을 표시하기 위해 창 프로시저라는 함수를 제공해야 합니다. 자세한 내용은 창 프로시저를 참조하세요.

비클라이언트 영역

제목 표시줄, 메뉴 모음, 창 메뉴, 최소화 및 최대화 단추, 크기 조정 테두리 및 스크롤 막대를 창의 비클라이언트 영역이라고 합니다. 시스템은 비클라이언트 영역의 대부분의 측면을 관리합니다. 애플리케이션은 클라이언트 영역의 모양과 동작을 관리합니다.

제목 표시줄에는 애플리케이션 정의 아이콘과 텍스트 줄이 표시됩니다. 일반적으로 텍스트는 애플리케이션의 이름을 지정하거나 창의 용도를 나타냅니다. 애플리케이션은 창을 만들 때 아이콘과 텍스트를 지정합니다. 제목 표시줄을 사용하면 사용자가 마우스 또는 다른 포인팅 장치를 사용하여 창을 이동할 수도 있습니다.

대부분의 애플리케이션에는 애플리케이션에서 지원하는 명령을 나열하는 메뉴 모음 이 포함되어 있습니다. 메뉴 모음의 항목은 명령의 기본 범주를 나타냅니다. 메뉴 모음에서 항목을 클릭하면 일반적으로 항목이 지정된 범주 내의 작업에 해당하는 팝업 메뉴가 열립니다. 명령을 클릭하면 사용자가 애플리케이션에 작업을 수행하도록 지시합니다.

창 메뉴는 시스템에서 만들고 관리합니다. 사용자가 선택할 때 창의 크기 또는 위치를 설정하거나, 애플리케이션을 닫거나, 작업을 수행하는 표준 메뉴 항목 집합이 포함되어 있습니다. 자세한 내용은 메뉴를 참조하세요.

오른쪽 위 모서리에 있는 단추는 창의 크기와 위치에 영향을 줍니다. 최대화 단추를 클릭하면 시스템이 창을 화면 크기로 확대하고 창을 배치하므로 전체 바탕 화면에 작업 표시줄을 빼고 덮습니다. 동시에 시스템은 최대화 단추를 복원 단추로 바꿉니다. 복원 단추를 클릭하면 시스템에서 창을 이전 크기와 위치로 복원합니다. 최소화 단추를 클릭하면 시스템에서 창을 작업 표시줄 단추 크기로 줄이고, 작업 표시줄 단추 위에 창을 배치하고, 작업 표시줄 단추를 정상 상태로 표시합니다. 애플리케이션을 이전 크기 및 위치로 복원하려면 해당 작업 표시줄 단추를 클릭합니다. 닫기 단추를 클릭하면 애플리케이션이 종료됩니다.

크기 조정 테두리는 사용자가 마우스 또는 다른 포인팅 디바이스를 사용하여 창의 크기를 조정할 수 있도록 하는 창 경계 주변 영역입니다.

가로 스크롤 막대세로 스크롤 막대는 마우스 또는 키보드 입력을 애플리케이션이 클라이언트 영역의 내용을 가로 또는 세로로 이동하는 데 사용하는 값으로 변환합니다. 예를 들어 긴 문서를 표시하는 워드 프로세싱 애플리케이션은 일반적으로 사용자가 문서를 위아래로 페이싱할 수 있도록 세로 스크롤 막대를 제공합니다.

컨트롤 및 대화 상자

애플리케이션은 컨트롤 및 대화 상자를 포함하여 기본 창 외에도 여러 유형의 창을 만들 수 있습니다.

컨트롤은 열려는 파일의 이름 또는 텍스트 선택 영역의 원하는 포인트 크기와 같은 사용자로부터 특정 정보를 얻기 위해 애플리케이션에서 사용하는 창입니다. 또한 애플리케이션은 컨트롤을 사용하여 애플리케이션의 특정 기능을 제어하는 데 필요한 정보를 가져옵니다. 예를 들어, 워드 프로세싱 애플리케이션은 일반적으로 사용자가 단어 줄 바꿈을 켜고 끌 수 있도록 하는 컨트롤을 제공합니다. 자세한 내용은 Windows 컨트롤을 참조하세요.

컨트롤은 항상 다른 창(일반적으로 대화 상자)과 함께 사용됩니다. 대화 상자는 하나 이상의 컨트롤이 포함된 창입니다. 애플리케이션은 대화 상자를 사용하여 명령을 완료하는 데 필요한 입력을 사용자에게 표시합니다. 예를 들어 파일을 여는 명령을 포함하는 애플리케이션에는 사용자가 경로 및 파일 이름을 지정하는 컨트롤이 포함된 대화 상자가 표시됩니다. 대화 상자는 일반적으로 기본 창과 동일한 창 구성 요소 집합을 사용하지 않습니다. 대부분 제목 표시줄, 창 메뉴, 테두리(비 크기 조정) 및 클라이언트 영역이 있지만 일반적으로 메뉴 모음, 최소화 및 최대화 단추 또는 스크롤 막대가 없습니다. 자세한 내용은 대화 상자를 참조하세요.

메시지 상자는 사용자에게 메모, 주의 또는 경고를 표시하는 특수 대화 상자입니다. 예를 들어 메시지 상자는 작업을 수행하는 동안 애플리케이션에서 발생한 문제를 사용자에게 알릴 수 있습니다. 자세한 내용은 메시지 상자를 참조하세요.

창 특성

애플리케이션은 창을 만들 때 다음 정보를 제공해야 합니다. ( 창 핸들을 제외하고 생성 함수는 새 창을 고유하게 식별하기 위해 반환됩니다.)

이러한 창 특성은 다음 섹션에서 설명합니다.

클래스 이름

모든 창은 창 클래스에 속합니다. 애플리케이션은 해당 클래스의 창을 만들기 전에 창 클래스를 등록해야 합니다. 창 클래스는 창의 모양과 동작의 대부분의 측면을 정의합니다. 창 클래스의 주요 구성 요소는 창 프로시저이며, 창에 전송된 모든 입력 및 요청을 수신하고 처리하는 함수입니다. 시스템은 메시지 형식으로 입력 및 요청을 제공합니다. 자세한 내용은 창 클래스, 창 프로시저, 메시지 및 메시지 큐를 참조하세요.

창 이름

창 이름은 사용자의 창을 식별하는 텍스트 문자열입니다. 기본 창, 대화 상자 또는 메시지 상자는 일반적으로 창 이름을 제목 표시줄에 표시합니다(있는 경우). 컨트롤의 클래스에 따라 컨트롤의 창 이름이 표시 될 수 있습니다. 예를 들어 단추, 편집 컨트롤 및 정적 컨트롤은 컨트롤이 차지하는 사각형 내에 창 이름을 표시합니다. 그러나 목록 상자 및 콤보 상자와 같은 컨트롤에는 창 이름이 표시되지 않습니다.

창을 만든 후 창 이름을 변경하려면 SetWindowText 함수 를 사용합니다. 이 함수는 GetWindowTextLengthGetWindowText 함수를 사용하여 창에서 현재 창 이름 문자열을 검색합니다.

창 스타일

모든 창에는 하나 이상의 창 스타일이 있습니다. 창 스타일은 창의 클래스에서 지정하지 않은 창 모양 및 동작의 측면을 정의하는 명명된 상수입니다. 애플리케이션은 일반적으로 창을 만들 때 창 스타일을 설정합니다. SetWindowLong 함수를 사용하여 창을 만든 후 스타일을 설정할 수도 있습니다.

시스템 및 클래스의 창 프로시저는 어느 정도 창 스타일을 해석합니다.

일부 창 스타일은 모든 창에 적용되지만 대부분 특정 창 클래스의 창에 적용됩니다. 일반 창 스타일은 WS_ 접두사로 시작하는 상수로 표시됩니다. OR 연산자와 결합하여 기본 창, 대화 상자 및 자식 창을 비롯한 다양한 유형의 창을 형성할 수 있습니다. 클래스별 창 스타일은 미리 정의된 컨트롤 클래스에 속하는 창의 모양과 동작을 정의합니다. 예를 들어 SCROLLBAR 클래스는 스크롤 막대 컨트롤을 지정하지만 SBS_HORZSBS_VERT 스타일에 따라 가로 또는 세로 스크롤 막대 컨트롤이 만들어지는지 여부가 결정됩니다.

창에서 사용할 수 있는 스타일 목록은 다음 topics 참조하세요.

확장 창 스타일

필요에 따라 모든 창에는 하나 이상의 확장된 창 스타일이 있을 수 있습니다. 확장 창 스타일은 창 클래스 또는 다른 창 스타일에 의해 지정되지 않은 창 모양 및 동작의 측면을 정의하는 명명된 상수입니다. 애플리케이션은 일반적으로 창을 만들 때 확장된 창 스타일을 설정합니다. SetWindowLong 함수를 사용하여 창을 만든 후 스타일을 설정할 수도 있습니다.

자세한 내용은 CreateWindowEx를 참조하세요.

위치

창의 위치는 왼쪽 위 모서리의 좌표로 정의됩니다. 창 좌표라고도 하는 이러한 좌표는 항상 화면의 왼쪽 위 모서리 또는 자식 창의 경우 부모 창 클라이언트 영역의 왼쪽 위 모서리를 기준으로 합니다. 예를 들어 좌표(10,10)가 있는 최상위 창은 화면의 왼쪽 위 모서리 오른쪽에 10픽셀, 아래쪽 10픽셀로 배치됩니다. 좌표(10,10)가 있는 자식 창은 부모 창 클라이언트 영역의 왼쪽 위 모서리 오른쪽에 10픽셀, 아래쪽 10픽셀로 배치됩니다.

WindowFromPoint 함수는 화면의 특정 지점을 차지하는 창에 대한 핸들을 검색합니다. 마찬가지로 ChildWindowFromPointChildWindowFromPointEx 함수는 부모 창의 클라이언트 영역에서 특정 지점을 차지하는 자식 창에 대한 핸들을 검색합니다. ChildWindowFromPointEx는 보이지 않는 자식 창, 비활성 및 투명한 자식 창을 무시할 수 있지만 ChildWindowFromPoint는 무시할 수 없습니다.

크기

창의 크기(너비 및 높이)는 픽셀 단위로 지정됩니다. 창의 너비 또는 높이가 0일 수 있습니다. 애플리케이션이 창의 너비와 높이를 0으로 설정하면 시스템은 크기를 기본 최소 창 크기로 설정합니다. 기본 최소 창 크기를 검색하기 위해 애플리케이션은 SM_CXMINSM_CYMIN 플래그와 함께 GetSystemMetrics 함수를 사용합니다.

애플리케이션은 특정 크기의 클라이언트 영역이 있는 창을 만들어야 할 수 있습니다. AdjustWindowRectAdjustWindowRectEx 함수는 클라이언트 영역의 원하는 크기에 따라 필요한 창 크기를 계산합니다. 애플리케이션은 결과 크기 값을 CreateWindowEx 함수에 전달할 수 있습니다.

애플리케이션은 창 크기를 매우 크게 지정할 수 있습니다. 그러나 화면보다 크도록 창의 크기를 조정하면 안 됩니다. 창 크기를 설정하기 전에 애플리케이션은 SM_CXSCREEN 및 SM_CYSCREEN 플래그와 함께 GetSystemMetrics를 사용하여 화면의 너비와 높이를 검사 합니다.

부모 또는 소유자 창 핸들

창에는 부모 창이 있을 수 있습니다. 부모가 있는 창을 자식 창이라고 합니다. 부모 창은 자식 창을 배치하는 데 사용되는 좌표계를 제공합니다. 부모 창이 있으면 창 모양에 영향을 줍니다. 예를 들어 자식 창의 일부가 부모 창의 테두리 밖에 나타나지 않도록 자식 창이 잘립니다.

부모가 없거나 부모가 바탕 화면 창인 창을 최상위 창이라고 합니다. 애플리케이션은 EnumWindows 함수를 사용하여 화면의 각 최상위 창에 대한 핸들을 가져올 수 있습니다. EnumWindows는 각 최상위 창에 핸들을 전달하여 애플리케이션 정의 콜백 함수인 EnumWindowsProc에 전달합니다.

최상위 창은 다른 창을 소유하거나 소유할 수 있습니다. 소유된 창은 항상 소유자 창 앞에 나타나고, 소유자 창이 최소화되면 숨겨지고, 소유자 창이 제거되면 제거됩니다. 자세한 내용은 소유 Windows를 참조하세요.

자식 창에는 자식 창 과 연결된 고유한 애플리케이션 정의 값인 자식 창 식별자가 있을 수 있습니다. 자식 창 식별자는 여러 자식 창을 만드는 애플리케이션에서 특히 유용합니다. 자식 창을 만들 때 애플리케이션은 자식 창의 식별자를 지정합니다. 창을 만든 후 애플리케이션은 SetWindowLong 함수를 사용하여 창의 식별자를 변경하거나 GetWindowLong 함수를 사용하여 식별자를 검색할 수 있습니다.

자식 창을 제외한 모든 창에는 메뉴가 있을 수 있습니다. 애플리케이션은 창의 클래스를 등록할 때 또는 창을 만들 때 메뉴 핸들을 제공하여 메뉴를 포함할 수 있습니다.

애플리케이션 인스턴스 핸들

모든 애플리케이션에는 연결된 instance 핸들이 있습니다. 시스템은 애플리케이션이 시작될 때 애플리케이션에 instance 핸들을 제공합니다. 동일한 애플리케이션의 여러 복사본을 실행할 수 있으므로 시스템은 내부적으로 instance 핸들을 사용하여 애플리케이션의 한 instance 다른 instance 구분합니다. 애플리케이션은 창을 만드는 창을 포함하여 다양한 창에서 instance 핸들을 지정해야 합니다.

데이터 만들기

모든 창에는 애플리케이션 정의 생성 데이터가 연결될 수 있습니다. 창이 처음 만들어지면 시스템에서 데이터에 대한 포인터를 생성 중인 창의 창 프로시저에 전달합니다. 창 프로시저는 데이터를 사용하여 애플리케이션 정의 변수를 초기화합니다.

창 핸들

창을 만든 후 생성 함수는 창을 고유하게 식별하는 창 핸들 을 반환합니다. 창 핸들에는 HWND 데이터 형식이 있습니다. 애플리케이션은 창 핸들을 포함하는 변수를 선언할 때 이 형식을 사용해야 합니다. 애플리케이션은 다른 함수에서 이 핸들을 사용하여 해당 작업을 창으로 전달합니다.

애플리케이션은 FindWindow 함수를 사용하여 지정된 클래스 이름 또는 창 이름을 가진 창이 시스템에 있는지 여부를 검색할 수 있습니다. 이러한 창이 있는 경우 FindWindow 는 창에 대한 핸들을 반환합니다. 검색을 특정 애플리케이션의 자식 창으로 제한하려면 FindWindowEx 함수를 사용합니다.

IsWindow 함수는 창 핸들이 유효한 기존 창을 식별하는지 여부를 결정합니다. 특정 함수의 창 핸들을 대체할 수 있는 특수 상수가 있습니다. 예를 들어 애플리케이션은 SendMessageSendMessageTimeout함수에서 HWND_BROADCAST 사용하거나 MapWindowPoints 함수에서 HWND_DESKTOP 수 있습니다.

창 만들기

애플리케이션 창을 만들려면 CreateWindow 또는 CreateWindowEx 함수를 사용합니다. 창 특성을 정의하는 데 필요한 정보를 제공해야 합니다. CreateWindowEx에는 CreateWindow에 없는 dwExStyle 매개 변수가 있습니다. 그렇지 않으면 함수가 동일합니다. 실제로 CreateWindowdwExStyle 매개 변수를 0으로 설정하여 CreateWindowEx를 호출합니다. 이러한 이유로 이 개요의 나머지 부분에서는 CreateWindowEx만 참조합니다.

이 섹션에서는 다음 항목을 다룹니다.

참고

대화 상자 및 메시지 상자와 같은 특수 용도 창을 만들기 위한 추가 함수가 있습니다. 자세한 내용은 DialogBox, CreateDialogMessageBox를 참조하세요.

 

주 창 만들기

모든 Windows 기반 애플리케이션에는 진입점 함수로 WinMain 이 있어야 합니다. WinMain은 기본 창에 대한 창 클래스를 등록하고 기본 창을 만드는 등 다양한 작업을 수행합니다. WinMainRegisterClass 함수를 호출하여 기본 창 클래스를 등록하고 CreateWindowEx 함수를 호출하여 기본 창을 만듭니다.

WinMain 함수는 애플리케이션을 단일 instance 제한할 수도 있습니다. CreateMutex 함수를 사용하여 명명된 뮤텍스를 만듭니다. GetLastErrorERROR_ALREADY_EXISTS 반환하면 애플리케이션의 또 다른 instance 존재하고(뮤텍스를 만들었음) WinMain을 종료해야 합니다.

시스템은 창을 만든 후 기본 창을 자동으로 표시하지 않습니다. 대신 애플리케이션은 ShowWindow 함수를 사용하여 기본 창을 표시해야 합니다. 기본 창을 만든 후 애플리케이션의 WinMain 함수는 ShowWindow를 호출하여 기본 창에 대한 핸들과 기본 창을 최소화할지 아니면 처음 표시될 때 최대화할지를 지정하는 플래그라는 두 매개 변수를 전달합니다. 일반적으로 플래그는 SW_ 접두사로 시작하는 상수로 설정할 수 있습니다. 그러나 애플리케이션의 기본 창을 표시하기 위해 ShowWindow가 호출되면 플래그를 SW_SHOWDEFAULT 설정해야 합니다. 이 플래그는 애플리케이션을 시작한 프로그램의 지시에 따라 창을 표시하도록 시스템에 지시합니다.

Windows 클래스가 RegisterClass의 유니코드 버전에 등록된 경우 창은 유니코드 메시지만 수신합니다. 창에서 유니코드 문자 집합을 사용하는지 여부를 확인하려면 IsWindowUnicode를 호출합니다.

Window-Creation 메시지

창을 만들 때 시스템은 창의 창 프로시저로 메시지를 보냅니다. 시스템은 클라이언트 영역을 만든 후 창의 비클라이언트 영역과 WM_CREATE 메시지를 만든 후 WM_NCCREATE 메시지를 보냅니다. 창 프로시저는 시스템에서 창을 표시하기 전에 두 메시지를 모두 받습니다. 두 메시지에는 CreateWindowEx 함수에 지정된 모든 정보가 포함된 CREATETRUCT 구조체에 대한 포인터가 포함됩니다. 일반적으로 창 프로시저는 이러한 메시지를 수신할 때 초기화 작업을 수행합니다.

자식 창을 만들 때 시스템은 WM_NCCREATE 보내고 메시지를 WM_CREATE부모 창에 WM_PARENTNOTIFY 메시지를 보냅니다. 창을 만드는 동안 다른 메시지도 보냅니다. 이러한 메시지의 수와 순서는 창 클래스 및 스타일과 창을 만드는 데 사용되는 함수에 따라 달라집니다. 이러한 메시지는 이 도움말 파일의 다른 topics 설명되어 있습니다.

다중 스레드 애플리케이션

Windows 기반 애플리케이션에는 여러 스레드의 실행이 있을 수 있으며 각 스레드는 창을 만들 수 있습니다. 창을 만드는 스레드에는 창 프로시저에 대한 코드가 포함되어야 합니다.

애플리케이션은 EnumThreadWindows 함수를 사용하여 특정 스레드에서 만든 창을 열거할 수 있습니다. 이 함수는 각 스레드 창에 핸들을 전달하여 애플리케이션 정의 콜백 함수인 EnumThreadWndProc에 전달합니다.

GetWindowThreadProcessId 함수는 특정 창을 만든 스레드의 식별자를 반환합니다.

다른 스레드에서 만든 창의 표시 상태를 설정하려면 ShowWindowAsync 함수를 사용합니다.