다음을 통해 공유


콤보 상자 정보

콤보 상자는 편집 상자 또는 정적 텍스트와 목록을 결합합니다.

이 항목에는 다음 섹션이 포함되어 있습니다.

콤보 상자 형식 및 스타일

콤보 상자는 목록과 선택 필드로 구성됩니다. 목록에는 사용자가 선택할 수 있는 옵션이 표시되고 선택 필드에 현재 선택 영역이 표시됩니다. 선택 필드가 편집 컨트롤인 경우 사용자는 목록에서 사용할 수 없는 정보를 입력할 수 있습니다. 그렇지 않으면 사용자는 목록에서 항목만 선택할 수 있습니다.

공용 컨트롤 라이브러리에는 다음 표와 같이 콤보 상자의 세 가지 기본 스타일이 포함되어 있습니다.

콤보 상자 유형 스타일 상수 묘사
간단한 CBS_SIMPLE 목록을 항상 표시하고 편집 컨트롤에서 선택한 항목을 표시합니다.
드롭다운 CBS_DROPDOWN 아이콘을 클릭할 때 목록을 표시하고 편집 컨트롤에서 선택한 항목을 표시합니다.
드롭다운 리스트(드롭 리스트) CBS_DROPDOWNLIST 아이콘을 클릭할 때 목록을 표시하고 정적 컨트롤에서 선택한 항목을 표시합니다.

 

다음 스크린샷은 각각 Windows Vista에 나타날 수 있는 세 가지 종류의 콤보 상자를 보여 줍니다. 첫 번째 스크린샷에서 사용자는 간단한 콤보 상자에서 항목을 선택했습니다. 사용자는 이 컨트롤의 편집 상자에 새 값을 입력할 수도 있습니다. 목록은 Microsoft Visual Studio 리소스 편집기에서 크기가 조정되었으며 두 항목을 수용할 수 있을 만큼 충분히 큽니다.

스크린샷은 간단한 콤보 상자에서 선택한 항목을 보여 줍니다

두 번째 스크린샷에서 사용자는 드롭다운 콤보 상자의 편집 컨트롤에 새 텍스트를 입력했습니다. 사용자가 기존 항목을 선택했을 수도 있습니다. 목록 상자는 가능한 한 많은 항목을 수용하도록 확장됩니다.

드롭다운 콤보 상자에 입력한 텍스트를 보여주는 스크린샷

세 번째 스크린샷에서 사용자가 드롭다운 목록 콤보 상자를 열었습니다. 목록 상자는 가능한 한 많은 항목을 수용하도록 확장됩니다. 사용자가 새 텍스트를 입력할 수 없습니다.

드롭다운 목록 콤보 상자에서 선택한 항목을 보여 주는 스크린샷

특정 속성을 정의하는 다양한 콤보 상자 스타일도 있습니다. 콤보 상자 스타일은 콤보 상자의 특정 속성을 정의합니다. 스타일을 결합할 수 있습니다. 그러나 일부 스타일은 특정 콤보 상자 형식에만 적용됩니다. 콤보 상자 스타일의 표는 콤보 상자 스타일참조하세요.

메모

콤보 상자에서 비주얼 스타일을 사용하려면 애플리케이션에 매니페스트가 포함되어야 하며 프로그램 시작 시 InitCommonControls 호출해야 합니다. 비주얼 스타일에 대한 자세한 내용은 비주얼 스타일참조하세요. 매니페스트에 대한 정보는 비주얼 스타일 활성화를 참조하세요.

 

콤보 상자 목록

목록은 사용자가 선택할 수 있는 항목을 표시하는 콤보 상자의 부분입니다. 일반적으로 애플리케이션은 콤보 상자를 만들 때 목록의 내용을 초기화합니다. 사용자가 선택한 목록 항목은 현재 선택 항목입니다. 여러 항목을 선택할 수 없습니다. 단순 및 드롭다운 콤보 상자에서 사용자는 목록 항목을 선택하는 대신 선택 필드에 입력할 수 있습니다. 이러한 경우에는 현재 선택 항목이 없으며, 적절한 경우 목록에 항목을 추가하고 현재 선택 영역으로 지정하는 것은 애플리케이션의 책임입니다.

