다음을 통해 공유


목록 상자 정보

목록 상자 컨트롤에는 사용자가 일반적으로 하나 이상의 항목을 선택할 수 있는 간단한 목록이 포함되어 있습니다. 목록 상자는 목록 뷰 컨트롤에 비해 제한된 유연성을 제공합니다.

목록 상자 항목은 텍스트 문자열, 비트맵 또는 둘 다로 나타낼 수 있습니다. 목록 상자가 모든 목록 상자 항목을 한 번에 표시할 만큼 충분히 크지 않은 경우 목록 상자는 스크롤 막대를 제공합니다. 사용자는 목록 상자 항목을 스크롤하고 필요에 따라 선택 상태를 적용하거나 제거합니다. 목록 상자 항목을 선택하면 일반적으로 텍스트 및 배경색을 관련 운영 체제 메트릭에서 지정한 색으로 변경하여 시각적 모양이 변경됩니다. 사용자가 항목을 선택하거나 선택 취소하면 시스템은 목록 상자의 부모 창에 알림 메시지를 보냅니다.

ANSI 애플리케이션의 경우 시스템은 CP_ACP 코드 페이지를 사용하여 목록 상자의 텍스트를 유니코드로 변환합니다. 이로 인해 문제가 발생할 수 있습니다. 예를 들어, 일본어 버전의 Windows에서 유니코드가 아닌 목록 상자에 있는 악센트 부호가 있는 로마 문자는 깨져서 표시됩니다. 이 문제를 해결하려면 애플리케이션을 유니코드로 컴파일하거나 소유자가 그린 목록 상자를 사용해야 합니다.

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

목록 상자 만들기

대화 상자에서 목록 상자를 만드는 가장 쉬운 방법은 Microsoft Visual Studio의 도구 상자에서 대화 상자 리소스로 끌어오는 것입니다. 동적으로 목록 상자를 만들거나 대화 상자가 아닌 창에서 목록 상자를 만들려면 CreateWindowEx 함수를 사용하여 WC_LISTBOX 창 클래스와 적절한 목록 상자 스타일을 지정합니다.

목록 상자 형식 및 스타일

목록 상자에는 단일 선택(기본값)과 다중 선택의 두 가지 형식이 있습니다. 단일 선택 목록 상자에서 사용자는 한 번에 하나의 항목만 선택할 수 있습니다. 다중 선택 목록 상자에서 사용자는 한 번에 둘 이상의 항목을 선택할 수 있습니다. 다중 선택 목록 상자를 만들려면 LBS_MULTIPLESEL 또는 LBS_EXTENDEDSEL 스타일을 지정합니다.

목록 상자의 모양과 작동은 목록 상자 스타일과 창 스타일에 의해 제어됩니다. 이러한 스타일은 목록이 정렬되었는지, 여러 열로 정렬되었는지, 애플리케이션에 의해 그려지는지 등을 나타냅니다. 목록 상자의 크기와 스타일은 일반적으로 애플리케이션 리소스에 포함된 대화 상자 템플릿에서 정의됩니다.

참고

이러한 컨트롤과 함께 시각적 스타일을 사용하려면 애플리케이션에 매니페스트가 포함되어야 하며 프로그램 시작 시 InitCommonControls를 호출해야 합니다. 시각적 스타일에 대한 자세한 내용은 시각적 스타일을 참조하세요. 매니페스트에 대한 자세한 내용은 시각적 스타일 사용을 참조하세요.

목록 상자 함수

DlgDirList 함수는 목록 상자의 콘텐츠를 지정된 조건 집합과 일치하는 드라이브, 디렉터리 및 파일의 이름으로 바꿉니다. DlgDirSelectEx 함수는 DlgDirList에 의해 초기화된 목록 상자에서 현재 선택 항목을 검색합니다. 이러한 함수를 통해 사용자는 파일의 위치와 이름을 입력하지 않고도 목록 상자에서 드라이브, 디렉터리 또는 파일을 선택할 수 있습니다.

또한 GetListBoxInfo 함수는 지정된 목록 상자의 열당 항목 수를 반환합니다.

목록 상자의 알림 메시지

