콤보 상자 정보

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

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

콤보 상자 형식 및 스타일

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

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

콤보 상자 형식 스타일 상수 설명
단순 CBS_SIMPLE 항상 목록을 표시하고 편집 컨트롤에서 선택한 항목을 표시합니다.
Drop-down 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를 보냅니다. 이는 사용자가 완료되었으며 선택 항목을 처리해야 했음을 나타냅니다. CBN_SELENDCANCEL은 사용자가 항목을 선택한 다음 다른 컨트롤을 선택하거나, 드롭다운 목록이 열려 있는 동안 ESC를 누르거나, 대화 상자를 닫을 때 전송됩니다. 이는 사용자의 선택 항목을 무시해야 했음을 나타냅니다. 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를 보냅니다. 목록 항목을 선택한 결과로 선택 필드 콘텐츠가 변경되면 이러한 메시지가 전송되지 않습니다.

소유자가 그린 콤보 상자

애플리케이션은 목록 항목 그리기를 담당하는 소유자가 그린 콤보 상자를 만들 수 있습니다. 소유자가 그린 콤보 상자의 부모 창(해당 소유자)은 콤보 상자의 일부를 그려야 할 때 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를 호출하지 않는다는 점을 제외하고 다른 클래스와 유사합니다. 대신 부모 창 클래스의 창 프로시저에 처리되지 않은 메시지를 전달합니다. 서브클래싱 및 슈퍼클래싱에서 발생할 수 있는 문제를 방지하려면 창 프로시저의 지침을 따릅니다.