이 섹션에서는 다음 항목에 대해 설명합니다.

현재 선택

현재 선택은 사용자가 선택한 목록 항목입니다. 선택한 텍스트가 콤보 상자의 선택 필드에 나타납니다. 그러나 간단한 콤보 상자 또는 드롭다운 콤보 상자의 경우 현재 선택은 콤보 상자에서 가능한 사용자 입력의 한 형태일 뿐입니다. 사용자는 선택 필드에 텍스트를 입력할 수도 있습니다.

현재 선택은 선택한 목록 항목의 인덱스(0부터 시작하는 인덱스)로 식별됩니다. 애플리케이션은 언제든지 설정하고 검색할 수 있습니다. 사용자가 콤보 상자의 현재 선택을 변경하면 부모 창 또는 대화 상자 프로시저가 알림을 받습니다. 응용 프로그램이 선택을 변경하면 부모 창 또는 대화 상자에 알림이 표시되지 않습니다.

콤보 상자가 만들어지면 현재 선택 항목이 없습니다. 사용자가 선택 필드의 내용을 편집한 경우 단순 또는 드롭다운 콤보 상자에 대해서도 마찬가지입니다. 현재 선택을 설정하기 위해 애플리케이션은 CB_SETCURSEL 메시지를 콤보 상자로 보냅니다. 또한 애플리케이션은 CB_SELECTSTRING 메시지를 사용하여 문자열이 지정된 문자열로 시작하는 목록 항목으로 현재 선택을 설정할 수도 있습니다. 현재 선택을 결정하기 위해 애플리케이션은 CB_GETCURSEL 메시지를 콤보 상자로 보냅니다. 현재 선택 항목이 없으면 이 메시지는 CB_ERR 반환합니다.

사용자가 콤보 상자에서 현재 선택을 변경하면 부모 창 또는 대화 상자 프로시저는 wParam 매개 변수의 상위 단어에 CBN_SELCHANGE 알림 코드가 포함된 WM_COMMAND 메시지를 받습니다. 이 알림 코드는 CB_SETCURSEL 메시지를 사용하여 현재 선택이 설정된 경우 전송되지 않습니다.

드롭다운 콤보 상자 또는 드롭다운 목록 상자는 드롭다운 목록이 닫히면 CBN_CLOSEUP 알림 코드를 부모 창 또는 대화 상자 프로시저로 보냅니다. 사용자가 현재 선택을 변경한 경우 드롭다운 목록이 닫히면 콤보 상자에서 CBN_SELCHANGE 알림 코드도 보냅니다. 사용자가 목록 항목을 선택할 때마다 특정 프로세스를 실행하려면 CBN_SELCHANGE 또는 CBN_CLOSEUP 알림 코드를 처리할 수 있습니다. 일반적으로 현재 선택 영역의 변경 사항을 처리하기 전에 CBN_CLOSEUP 알림 코드를 기다립니다. 이는 상당한 양의 처리가 필요한 경우에 특히 중요할 수 있습니다.

애플리케이션은 CBN_SELENDOKCBN_SELENDCANCEL 알림 코드를 처리할 수도 있습니다. 사용자가 목록 항목을 선택하거나 항목을 선택한 다음 목록을 닫을 때 시스템에서 CBN_SELENDOK 보냅니다. 이는 사용자가 완료했으며 선택 영역을 처리해야 함을 나타냅니다. 사용자가 항목을 선택한 다음 다른 컨트롤을 선택하거나, 드롭다운 목록이 열려 있는 동안 ESC를 누르거나, 대화 상자를 닫을 때 CBN_SELENDCANCEL 전송됩니다. 이는 사용자의 선택을 무시해야 임을 나타냅니다. CBN_SELENDOK 모든 CBN_SELCHANGE 메시지 전에 전송됩니다.

간단한 콤보 상자에서 사용자가 목록 항목을 두 번 클릭하면 시스템에서 CBN_DBLCLK 알림 코드를 보냅니다. 드롭다운 콤보 상자 또는 드롭다운 목록에서 한 번의 클릭으로 목록이 숨겨지므로 항목을 두 번 클릭할 수 없습니다.