목록 상자에서 이벤트가 발생하면 목록 상자는 소유자 창의 대화 상자 프로시저에 WM_COMMAND 메시지 형식의 알림 코드를 보냅니다. 목록 상자 알림 코드는 사용자가 목록 상자 항목을 선택, 더블 클릭 또는 취소하는 경우, 목록 상자가 키보드 포커스를 받거나 잃는 경우 그리고 시스템이 목록 상자 요청에 충분한 메모리를 할당할 수 없는 경우에 전송됩니다. WM_COMMAND 메시지에는 wParam 매개 변수의 하위 단어에 있는 목록 상자 식별자와 상위 단어에 있는 알림 코드가 포함되어 있습니다. lParam 매개 변수는 컨트롤 창 핸들을 포함합니다.

이러한 메시지를 처리하는 데 대화 상자 프로시저가 필요하지 않습니다. 기본 창 프로시저는 이를 처리합니다.

애플리케이션은 다음 목록 상자 알림 코드를 모니터링하고 처리해야 합니다.

알림 코드 설명
LBN_DBLCLK 사용자가 목록 상자에서 항목을 두 번 클릭합니다.
LBN_ERRSPACE 목록 상자가 요청을 이행하기에 충분한 메모리를 할당할 수 없습니다.
LBN_KILLFOCUS 목록 상자가 키보드 포커스를 잃습니다.
LBN_SELCANCEL 사용자가 목록 상자에서 항목 선택을 취소합니다.
LBN_SELCHANGE 목록 상자의 선택 항목이 변경됩니다.
LBN_SETFOCUS 목록 상자가 키보드 포커스를 받습니다.

목록 상자에 대한 메시지

대화 상자 프로시저는 목록 상자 항목을 추가, 삭제, 검사 및 변경하기 위해 목록 상자에 메시지를 보낼 수 있습니다. 예를 들어, 대화 상자 프로시저는 항목을 추가하기 위해 목록 상자에 LB_ADDSTRING 메시지를 보내고 항목이 선택되었는지 확인하기 위해 LB_GETSEL 메시지를 보낼 수 있습니다. 다른 메시지는 목록 상자의 크기, 모양 및 동작에 대한 정보를 설정하고 검색합니다. 예를 들어, LB_SETHORIZONTALEXTENT 메시지는 목록 상자의 스크롤 가능한 너비를 설정합니다. 대화 상자 프로시저는 SendMessage 또는 SendDlgItemMessage 함수를 사용하여 목록 상자에 모든 메시지를 보낼 수 있습니다.

목록 상자 항목은 종종 목록 상자에서 항목의 위치를 나타내는 정수인 인덱스로 참조됩니다. 목록 상자에 있는 첫 번째 항목의 인덱스는 0이고 두 번째 항목의 인덱스는 1입니다.

다음 표에서는 미리 정의된 목록 상자 프로시저가 목록 상자 메시지에 응답하는 방법을 설명합니다.

