목록 상자에 대한 정보
목록 상자 컨트롤에는 사용자가 일반적으로 하나 이상의 항목을 선택할 수 있는 간단한 목록이 포함되어 있습니다. 목록 상자는 목록 보기 컨트롤에 비해 제한된 유연성을 제공합니다.
목록 상자 항목은 텍스트 문자열, 비트맵 또는 둘 다로 나타낼 수 있습니다. 목록 상자가 한 번에 모든 목록 상자 항목을 표시할 만큼 크지 않으면 목록 상자에 스크롤 막대가 제공됩니다. 사용자는 목록 상자 항목을 스크롤하여 필요에 따라 선택 상태를 적용하거나 제거합니다. 목록 상자 항목을 선택하면 일반적으로 텍스트 및 배경색을 관련 운영 체제 메트릭에 지정된 색으로 변경하여 시각적 모양이 변경됩니다. 사용자가 항목을 선택하거나 선택 취소하면 시스템에서 목록 상자의 부모 창에 알림 메시지를 보냅니다.
ANSI 애플리케이션의 경우 시스템은 CP_ACP 코드 페이지를 사용하여 목록 상자의 텍스트를 유니코드로 변환합니다. 이로 인해 문제가 발생할 수 있습니다. 예를 들어 Windows의 유니코드가 아닌 목록 상자에서 강조 표시된 로마 문자는 일본어 버전이 왜곡됩니다. 이 문제를 해결하려면 애플리케이션을 유니코드로 컴파일하거나 소유자가 그린 목록 상자를 사용합니다.
이 섹션에서는 다음 항목에 대해 설명합니다.
- 목록 상자 만들기
- 목록 상자 유형 및 스타일
- 목록 상자 함수
- 목록 상자 알림 메시지
- 메시지를 목록 상자로
- 기본 창 메시지 처리
- Owner-Drawn 목록 상자
- 목록 상자 드래그
목록 상자 만들기
대화 상자에서 목록 상자를 만드는 가장 쉬운 방법은 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 전달합니다.
Owner-Drawn 목록 상자
애플리케이션은 목록 항목 그리기를 직접 책임지는 사용자 정의 목록 상자를 만들 수 있습니다. 소유자가 그린 목록 상자의 부모 창 또는 대화 상자(소유자)는 목록 상자의 일부를 그려야 할 때 WM_DRAWITEM 메시지를 받습니다. 소유자가 그린 목록 상자는 텍스트 문자열 이외의 정보를 나열할 수 있습니다.
소유자가 그린 목록 상자의 소유자는 WM_DRAWITEM 메시지를 처리해야 합니다. 이 메시지는 목록 상자의 일부를 다시 그려야 할 때마다 전송됩니다. 소유자는 목록 상자에 지정된 스타일에 따라 다른 메시지를 처리해야 할 수 있습니다.
애플리케이션은 LBS_OWNERDRAWFIXED 또는 LBS_OWNERDRAWVARIABLE 스타일을 지정하여 소유자가 그린 목록 상자를 만들 수 있습니다. 목록 상자의 모든 목록 항목이 문자열 또는 아이콘과 같은 높이가 같으면 애플리케이션에서 LBS_OWNERDRAWFIXED 스타일을 사용할 수 있습니다. 목록 항목의 높이가 다른 경우(예: 크기가 다른 비트맵) 애플리케이션은 LBS_OWNERDRAWVARIABLE 스타일을 사용할 수 있습니다.
소유자가 그린 목록 상자의 소유자는 WM_MEASUREITEM 메시지를 처리하여 목록 항목의 차원을 지정할 수 있습니다. 애플리케이션이 LBS_OWNERDRAWFIXED 스타일을 사용하여 목록 상자를 만드는 경우 시스템은 WM_MEASUREITEM 메시지를 한 번만 보냅니다. 소유자가 지정한 차원은 모든 목록 항목에 사용됩니다. LBS_OWNERDRAWVARIABLE 스타일을 사용하는 경우 시스템은 목록 상자에 추가되는 각 목록 항목에 대한 WM_MEASUREITEM 메시지를 보냅니다. 소유자는 LB_GETITEMHEIGHT 및 LB_SETITEMHEIGHT 메시지를 각각 사용하여 언제든지 목록 항목의 높이를 결정하거나 설정할 수 있습니다.
소유자가 그린 목록 상자에 표시되는 정보에 텍스트가 포함된 경우 애플리케이션은 LBS_HASSTRINGS 스타일을 지정하여 각 목록 항목의 텍스트를 추적할 수 있습니다. LBS_SORT 스타일이 있는 목록 상자는 이 텍스트에 따라 정렬됩니다. 목록 상자가 정렬되어 있지만 LBS_HASSTRINGS 스타일이 아닌 경우 소유자는 WM_COMPAREITEM 메시지를 처리해야 합니다.
소유자가 그린 목록 상자에서 소유자는 텍스트 이외의 정보가 포함된 목록 항목을 추적해야 합니다. 이 작업을 수행하는 편리한 방법 중 하나는 LB_SETITEMDATA 메시지를 사용하여 정보에 대한 핸들을 항목 데이터로 저장하는 것입니다. 목록 상자의 항목과 연결된 데이터 개체를 해제하려면 소유자가 WM_DELETEITEM 메시지를 처리할 수 있습니다.
소유자가 그린 목록 상자의 예는 Owner-Drawn List Box만드는 방법을 참조하세요.
목록 상자 끌기
끌어서 놓기 목록 상자는 사용자가 항목을 한 위치에서 다른 위치로 끌 수 있도록 하는 특수한 유형의 목록 상자입니다. 애플리케이션은 끌어서 놓기 목록 상자를 사용하여 특정 시퀀스의 문자열을 표시하고 사용자가 항목을 위치로 끌어서 시퀀스를 변경할 수 있도록 할 수 있습니다.
드래그 가능 목록 상자 만들기
목록 상자 끌기는 창 스타일이 동일하며 표준 목록 상자와 동일한 메시지를 처리합니다. 끌기 목록 상자를 만들려면 먼저 표준 목록 상자를 만든 다음 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 알림 코드가 전송됩니다. 끌기 목록 상자는 알림을 보내기 전에 마우스 캡처를 해제합니다. 이러한 두 알림의 반환 값은 무시됩니다. 목록 끌기