특정 알림 및 메시지는 드롭다운 목록이 포함된 콤보 상자에만 적용됩니다. 드롭다운 목록을 열거나 닫으면 콤보 상자의 부모 창에서 WM_COMMAND 메시지 형식으로 알림을 받습니다. 목록이 열리면 wParam의 상위 단어는 CBN_DROPDOWN입니다. 목록이 닫히고 있다면 CBN_CLOSEUP.

애플리케이션은 CB_SHOWDROPDOWN 메시지를 사용하여 드롭다운 콤보 상자 또는 드롭다운 목록 상자 목록을 열 수 있습니다. CB_GETDROPPEDSTATE 메시지를 사용하여 목록이 열려 있는지 여부를 확인할 수 있으며 CB_GETDROPPEDCONTROLRECT 메시지를 사용하여 드롭다운 목록의 좌표를 확인할 수 있습니다. 애플리케이션은 CB_SETDROPPEDWIDTH 메시지를 사용하여 드롭다운 목록의 너비를 늘릴 수도 있습니다.

목차

애플리케이션이 콤보 상자를 만들 때 일반적으로 목록에 하나 이상의 항목을 추가하여 콤보 상자를 초기화합니다. 나중에 애플리케이션에서 목록 항목을 추가 또는 삭제하거나, 목록을 다시 초기화하거나, 항목 정보를 검색할 수 있습니다.

애플리케이션은 CB_ADDSTRING 메시지를 전송하여 목록 항목을 콤보 상자에 추가합니다. 지정된 항목이 목록의 끝에 추가되거나 정렬된 콤보 상자에서 항목의 문자열에 따라 올바른 정렬된 위치에 추가됩니다. 정렬되지 않은 콤보 상자에서 애플리케이션은 CB_INSERTSTRING 메시지를 사용하여 특정 위치에 항목을 삽입할 수 있습니다. 추가되면 목록 항목이 해당 위치로 식별됩니다.

애플리케이션은 CB_FINDSTRING 또는 CB_FINDSTRINGEXACT 메시지를 사용하여 목록 항목의 위치를 확인할 수 있습니다. CB_FINDSTRING 문자열이 지정된 문자열로 시작하는 항목을 찾습니다. CB_FINDSTRINGEXACT 문자열이 문자열과 정확히 일치하는 항목을 찾습니다. 두 메시지 모두 대/소문자를 구분하지 않습니다.

애플리케이션은 CB_DELETESTRING 메시지를 사용하여 목록 항목을 제거할 수 있습니다. 애플리케이션이 콤보 상자 목록을 다시 초기화해야 하는 경우 먼저 CB_RESETCONTENT 메시지를 사용하여 전체 콘텐츠를 지울 수 있습니다. 콤보 상자가 이미 표시된 후 목록에 여러 항목을 추가하는 경우 애플리케이션은 다시 그리기 플래그를 지워 각 항목이 추가된 후 콤보 상자가 다시 그려지는 것을 방지할 수 있습니다. 다시 그리는 방법에 대한 자세한 내용은 WM_SETREDRAW 메시지에 대한 설명을 참조하세요.

목록 항목과 연결된 문자열을 검색하기 위해 애플리케이션에서 CB_GETLBTEXT 메시지를 사용할 수 있습니다. 항목의 문자열은 애플리케이션에서 지정한 버퍼에 복사됩니다. 버퍼가 문자열을 받을 만큼 충분히 큰지 확인하기 위해 애플리케이션은 먼저 CB_GETLBTEXTLEN 메시지를 사용하여 문자열의 길이를 결정할 수 있습니다. 콤보 상자에서 목록 항목 수를 가져오려면 애플리케이션에서 CB_GETCOUNT 메시지를 사용할 수 있습니다.

컨트롤 선택 필드 편집

애플리케이션은 선택 필드의 내용을 검색하거나 설정할 수 있으며 편집 선택 영역을 결정하거나 설정할 수 있습니다. 애플리케이션은 사용자가 선택 필드에 입력할 수 있는 텍스트의 양을 제한할 수도 있습니다. 선택 필드의 내용이 변경되면 시스템에서 부모 창 또는 대화 상자 프로시저에 알림 메시지를 보냅니다.