메시지 응답
LB_ADDFILE DlgDirList 함수로 채워진 디렉터리 목록 상자에 파일을 삽입하고 삽입된 항목의 목록 상자 인덱스를 검색합니다.
LB_ADDSTRING 목록 상자에 문자열을 추가하고 해당 인덱스를 반환합니다.
LB_DELETESTRING 목록 상자에서 문자열을 제거하고 목록에 남아 있는 문자열 수를 반환합니다.
LB_DIR 목록 상자에 파일 이름 목록을 추가하고 추가된 마지막 파일 이름의 인덱스를 반환합니다.
LB_FINDSTRING 지정된 문자열로 시작하는 목록 상자의 첫 번째 문자열 인덱스를 반환합니다.
LB_FINDSTRINGEXACT 지정된 문자열과 동일한 목록 상자의 문자열 인덱스를 반환합니다.
LB_GETANCHORINDEX 마우스가 마지막으로 선택한 항목의 인덱스를 반환합니다.
LB_GETCARETINDEX 포커스 사각형이 있는 항목의 인덱스를 반환합니다.
LB_GETCOUNT 목록 상자의 항목 수를 반환합니다.
LB_GETCURSEL 현재 선택된 항목의 인덱스를 반환합니다.
LB_GETHORIZONTALEXTENT 목록 상자의 스크롤 가능한 너비를 픽셀 단위로 반환합니다.
LB_GETITEMDATA 지정된 항목과 관련된 값을 반환합니다.
LB_GETITEMHEIGHT 목록 상자에 있는 항목의 높이를 픽셀 단위로 반환합니다.
LB_GETITEMRECT 지정된 목록 상자 항목의 클라이언트 좌표를 검색합니다.
LB_GETLOCALE 목록 상자의 로캘을 검색합니다. 상위 단어에는 국가/지역 코드가 포함되고 하위 단어에는 언어 식별자가 포함됩니다.
LB_GETSEL 목록 상자 항목의 선택 상태를 반환합니다.
LB_GETSELCOUNT 다중 선택 목록 상자에서 선택한 항목의 수를 반환합니다.
LB_GETSELITEMS 다중 선택 목록 상자에서 선택한 모든 항목의 인덱스 배열을 만들고 선택한 항목의 총 수를 반환합니다.
LB_GETTEXT 지정된 항목과 관련된 문자열 및 문자열의 길이를 검색합니다.
LB_GETTEXTLEN 지정된 항목과 관련된 문자열의 길이를 문자로 반환합니다.
LB_GETTOPINDEX 목록 상자에서 처음으로 보이는 항목의 인덱스를 반환합니다.
LB_INITSTORAGE 지정된 수의 항목 및 관련 문자열에 대한 메모리를 할당합니다.
LB_INSERTSTRING 목록 상자의 지정된 인덱스에 문자열을 삽입합니다.
LB_ITEMFROMPOINT 목록 상자에서 지정된 지점에 가장 가까운 항목의 인덱스(0부터 시작)를 검색합니다.
LB_RESETCONTENT 목록 상자에서 모든 항목을 제거합니다.
LB_SELECTSTRING 지정된 접두사와 일치하는 첫 번째 문자열을 선택합니다.
LB_SELITEMRANGE 목록 상자에서 지정된 범위의 항목을 선택합니다.
LB_SELITEMRANGEEX 범위의 첫 번째 항목 인덱스가 범위의 마지막 항목 인덱스보다 작은 경우 지정된 항목 범위를 선택합니다. 첫 번째 항목의 인덱스가 마지막 항목보다 크면 범위에서 선택을 취소합니다.
LB_SETANCHORINDEX 마우스가 마지막으로 선택한 항목을 지정된 항목으로 설정합니다.
LB_SETCARETINDEX 포커스 사각형을 지정된 목록 상자 항목으로 설정합니다.
LB_SETCOLUMNWIDTH 목록 상자에 있는 모든 열의 너비를 픽셀 단위로 설정합니다.
LB_SETCOUNT 목록 상자의 항목 수를 설정합니다.
LB_SETCURSEL 지정된 목록 상자 항목을 선택합니다.
LB_SETHORIZONTALEXTENT 목록 상자의 스크롤 가능한 너비(픽셀)를 설정합니다.
LB_SETITEMDATA 값을 목록 상자 항목과 연결합니다.
LB_SETITEMHEIGHT 목록 상자에 있는 항목의 높이(픽셀)를 설정합니다.
LB_SETLOCALE 목록 상자의 로캘을 설정하고 이전 로캘 식별자를 반환합니다.
LB_SETSEL 다중 선택 목록 상자에서 항목을 선택합니다.
LB_SETTABSTOPS 탭 정지를 지정된 배열에 지정된 것으로 설정합니다.
LB_SETTOPINDEX 지정된 항목이 가시 범위의 맨 위에 오도록 목록 상자를 스크롤합니다.

기본 창 메시지 처리

미리 정의된 목록 상자 창 클래스에 대한 창 프로시저는 목록 상자가 처리하지 않는 모든 메시지에 대해 기본 처리를 수행합니다. 목록 상자 프로시저가 메시지에 대해 FALSE를 반환하면 미리 정의된 창 프로시저는 메시지를 확인하고 다음 표에 표시된 대로 기본 작업을 수행합니다.