선택 필드의 콘텐츠를 검색하기 위해 애플리케이션은 WM_GETTEXT 메시지를 콤보 상자에 보낼 수 있습니다. 단순 또는 드롭다운 콤보 상자의 선택 필드 내용을 설정하기 위해 애플리케이션은 WM_SETTEXT 메시지를 콤보 상자에 보낼 수 있습니다.

편집 선택 영역은 단순 또는 드롭다운 콤보 상자의 선택 필드에 선택한 텍스트의 범위(있는 경우)입니다. 애플리케이션은 CB_GETEDITSEL 메시지를 사용하여 현재 선택 영역의 시작 및 끝 문자 위치를 확인할 수 있습니다. CB_SETEDITSEL 메시지를 사용하여 편집 선택 영역에서 문자를 선택할 수도 있습니다.

처음에는 사용자가 선택 필드에 입력할 수 있는 텍스트의 양이 선택 필드의 크기로 제한됩니다. 그러나 콤보 상자에 CBS_AUTOHSCROLL 스타일이 있는 경우 텍스트는 선택 필드의 크기를 넘어 계속할 수 있습니다. 애플리케이션은 CB_LIMITTEXT 메시지를 사용하여 컨트롤에 CBS_AUTOHSCROLL 스타일이 있는지 여부에 관계없이 사용자가 선택 필드에 입력할 수 있는 텍스트의 양을 제한할 수 있습니다.

사용자가 선택 필드의 내용을 편집하면 부모 창 또는 대화 상자 프로시저가 알림 메시지를 받습니다. 선택 필드의 텍스트가 편집되었음을 나타내는 CBN_EDITUPDATE 알림 코드가 먼저 전송됩니다. 변경된 텍스트가 표시되면 시스템에서 CBN_EDITCHANGE보냅니다. 목록 항목을 선택한 결과로 선택 필드 콘텐츠가 변경되면 이러한 메시지가 전송되지 않습니다.

Owner-Drawn 콤보 상자

애플리케이션은 목록 항목 그리기를 담당하는 소유자가 그린 콤보 상자를 만들 수 있습니다. 소유자가 그린 방식의 콤보 상자의 부모 창의 소유자는 콤보 상자의 일부를 그려야 할 필요가 있을 때 WM_DRAWITEM 메시지를 수신합니다. 소유자가 그린 콤보 상자는 텍스트 문자열 이외의 정보를 나열할 수 있습니다. 소유자가 그린 콤보 상자는 모든 형식일 수 있습니다. 그러나 단순 또는 드롭다운 콤보 상자의 편집 컨트롤은 텍스트만 표시할 수 있으며 소유자는 드롭다운 목록 상자에 선택 필드를 그립니다.

소유자가 그린 콤보 상자의 소유자는 WM_DRAWITEM 메시지를 처리해야 합니다. 이 메시지는 콤보 상자의 일부를 다시 그려야 할 때마다 전송됩니다. 소유자는 콤보 상자에 지정된 스타일에 따라 다른 메시지를 처리해야 할 수 있습니다.

애플리케이션은 CBS_OWNERDRAWFIXED 또는 CBS_OWNERDRAWVARIABLE 스타일을 지정하여 소유자가 그린 콤보 상자를 만들 수 있습니다. 콤보 상자의 모든 목록 항목이 문자열이나 아이콘과 같은 높이가 같으면 애플리케이션에서 CBS_OWNERDRAWFIXED 스타일을 사용할 수 있습니다. 목록 항목의 높이가 다른 경우(예: 크기가 다른 비트맵) 애플리케이션은 CBS_OWNERDRAWVARIABLE 스타일을 사용할 수 있습니다.

소유자가 그린 콤보 상자의 소유자는 WM_MEASUREITEM 메시지를 처리하여 콤보 상자에서 목록 항목의 크기를 지정할 수 있습니다. 애플리케이션이 CBS_OWNERDRAWFIXED 스타일을 사용하여 콤보 상자를 만드는 경우 시스템은 WM_MEASUREITEM 메시지를 한 번만 보냅니다. 소유자가 지정한 차원은 모든 목록 항목에 사용됩니다. CBS_OWNERDRAWVARIABLE 스타일을 사용하는 경우 시스템은 콤보 상자에 추가된 각 목록 항목에 대한 WM_MEASUREITEM 메시지를 보냅니다. 소유자는 CB_GETITEMHEIGHTCB_SETITEMHEIGHT 메시지를 각각 사용하여 언제든지 목록 항목의 높이를 결정하거나 설정할 수 있습니다.

소유자가 그린 콤보 상자에 표시되는 정보에 텍스트가 포함된 경우 애플리케이션은 CBS_HASSTRINGS 스타일을 지정하여 각 목록 항목의 텍스트를 추적할 수 있습니다. CBS_SORT 스타일이 있는 콤보 상자는 이 텍스트에 따라 정렬됩니다. 콤보 상자가 CBS_HASSTRINGS 스타일이 아닌 정렬된 경우 소유자는 WM_COMPAREITEM 메시지를 처리해야 합니다.

소유자가 그린 콤보 상자에서 소유자는 텍스트 이외의 정보가 포함된 목록 항목을 추적해야 합니다. 이 작업을 수행하는 편리한 한 가지 방법은 정보에 대한 핸들을 항목 데이터로 저장하는 것입니다. 콤보 상자의 항목과 연결된 데이터 개체를 해제하려면 소유자가 WM_DELETEITEM 메시지를 처리할 수 있습니다.

서브클래스된 콤보 상자

서브클래싱은 애플리케이션이 창에 전송되거나 게시된 메시지를 가로채서 처리할 수 있도록 하는 프로시저입니다. 서브클래싱을 사용하면 대부분의 메시지 처리를 클래스 정의 창 프로시저에 맡기면서 애플리케이션에서 특정 메시지에 대한 자체 처리를 대체할 수 있습니다.

운영 체제에서 창을 만들 때 창 프로시저에 대한 포인터를 포함하는 내부 데이터 구조에 해당 창에 대한 정보를 저장합니다. 창을 서브클래스하기 위해 애플리케이션은 SetClassLong 함수를 호출하여 해당 프로시저에 대한 포인터를 애플리케이션 정의 하위 클래스 프로시저에 대한 포인터로 바꿉다. 그 후 창에 대한 모든 메시지가 하위 클래스 프로시저로 전송됩니다. 그런 다음 이 프로시저는 CallWindowProc 함수를 사용하여 처리되지 않은 메시지를 원래 창 프로시저에 전달합니다. COMBOBOX 클래스 창 프로시저에서 수행하는 메시지 처리에 대한 설명은 기본 콤보 상자 동작참조하세요.

콤보 상자가 대화 상자 외부에 있는 경우 애플리케이션은 하위 클래스 프로시저를 사용하지 않는 한 TAB, ENTER 및 ESC 키를 처리할 수 없습니다. 단순 또는 드롭다운 콤보 상자가 입력 포커스를 받으면 포커스를 해당 자식 편집 컨트롤로 즉시 설정합니다. 따라서 애플리케이션은 편집 컨트롤을 서브클래스하여 단순형 또는 드롭다운 콤보 상자에 대한 키보드 입력을 가로채야 합니다. 이에 대한 예제는 콤보 상자서브클래싱을 참조하세요.

하위 클래스 프로시저가 WM_PAINT 메시지를 처리하는 경우 BeginPaint 함수를 사용하여 그리기를 준비해야 합니다. EndPaint 함수를 호출하기 전에 디바이스 컨텍스트(DC) 핸들을 창 프로시저에 대한 wParam 매개 변수로 전달합니다. EndPaint가 먼저 호출되면, EndPaint가 전체 창을 유효화하기 때문에 클래스 창 프로시저에서는 그리기를 수행하지 않습니다.

서브클래싱과 관련된 기술은 슈퍼클래싱입니다. 슈퍼 클래스는 창 프로시저가 처리되지 않은 메시지를 처리하기 위해 DefWindowProc 호출하지 않는다는 점을 제외하고 다른 클래스와 비슷합니다. 대신 부모 창 클래스의 창 프로시저에 처리되지 않은 메시지를 전달합니다. 서브클래싱 및 슈퍼클래싱에서 발생할 수 있는 문제를 방지하려면 창 프로시저 지침을 따릅니다.