메시지 기본 작업
WM_CHAR 사용자가 입력한 문자로 시작하는 첫 번째 항목으로 선택 항목을 이동합니다. 목록 상자에 LBS_OWNERDRAW 스타일이 있으면 아무 작업도 수행되지 않습니다. 짧은 간격 내에 입력된 여러 문자는 그룹으로 처리되며 해당 문자로 시작하는 첫 번째 항목이 선택됩니다.
WM_CREATE 빈 목록 상자를 만듭니다.
WM_DESTROY 목록 상자를 제거하고 사용하는 모든 리소스를 해제합니다.
메시지를 대화 상자 프로시저나 부모 창 프로세스로 전달합니다.
WM_ENABLE 컨트롤이 표시되면 문자열을 회색으로 표시할 수 있도록 사각형을 무효화합니다.
WM_ERASEBKGND 목록 상자의 배경을 지웁니다. 목록 상자에 LBS_OWNERDRAW 스타일이 있으면 배경이 지워지지 않습니다.
WM_GETDLGCODE 반환 DLGC_WANTARROWS | DLGC_WANTCHARS는 기본 목록 상자 프로시저가 화살표 키와 WM_CHAR 메시지를 처리함을 나타냅니다.
WM_GETFONT 목록 상자의 현재 글꼴에 대한 핸들을 반환합니다.
WM_HSCROLL 목록 상자를 가로로 스크롤합니다.
WM_KEYDOWN 스크롤을 위한 가상 키를 처리합니다. 가상 키는 캐럿을 이동할 항목의 인덱스입니다. 선택은 변경되지 않습니다.
WM_KILLFOCUS 캐럿을 끄고 제거합니다. 목록 상자의 소유자에게 LBN_KILLFOCUS 알림 코드를 보냅니다.
WM_LBUTTONDBLCLK 목록 상자 클라이언트 영역에서 마우스를 추적합니다. 이렇게 하면 목록 상자 클라이언트 영역 밖에 마우스 단추를 놓아 사용자가 선택을 취소할 수 있습니다.
WM_LBUTTONDOWN 목록 상자 클라이언트 영역에서 마우스를 추적합니다. 이렇게 하면 목록 상자 클라이언트 영역 밖에 마우스 단추를 놓아 사용자가 선택을 취소할 수 있습니다.
WM_LBUTTONUP 목록 상자 클라이언트 영역에서 마우스를 추적합니다. 이렇게 하면 목록 상자 클라이언트 영역 밖에 마우스 단추를 놓아 사용자가 선택을 취소할 수 있습니다.
WM_MOUSEMOVE 목록 상자 클라이언트 영역에서 마우스를 추적합니다. 이렇게 하면 목록 상자 클라이언트 영역 밖에 마우스 단추를 놓아 사용자가 선택을 취소할 수 있습니다.
WM_PAINT DC(디바이스 컨텍스트)에 대한 목록 상자 핸들을 사용하여 하위 클래스로 분류된 그리기 작업을 수행합니다.
WM_SETFOCUS 캐럿을 켜고 목록 상자의 소유자에게 LBN_SETFOCUS 알림 코드를 보냅니다.
WM_SETFONT 목록 상자의 새 글꼴을 설정합니다.
WM_SETREDRAW wParam 값에 따라 다시 그리기 플래그를 설정하거나 지웁니다.
WM_SIZE 목록 상자의 크기를 정수 항목 수로 조정합니다.
WM_VSCROLL 목록 상자를 세로로 스크롤합니다.

미리 정의된 목록 상자 프로시저는 기본 처리를 위해 다른 모든 메시지를 DefWindowProc에 전달합니다.

소유자가 그린 목록 상자

애플리케이션은 소유자가 그린 목록 상자를 만들어 목록 항목 그리기를 담당할 수 있습니다. 소유자가 그린 목록 상자(소유자)의 부모 창 또는 대화 상자는 목록 상자의 일부를 그려야 할 때 WM_DRAWITEM 메시지를 받습니다. 소유자가 그린 목록 상자는 텍스트 문자열 이외의 또는 추가 정보를 나열할 수 있습니다.

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

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

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

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

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

소유자가 그린 목록 상자의 예는 소유자가 그린 목록 상자를 만드는 방법을 참조하세요.

끌기 목록 상자

끌기 목록 상자는 사용자가 한 위치에서 다른 위치로 항목을 끌 수 있는 특별한 형식의 목록 상자입니다. 애플리케이션은 끌기 목록 상자를 사용하여 문자열을 특정 시퀀스로 표시하고 사용자가 항목을 위치로 끌어서 시퀀스를 변경할 수 있도록 합니다.

끌기 목록 상자 만들기

끌기 목록 상자는 동일한 창 스타일을 가지며 표준 목록 상자와 동일한 메시지를 처리합니다. 끌기 목록 상자를 만들려면 먼저 표준 목록 상자를 만든 다음 MakeDragList 함수를 호출합니다. 대화 상자의 목록 상자를 끌기 목록 상자로 변환하려면 WM_INITDIALOG 메시지가 처리될 때 MakeDragList를 호출하면 됩니다.

목록 상자 메시지 끌기

끌기 목록 상자가 끌기 목록 메시지를 보내 부모 창에 끌기 이벤트를 알립니다. 부모 창이 끌기 목록 메시지를 처리해야 합니다.

끌기 목록 상자가 MakeDragList 함수가 호출될 때 이 메시지를 등록합니다. 끌기 목록 메시지의 메시지 식별자(숫자 값)를 검색하려면 RegisterWindowMessage 함수를 호출하고 DRAGLISTMSGSTRING 값을 지정합니다.

끌기 목록 메시지의 wParam 매개 변수는 끌기 목록 상자의 컨트롤 식별자입니다. lParam 매개 변수는 끌기 이벤트 및 기타 정보에 대한 알림 코드를 포함하는 DRAGLISTINFO 구조체의 주소입니다. 메시지의 반환 값은 알림에 따라 다릅니다.

끌기 목록 상자 알림 코드

끌기 목록 메시지에 포함된 DRAGLISTINFO 구조체의 uNotification 멤버로 식별되는 끌기 목록 알림 코드는 DL_BEGINDRAG, DL_DRAGGING, DL_CANCELDRAG 또는 DL_DROPPED일 수 있습니다.

커서가 목록 항목에 있고 사용자가 마우스 왼쪽 단추를 클릭하면 DL_BEGINDRAG 알림 코드가 전송됩니다. 부모 창은 끌기 작업을 시작하려면 TRUE를 반환하고 끌기를 허용하지 않으려면 FALSE를 반환할 수 있습니다. 이러한 방식으로 부모 창은 일부 목록 항목에 대해 끌기를 사용하도록 설정하고 다른 항목에 대해서는 끌기를 사용하지 않도록 설정할 수 있습니다. LBItemFromPt 함수를 사용하여 지정된 위치에 있는 목록 항목을 확인할 수 있습니다.

끌기가 유효한 경우 마우스를 움직일 때마다 또는 마우스를 움직이지 않으면 일정한 간격으로 DL_DRAGGING 알림 코드가 전송됩니다. 부모 창은 먼저 LBItemFromPt를 사용하여 커서 아래에 있는 목록 항목을 결정한 다음 DrawInsert 함수를 사용하여 삽입 아이콘을 그려야 합니다. LBItemFromPtbAutoScroll 매개 변수에 TRUE를 지정하여 커서가 클라이언트 영역 위 또는 아래에 있는 경우 목록 상자가 한 줄씩 스크롤되도록 할 수 있습니다. 이 알림에 대해 반환하는 값은 끌기 목록 상자가 설정해야 하는 마우스 커서 형식을 지정합니다.

사용자가 마우스 오른쪽 단추를 클릭하거나 ESC 키를 눌러 끌기 작업을 취소하면 DL_CANCELDRAG 알림 코드가 전송됩니다. DL_DROPPED 알림 코드는 커서가 목록 항목 위에 있지 않더라도 사용자가 마우스 왼쪽 단추를 놓아 끌기 작업을 완료하면 전송됩니다. 끌기 목록 상자는 알림을 보내기 전에 마우스 캡처를 해제합니다. 이 두 알림의 반환 값은 무시됩니다. 끌기 목록