CListBox
수업
Windows 목록 상자의 기능을 제공합니다.
class CListBox : public CWnd
속성 | 설명 |
---|---|
CListBox::CListBox |
CListBox 개체를 생성합니다. |
이름 | 설명 |
---|---|
CListBox::AddString |
목록 상자에 문자열을 추가합니다. |
CListBox::CharToItem |
문자열이 없는 소유자 그리기 목록 상자에 대한 사용자 지정 WM_CHAR 처리를 제공하도록 재정의합니다. |
CListBox::CompareItem |
정렬된 소유자 그리기 목록 상자에서 새 항목의 위치를 결정하기 위해 프레임워크에서 호출됩니다. |
CListBox::Create |
Windows 목록 상자를 만들어 개체에 CListBox 연결합니다. |
CListBox::DeleteItem |
사용자가 소유자 그리기 목록 상자에서 항목을 삭제할 때 프레임워크에서 호출됩니다. |
CListBox::DeleteString |
목록 상자에서 문자열을 삭제합니다. |
CListBox::Dir |
현재 디렉터리의 파일 이름, 드라이브 또는 둘 다를 목록 상자에 추가합니다. |
CListBox::DrawItem |
소유자 그리기 목록 상자의 시각적 측면이 변경되면 프레임워크에서 호출됩니다. |
CListBox::FindString |
목록 상자에서 문자열을 검색합니다. |
CListBox::FindStringExact |
지정된 문자열과 일치하는 첫 번째 목록 상자 문자열을 찾습니다. |
CListBox::GetAnchorIndex |
목록 상자에서 현재 앵커 항목의 인덱스(0부터 시작하는 인덱스)를 검색합니다. |
CListBox::GetCaretIndex |
다중 선택 목록 상자에 포커스 사각형이 있는 항목의 인덱스를 결정합니다. |
CListBox::GetCount |
목록 상자의 문자열 수를 반환합니다. |
CListBox::GetCurSel |
목록 상자에서 현재 선택한 문자열의 인덱스(0부터 시작하는 인덱스)를 반환합니다. |
CListBox::GetHorizontalExtent |
목록 상자를 가로로 스크롤할 수 있는 너비를 픽셀 단위로 반환합니다. |
CListBox::GetItemData |
목록 상자 항목과 연결된 값을 반환합니다. |
CListBox::GetItemDataPtr |
목록 상자 항목에 대한 포인터를 반환합니다. |
CListBox::GetItemHeight |
목록 상자에서 항목의 높이를 결정합니다. |
CListBox::GetItemRect |
현재 표시된 목록 상자 항목의 경계 사각형을 반환합니다. |
CListBox::GetListBoxInfo |
열당 항목 수를 검색합니다. |
CListBox::GetLocale |
목록 상자의 로캘 식별자를 검색합니다. |
CListBox::GetSel |
목록 상자 항목의 선택 상태를 반환합니다. |
CListBox::GetSelCount |
다중 선택 목록 상자에서 현재 선택된 문자열 수를 반환합니다. |
CListBox::GetSelItems |
목록 상자에서 현재 선택된 문자열의 인덱스를 반환합니다. |
CListBox::GetText |
목록 상자 항목을 버퍼에 복사합니다. |
CListBox::GetTextLen |
list-box 항목의 길이를 바이트 단위로 반환합니다. |
CListBox::GetTopIndex |
목록 상자에 표시되는 첫 번째 문자열의 인덱스 값을 반환합니다. |
CListBox::InitStorage |
목록 상자 항목 및 문자열에 대한 메모리 블록을 미리 할당합니다. |
CListBox::InsertString |
목록 상자의 특정 위치에 문자열을 삽입합니다. |
CListBox::ItemFromPoint |
한 지점에 가장 가까운 목록 상자 항목의 인덱스 값을 반환합니다. |
CListBox::MeasureItem |
목록 상자 차원을 결정하기 위해 소유자 그리기 목록 상자를 만들 때 프레임워크에서 호출됩니다. |
CListBox::ResetContent |
목록 상자에서 모든 항목을 지웁니다. |
CListBox::SelectString |
단일 선택 목록 상자에서 문자열을 검색하고 선택합니다. |
CListBox::SelItemRange |
다중 선택 목록 상자에서 문자열 범위를 선택하거나 선택 취소합니다. |
CListBox::SetAnchorIndex |
다중 선택 목록 상자의 앵커를 설정하여 확장된 선택을 시작합니다. |
CListBox::SetCaretIndex |
포커스 사각형을 다중 선택 목록 상자에 지정된 인덱스 항목으로 설정합니다. |
CListBox::SetColumnWidth |
여러 열 목록 상자의 열 너비를 설정합니다. |
CListBox::SetCurSel |
목록 상자 문자열을 선택합니다. |
CListBox::SetHorizontalExtent |
목록 상자를 가로로 스크롤할 수 있는 너비를 픽셀 단위로 설정합니다. |
CListBox::SetItemData |
목록 상자 항목과 연결된 값을 설정합니다. |
CListBox::SetItemDataPtr |
목록 상자 항목에 대한 포인터를 설정합니다. |
CListBox::SetItemHeight |
목록 상자에 있는 항목의 높이를 설정합니다. |
CListBox::SetLocale |
목록 상자의 로캘 식별자를 설정합니다. |
CListBox::SetSel |
다중 선택 목록 상자에서 목록 상자 항목을 선택하거나 선택 취소합니다. |
CListBox::SetTabStops |
목록 상자에서 탭 중지 위치를 설정합니다. |
CListBox::SetTopIndex |
목록 상자에 표시되는 첫 번째 문자열의 인덱스(0부터 시작)를 설정합니다. |
CListBox::VKeyToItem |
스타일 집합이 있는 목록 상자에 대한 사용자 지정 WM_KEYDOWN 처리를 제공하도록 재정의 LBS_WANTKEYBOARDINPUT 합니다. |
목록 상자에는 사용자가 보고 선택할 수 있는 파일 이름과 같은 항목 목록이 표시됩니다.
단일 선택 목록 상자에서 사용자는 하나의 항목만 선택할 수 있습니다. 다중 선택 목록 상자에서 항목 범위를 선택할 수 있습니다. 사용자가 항목을 선택하면 항목이 강조 표시되고 목록 상자가 부모 창에 알림 메시지를 보냅니다.
대화 상자 템플릿에서 또는 코드에서 직접 목록 상자를 만들 수 있습니다. 개체를 직접 만들려면 개체를 CListBox
생성한 다음 멤버 함수를 호출 Create
하여 Windows 목록 상자 컨트롤을 만들고 개체에 CListBox
연결합니다. 대화 상자 템플릿에서 목록 상자를 사용하려면 대화 상자 클래스에서 목록 상자 변수를 선언한 다음 DDX_Control
대화 상자 클래스의 DoDataExchange
함수에서 멤버 변수를 컨트롤에 연결합니다. 이 작업은 대화 상자 클래스에 컨트롤 변수를 추가할 때 자동으로 수행됩니다.
생성은 에서 파생된 CListBox
클래스의 1단계 프로세스일 수 있습니다. 파생 클래스에 대한 생성자를 작성하고 생성자 내에서 호출 Create
합니다.
목록 상자에서 부모로 보낸 Windows 알림 메시지(일반적으로 파생된 CDialog
클래스)를 처리하려면 각 메시지에 대한 부모 클래스에 메시지 맵 항목 및 메시지 처리기 멤버 함수를 추가합니다.
각 메시지 맵 항목은 다음 형식을 사용합니다.
ON_Notification( id, memberFxn )
여기서 id
는 알림을 보내는 list-box 컨트롤의 자식 창 ID를 지정하고 memberFxn
알림을 처리하기 위해 작성한 부모 멤버 함수의 이름입니다.
부모의 함수 프로토타입은 다음과 같습니다.
afx_msg void memberFxn( );
다음은 잠재적인 메시지 맵 항목 목록과 부모로 전송되는 사례에 대한 설명입니다.
ON_LBN_DBLCLK
사용자가 목록 상자에서 문자열을 두 번 클릭합니다. 스타일이 있는LBS_NOTIFY
목록 상자만 이 알림 메시지를 보냅니다.ON_LBN_ERRSPACE
목록 상자에서 요청을 충족하기에 충분한 메모리를 할당할 수 없습니다.ON_LBN_KILLFOCUS
목록 상자에서 입력 포커스가 손실됩니다.ON_LBN_SELCANCEL
현재 목록 상자 선택 영역이 취소되었습니다. 이 메시지는 목록 상자에 스타일이 있는 경우에만 전송됩니다LBS_NOTIFY
.ON_LBN_SELCHANGE
목록 상자의 선택 영역이 변경되었습니다. 멤버 함수에 의해 선택 영역이 변경된 경우에는 이 알림이CListBox::SetCurSel
전송되지 않습니다. 이 알림은 스타일이 있는 목록 상자에LBS_NOTIFY
만 적용됩니다.LBN_SELCHANGE
선택 영역이 변경되지 않더라도 사용자가 화살표 키를 누를 때마다 다중 선택 목록 상자에 대한 알림 메시지가 전송됩니다.ON_LBN_SETFOCUS
목록 상자가 입력 포커스를 받고 있습니다.ON_WM_CHARTOITEM
문자열이 없는 소유자 그리기 목록 상자에서 메시지를 받습니다WM_CHAR
.ON_WM_VKEYTOITEM
스타일이 있는 목록 상자가LBS_WANTKEYBOARDINPUT
메시지를 받습니다WM_KEYDOWN
.
대화 상자 내에서(대화 상자 리소스 CListBox
를 통해) 개체를 만들 CListBox
면 사용자가 대화 상자를 닫으면 개체가 자동으로 제거됩니다.
창 내에서 개체를 CListBox
만드는 경우 개체를 삭제 CListBox
해야 할 수 있습니다. 스택에서 개체를 CListBox
만들면 자동으로 제거됩니다. 함수를 CListBox
사용하여 힙에 개체를 new
만드는 경우 사용자가 부모 창을 닫을 때 개체를 삭제하도록 개체를 호출 delete
해야 합니다.
개체에 메모리를 CListBox
할당하는 경우 소멸자를 재정 CListBox
의하여 할당을 삭제합니다.
CListBox
머리글: afxwin.h
목록 상자에 문자열을 추가합니다.
int AddString(LPCTSTR lpszItem);
lpszItem
추가할 null로 끝나는 문자열을 가리킵니다.
목록 상자의 문자열에 대한 인덱스(0부터 시작하는 인덱스)입니다. 반환 값은 LB_ERR
오류가 발생하는 경우입니다. 반환 값은 새 문자열을 저장할 공간이 부족한 경우입니다 LB_ERRSPACE
.
스타일이 포함된 목록 상자를 만들지 LBS_SORT
않은 경우 문자열이 목록의 끝에 추가됩니다. 그렇지 않으면 문자열이 목록에 삽입되고 목록이 정렬됩니다. 스타일이 아닌 LBS_HASSTRINGS
스타일로 목록 상자를 만든 LBS_SORT
경우 프레임워크는 멤버 함수에 대한 하나 이상의 호출로 CompareItem
목록을 정렬합니다.
목록 상자 내의 특정 위치에 문자열을 삽입하는 데 사용합니다 InsertString
.
// Add 10 items to the list box.
CString str;
for (int i = 0; i < 10; i++)
{
str.Format(_T("item string %d"), i);
m_myListBox.AddString(str);
}
목록 상자의 부모 창이 목록 상자에서 메시지를 받을 때 프레임워크에서 호출됩니다 WM_CHARTOITEM
.
virtual int CharToItem(
UINT nKey,
UINT nIndex);
nKey
사용자가 입력한 문자의 ANSI 코드입니다.
nIndex
list-box caret의 현재 위치입니다.
키 입력에 대한 기본 동작을 수행할 목록 상자 항목의 인덱스 지정을 위한 추가 작업 또는 음수가 없는 경우 - 1 또는 - 2를 반환합니다. 기본 구현은 - 1을 반환합니다.
메시지는 WM_CHARTOITEM
메시지를 받을 때 목록 상자에서 WM_CHAR
전송되지만 목록 상자가 다음 조건을 모두 충족하는 경우에만 전송됩니다.
소유자 그리기 목록 상자입니다.
스타일 집합이
LBS_HASSTRINGS
없습니다.항목이 하나 이상 있습니다.
이 함수를 직접 호출해서는 안 됩니다. 키보드 메시지의 사용자 지정 처리를 제공하도록 이 함수를 재정의합니다.
재정의에서 값을 반환하여 프레임워크에 수행한 작업을 알려야 합니다. 반환 값 - 1 또는 - 2는 항목 선택의 모든 측면을 처리했으며 목록 상자에서 추가 작업이 필요하지 않음을 나타냅니다. 1 또는 - 2를 반환하기 전에 선택 항목을 설정하거나 캐리트 또는 둘 다를 이동할 수 있습니다. 선택 항목을 설정하려면 사용 SetCurSel
하거나 SetSel
. 캐리트를 이동하려면 .를 사용합니다 SetCaretIndex
.
반환 값이 0 이상인 경우 목록 상자에서 항목의 인덱스를 지정하고 목록 상자가 지정된 항목의 키 입력에 대한 기본 작업을 수행해야 함을 나타냅니다.
// CMyODListBox is my owner-drawn list box derived from CListBox. This
// example moves the caret down one item on a numeric key and up one item
// on an alphabetic key. The list box control was created with the
// following code:
// m_myODListBox.Create(
// WS_CHILD|WS_VISIBLE|WS_BORDER|WS_HSCROLL|WS_VSCROLL|
// LBS_SORT|LBS_MULTIPLESEL|LBS_OWNERDRAWVARIABLE|LBS_WANTKEYBOARDINPUT,
// CRect(10,250,200,450), pParentWnd, IDC_MYODLISTBOX);
//
int CMyODListBox::CharToItem(UINT nChar, UINT nIndex)
{
// On a numeric key, move the caret up one item.
if (isdigit(nChar) && (nIndex > 0))
{
SetCaretIndex(nIndex - 1);
}
// On an alphabetic key, move the caret down one item.
else if (isalpha(nChar) && (nIndex < (UINT)GetCount()))
{
SetCaretIndex(nIndex + 1);
}
// Do not perform any default processing.
return -1;
}
CListBox
개체를 생성합니다.
CListBox();
두 단계로 개체를 CListBox
생성합니다. 먼저 생성자를 ClistBox
호출한 다음, Windows Create
목록 상자를 초기화하고 CListBox
연결합니다.
// Declare a local CListBox object.
CListBox myListBox;
// Declare a dynamic CListBox object.
CListBox *pmyListBox = new CListBox;
정렬된 소유자 그리기 목록 상자에서 새 항목의 상대 위치를 결정하기 위해 프레임워크에서 호출됩니다.
virtual int CompareItem(LPCOMPAREITEMSTRUCT lpCompareItemStruct);
lpCompareItemStruct
구조체에 대한 긴 포인터입니다 COMPAREITEMSTRUCT
.
구조에 설명된 COMPAREITEMSTRUCT
두 항목의 상대 위치를 나타냅니다. 다음 값 중 어느 것이든 될 수 있습니다.
값 | 의미 |
---|---|
-1 | 항목 1은 항목 2 앞에 정렬합니다. |
0 | 항목 1과 항목 2는 동일하게 정렬합니다. |
1 | 항목 1은 항목 2를 기준으로 정렬합니다. |
구조에 대한 설명은 참조 CWnd::OnCompareItem
하세요 COMPAREITEMSTRUCT
.
기본적으로 이 멤버 함수는 아무 작업도 수행하지 않습니다. 스타일을 사용하여 소유자 그리기 목록 상자를 만드는 경우 목록 상자에 LBS_SORT
추가된 새 항목을 정렬하는 프레임워크를 지원하기 위해 이 멤버 함수를 재정의해야 합니다.
// CMyODListBox is my owner-drawn list box derived from CListBox. This
// example compares two items using _tcscmp to sort items in reverse
// alphabetical order. The list box control was created with the
// following code:
// m_myODListBox.Create(
// WS_CHILD|WS_VISIBLE|WS_BORDER|WS_HSCROLL|WS_VSCROLL|
// LBS_SORT|LBS_MULTIPLESEL|LBS_OWNERDRAWVARIABLE|LBS_WANTKEYBOARDINPUT,
// CRect(10,250,200,450), pParentWnd, IDC_MYODLISTBOX);
//
int CMyODListBox::CompareItem(LPCOMPAREITEMSTRUCT lpCompareItemStruct)
{
ASSERT(lpCompareItemStruct->CtlType == ODT_LISTBOX);
LPCTSTR lpszText1 = (LPCTSTR)lpCompareItemStruct->itemData1;
ASSERT(lpszText1 != NULL);
LPCTSTR lpszText2 = (LPCTSTR)lpCompareItemStruct->itemData2;
ASSERT(lpszText2 != NULL);
return _tcscmp(lpszText2, lpszText1);
}
Windows 목록 상자를 만들어 개체에 CListBox
연결합니다.
virtual BOOL Create(
DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd,
UINT nID);
dwStyle
목록 상자의 스타일을 지정합니다. 상자에 목록 상자 스타일의 조합을 적용합니다.
rect
목록 상자 크기와 위치를 지정합니다. 개체 또는 구조체일 CRect
RECT
수 있습니다.
pParentWnd
목록 상자의 부모 창(일반적으로 개체)을 CDialog
지정합니다. 해서는 안 됩니다 NULL
.
nID
목록 상자의 컨트롤 ID를 지정합니다.
성공하면 0이 아니고, 그렇지 않으면 0입니다.
두 단계로 개체를 CListBox
생성합니다. 먼저 생성자를 호출한 다음, Windows 목록 상자를 초기화하고 개체에 CListBox
연결하는 호출Create
합니다.
실행되면 Create
Windows는 WM_NCCREATE
목록 상자 컨트롤에 , WM_CREATE
및 WM_NCCALCSIZE
WM_GETMINMAXINFO
메시지를 보냅니다.
이러한 메시지는 기본적으로 기본 클래스의 OnNcCreate
, OnCreate
, OnNcCalcSize
및 OnGetMinMaxInfo
멤버 함수에 CWnd
의해 처리됩니다. 기본 메시지 처리를 확장하려면 클래스를 CListBox
파생시키고, 새 클래스에 메시지 맵을 추가하고, 이전 메시지 처리기 멤버 함수를 재정의합니다. 예를 들어 새 클래스에 필요한 초기화를 수행하려면 재정 OnCreate
의합니다.
목록 상자 컨트롤에 다음 창 스타일을 적용합니다.
WS_CHILD
늘WS_VISIBLE
보통WS_DISABLED
드물게WS_VSCROLL
세로 스크롤 막대를 추가하려면WS_HSCROLL
가로 스크롤 막대를 추가하려면WS_GROUP
컨트롤을 그룹화하려면WS_TABSTOP
이 컨트롤에 대한 탭을 허용하려면
// pParentWnd is a pointer to the parent window.
m_myListBox.Create(WS_CHILD | WS_VISIBLE | LBS_STANDARD | WS_HSCROLL,
CRect(10, 10, 200, 200), pParentWnd, IDC_MYLISTBOX);
사용자가 소유자 그리 CListBox
기 개체에서 항목을 삭제하거나 목록 상자를 삭제할 때 프레임워크에서 호출됩니다.
virtual void DeleteItem(LPDELETEITEMSTRUCT lpDeleteItemStruct);
lpDeleteItemStruct
삭제된 항목에 대한 정보를 포함하는 Windows DELETEITEMSTRUCT
구조체에 대한 긴 포인터입니다.
이 함수의 기본 구현은 아무 작업도 수행하지 않습니다. 필요에 따라 소유자 그리기 목록 상자를 다시 그리려면 이 함수를 재정의합니다.
구조에 대한 설명은 참조 CWnd::OnDeleteItem
하세요 DELETEITEMSTRUCT
.
// CMyODListBox is my owner-drawn list box derived from CListBox. This
// example simply frees the item's text. The list box control was created
// with the following code:
// m_myODListBox.Create(
// WS_CHILD|WS_VISIBLE|WS_BORDER|WS_HSCROLL|WS_VSCROLL|
// LBS_SORT|LBS_MULTIPLESEL|LBS_OWNERDRAWVARIABLE|LBS_WANTKEYBOARDINPUT,
// CRect(10,250,200,450), pParentWnd, IDC_MYODLISTBOX);
//
void CMyODListBox::DeleteItem(LPDELETEITEMSTRUCT lpDeleteItemStruct)
{
ASSERT(lpDeleteItemStruct->CtlType == ODT_LISTBOX);
LPVOID lpszText = (LPVOID)lpDeleteItemStruct->itemData;
ASSERT(lpszText != NULL);
free(lpszText);
CListBox::DeleteItem(lpDeleteItemStruct);
}
목록 상자에서 위치에 nIndex
있는 항목을 삭제합니다.
int DeleteString(UINT nIndex);
nIndex
삭제할 문자열의 인덱스(0부터 시작)를 지정합니다.
목록에 남아 있는 문자열의 수입니다. 반환 값은 LB_ERR
목록의 항목 수보다 큰 인덱스를 지정하는 경우 nIndex
입니다.
이제 다음 nIndex
모든 항목이 한 위치 아래로 이동합니다. 예를 들어 목록 상자에 두 개의 항목이 포함된 경우 첫 번째 항목을 삭제하면 나머지 항목이 이제 첫 번째 위치에 있게 됩니다. nIndex
첫 번째 위치에 있는 항목의 경우 =0입니다.
// Delete every other item from the list box.
for (int i = 0; i < m_myListBox.GetCount(); i++)
{
m_myListBox.DeleteString(i);
}
목록 상자에 파일 이름, 드라이브 또는 둘 다 목록을 추가합니다.
int Dir(
UINT attr,
LPCTSTR lpszWildCard);
attr
설명CFile::GetStatus
된 enum
값의 조합이거나 다음 값의 조합일 수 있습니다.
값 | 의미 |
---|---|
0x0000 | 파일을 읽거나 쓸 수 있습니다. |
0x0001 | 파일은 읽을 수 있지만 쓸 수는 없습니다. |
0x0002 | 파일이 숨겨지고 디렉터리 목록에 표시되지 않습니다. |
0x0004 | 파일은 시스템 파일입니다. |
0x0010 | 지정한 lpszWildCard 이름은 디렉터리를 지정합니다. |
0x0020 | 파일이 보관되었습니다. |
0x4000 | 에 지정된 lpszWildCard 이름과 일치하는 모든 드라이브를 포함합니다. |
0x8000 | 배타적 플래그입니다. 배타적 플래그를 설정하면 지정된 형식의 파일만 나열됩니다. 그렇지 않으면 지정된 형식의 파일이 "일반" 파일 외에 나열됩니다. |
lpszWildCard
파일 사양 문자열을 가리킵니다. 문자열에는 와일드카드(예: *.*)가 포함될 수 있습니다.
목록에 추가된 마지막 파일 이름의 인덱스(0부터 시작하는 인덱스)입니다. 반환 값은 오류가 발생하는 경우입니다 LB_ERR
. 반환 값은 LB_ERRSPACE
새 문자열을 저장할 공간이 부족한 경우입니다.
// Add all the files and directories in the windows directory.
TCHAR lpszWinPath[MAX_PATH], lpszOldPath[MAX_PATH];
::GetWindowsDirectory(lpszWinPath, MAX_PATH);
::GetCurrentDirectory(MAX_PATH, lpszOldPath);
::SetCurrentDirectory(lpszWinPath);
m_myListBox.ResetContent();
m_myListBox.Dir(DDL_READWRITE | DDL_DIRECTORY, _T("*.*"));
::SetCurrentDirectory(lpszOldPath);
소유자 그리기 목록 상자의 시각적 측면이 변경되면 프레임워크에서 호출됩니다.
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
lpDrawItemStruct
필요한 그리기 형식에 DRAWITEMSTRUCT
대한 정보를 포함하는 구조체에 대한 긴 포인터입니다.
구조체의 DRAWITEMSTRUCT
멤버 및 itemState
멤버는 itemAction
수행할 그리기 동작을 정의합니다.
기본적으로 이 멤버 함수는 아무 작업도 수행하지 않습니다. 소유자 그리 CListBox
기 개체에 대한 그리기를 구현하려면 이 멤버 함수를 재정의합니다. 애플리케이션은 이 멤버 함수가 종료되기 전에 제공 lpDrawItemStruct
된 표시 컨텍스트에 대해 선택한 모든 GDI(그래픽 디바이스 인터페이스) 개체를 복원해야 합니다.
구조에 대한 설명은 참조 CWnd::OnDrawItem
하세요 DRAWITEMSTRUCT
.
// CMyODListBox is my owner-drawn list box derived from CListBox. This
// example draws an item's text centered vertically and horizontally. The
// list box control was created with the following code:
// m_myODListBox.Create(
// WS_CHILD|WS_VISIBLE|WS_BORDER|WS_HSCROLL|WS_VSCROLL|
// LBS_SORT|LBS_MULTIPLESEL|LBS_OWNERDRAWVARIABLE|LBS_WANTKEYBOARDINPUT,
// CRect(10,250,200,450), pParentWnd, IDC_MYODLISTBOX);
//
void CMyODListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
ASSERT(lpDrawItemStruct->CtlType == ODT_LISTBOX);
LPCTSTR lpszText = (LPCTSTR)lpDrawItemStruct->itemData;
ASSERT(lpszText != NULL);
CDC dc;
dc.Attach(lpDrawItemStruct->hDC);
// Save these value to restore them when done drawing.
COLORREF crOldTextColor = dc.GetTextColor();
COLORREF crOldBkColor = dc.GetBkColor();
// If this item is selected, set the background color
// and the text color to appropriate values. Also, erase
// rect by filling it with the background color.
if ((lpDrawItemStruct->itemAction | ODA_SELECT) &&
(lpDrawItemStruct->itemState & ODS_SELECTED))
{
dc.SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
dc.SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
dc.FillSolidRect(&lpDrawItemStruct->rcItem,
::GetSysColor(COLOR_HIGHLIGHT));
}
else
{
dc.FillSolidRect(&lpDrawItemStruct->rcItem, crOldBkColor);
}
// If this item has the focus, draw a red frame around the
// item's rect.
if ((lpDrawItemStruct->itemAction | ODA_FOCUS) &&
(lpDrawItemStruct->itemState & ODS_FOCUS))
{
CBrush br(RGB(255, 0, 0));
dc.FrameRect(&lpDrawItemStruct->rcItem, &br);
}
// Draw the text.
dc.DrawText(
lpszText,
(int)_tcslen(lpszText),
&lpDrawItemStruct->rcItem,
DT_CENTER | DT_SINGLELINE | DT_VCENTER);
// Reset the background color and the text color back to their
// original values.
dc.SetTextColor(crOldTextColor);
dc.SetBkColor(crOldBkColor);
dc.Detach();
}
목록 상자 선택을 변경하지 않고 지정한 접두사를 포함하는 목록 상자에서 첫 번째 문자열을 찾습니다.
int FindString(
int nStartAfter,
LPCTSTR lpszItem) const;
nStartAfter
검색할 첫 번째 항목 앞에 있는 항목의 인덱스(0부터 시작)를 포함합니다. 검색이 목록 상자의 맨 아래에 도달하면 목록 상자의 맨 위에서 지정한 항목 nStartAfter
까지 계속됩니다. -1이면 nStartAfter
전체 목록 상자가 처음부터 검색됩니다.
lpszItem
검색할 접두사를 포함하는 null로 끝나는 문자열을 가리킵니다. 검색은 대/소문자를 구분하므로 이 문자열에는 대문자와 소문자의 조합이 포함될 수 있습니다.
일치하는 항목의 인덱스(0부터 시작하는 인덱스)이거나 LB_ERR
검색에 실패한 경우
멤버 함수를 SelectString
사용하여 문자열을 찾고 선택합니다.
// The string to match.
LPCTSTR lpszmyString = _T("item");
// Delete all items that begin with the specified string.
int nIndex = 0;
while ((nIndex = m_myListBox.FindString(nIndex, lpszmyString)) != LB_ERR)
{
m_myListBox.DeleteString(nIndex);
}
에 지정된 문자열과 일치하는 첫 번째 목록 상자 문자열을 찾습니다 lpszFind
.
int FindStringExact(
int nIndexStart,
LPCTSTR lpszFind) const;
nIndexStart
검색할 첫 번째 항목 앞에 있는 항목의 인덱스(0부터 시작)를 지정합니다. 검색이 목록 상자의 맨 아래에 도달하면 목록 상자의 맨 위에서 지정한 항목 nIndexStart
까지 계속됩니다. -1이면 nIndexStart
전체 목록 상자가 처음부터 검색됩니다.
lpszFind
검색할 null로 끝나는 문자열을 가리킵니다. 이 문자열은 확장명을 포함하여 전체 파일 이름을 포함할 수 있습니다. 검색은 대/소문자를 구분하지 않으므로 문자열에는 대문자와 소문자의 조합이 포함될 수 있습니다.
일치하는 항목의 인덱스이거나 LB_ERR
검색에 실패한 경우입니다.
목록 상자가 소유자 그리기 스타일로 만들어졌지만 스타일 FindStringExact
이 LBS_HASSTRINGS
없는 경우 멤버 함수는 doubleword 값을 값lpszFind
과 일치시키려고 시도합니다.
// The string to match.
LPCTSTR lpszmyString = _T("item string 3");
// Delete all items that exactly match the specified string.
int nIndex = 0;
while ((nIndex = m_myListBox.FindStringExact(nIndex, lpszmyString)) != LB_ERR)
{
m_myListBox.DeleteString(nIndex);
}
목록 상자에서 현재 앵커 항목의 인덱스(0부터 시작하는 인덱스)를 검색합니다.
int GetAnchorIndex() const;
성공하면 현재 앵커 항목의 인덱스입니다. 그렇지 않으면 LB_ERR.
다중 선택 목록 상자에서 앵커 항목은 연속된 선택한 항목 블록의 첫 번째 또는 마지막 항목입니다.
CListBox::SetAnchorIndex
에 대한 예를 참조하세요.
다중 선택 목록 상자에 포커스 사각형이 있는 항목의 인덱스를 결정합니다.
int GetCaretIndex() const;
목록 상자에 포커스 사각형이 있는 항목의 인덱스(0부터 시작하는 인덱스)입니다. 목록 상자가 단일 선택 목록 상자인 경우 반환 값은 선택된 항목의 인덱스(있는 경우)입니다.
항목을 선택할 수도, 선택하지 않을 수도 있습니다.
CListBox::SetCaretIndex
에 대한 예를 참조하세요.
목록 상자의 항목 수를 검색합니다.
int GetCount() const;
목록 상자의 항목 수 또는 LB_ERR
오류가 발생하는 경우
반환된 개수는 마지막 항목의 인덱스 값보다 큽니다(인덱스는 0부터 시작).
// Add 10 items to the list box.
CString str;
for (int i = 0; i < 10; i++)
{
str.Format(_T("item %d"), i);
m_myListBox.AddString(str);
}
// Verify that 10 items were added to the list box.
ASSERT(m_myListBox.GetCount() == 10);
단일 선택 목록 상자에서 현재 선택한 항목의 인덱스(있는 경우)를 0부터 시작하는 인덱스를 검색합니다.
int GetCurSel() const;
단일 선택 목록 상자인 경우 현재 선택한 항목의 인덱스(0부터 시작하는 인덱스)입니다. LB_ERR
현재 선택된 항목이 없는 경우입니다.
다중 선택 목록 상자에서 포커스가 있는 항목의 인덱스입니다.
다중 선택 목록 상자를 호출 GetCurSel
하지 마세요. 대신 CListBox::GetSelItems
을 사용합니다.
// Select the next item of the currently selected one.
int nIndex = m_myListBox.GetCurSel();
int nCount = m_myListBox.GetCount();
if ((nIndex != LB_ERR) && (nCount > 1))
{
if (++nIndex < nCount)
m_myListBox.SetCurSel(nIndex);
else
m_myListBox.SetCurSel(0);
}
목록 상자에서 가로로 스크롤할 수 있는 너비를 픽셀 단위로 검색합니다.
int GetHorizontalExtent() const;
목록 상자의 스크롤 가능한 너비(픽셀)입니다.
목록 상자에 가로 스크롤 막대가 있는 경우에만 적용됩니다.
// Find the longest string in the list box.
CString str;
CSize sz;
int dx = 0;
CDC *pDC = m_myListBox.GetDC();
for (int i = 0; i < m_myListBox.GetCount(); i++)
{
m_myListBox.GetText(i, str);
sz = pDC->GetTextExtent(str);
if (sz.cx > dx)
dx = sz.cx;
}
m_myListBox.ReleaseDC(pDC);
// Set the horizontal extent only if the current extent is not large enough.
if (m_myListBox.GetHorizontalExtent() < dx)
{
m_myListBox.SetHorizontalExtent(dx);
ASSERT(m_myListBox.GetHorizontalExtent() == dx);
}
지정된 목록 상자 항목과 연결된 애플리케이션에서 제공하는 이중 단어 값을 검색합니다.
DWORD_PTR GetItemData(int nIndex) const;
nIndex
목록 상자에서 항목의 0부터 시작하는 인덱스를 지정합니다.
항목과 연결된 값이거나 LB_ERR
오류가 발생하는 경우입니다.
이중 단어 값은 호출의 매개 변수였습니다 dwItemData
SetItemData
.
// If any item's data is equal to zero then reset it to -1.
for (int i = 0; i < m_myListBox.GetCount(); i++)
{
if (m_myListBox.GetItemData(i) == 0)
{
m_myListBox.SetItemData(i, (DWORD)-1);
}
}
지정된 목록 상자 항목과 연결된 애플리케이션 제공 32비트 값을 포인터(void
*)로 검색합니다.
void* GetItemDataPtr(int nIndex) const;
nIndex
목록 상자에서 항목의 0부터 시작하는 인덱스를 지정합니다.
포인터를 검색하거나 오류가 발생하면 -1을 검색합니다.
LPVOID lpmyPtr = pParentWnd;
// Check all the items in the list box; if an item's
// data pointer is equal to my pointer then reset it to NULL.
for (int i = 0; i < m_myListBox.GetCount(); i++)
{
if (m_myListBox.GetItemDataPtr(i) == lpmyPtr)
{
m_myListBox.SetItemDataPtr(i, NULL);
}
}
목록 상자에서 항목의 높이를 결정합니다.
int GetItemHeight(int nIndex) const;
nIndex
목록 상자에서 항목의 0부터 시작하는 인덱스를 지정합니다. 이 매개 변수는 목록 상자에 LBS_OWNERDRAWVARIABLE
스타일이 있는 경우에만 사용되며, 그렇지 않으면 0으로 설정해야 합니다.
목록 상자에 있는 항목의 높이(픽셀)입니다. 목록 상자에 스타일이 LBS_OWNERDRAWVARIABLE
있으면 반환 값은 지정한 항목 nIndex
의 높이입니다. 오류가 발생하면 반환 값은 .입니다 LB_ERR
.
// Set the height of every item so the item
// is completely visible.
CString str;
CSize sz;
CDC *pDC = m_myListBox.GetDC();
for (int i = 0; i < m_myListBox.GetCount(); i++)
{
m_myListBox.GetText(i, str);
sz = pDC->GetTextExtent(str);
// Only want to set the item height if the current height
// is not big enough.
if (m_myListBox.GetItemHeight(i) < sz.cy)
m_myListBox.SetItemHeight(i, sz.cy);
}
m_myListBox.ReleaseDC(pDC);
목록 상자 창에 현재 표시되어 있는 목록 상자 항목을 경계로 하는 사각형의 크기를 검색합니다.
int GetItemRect(
int nIndex,
LPRECT lpRect) const;
nIndex
항목의 0부터 시작하는 인덱스를 지정합니다.
lpRect
항목의 목록 상자 클라이언트 좌표를 받는 구조체에 대한 긴 포인터 RECT
를 지정합니다.
LB_ERR
오류가 발생하는 경우
// Dump all of the items bounds.
CString str;
RECT r;
for (int i = 0; i < m_myListBox.GetCount(); i++)
{
m_myListBox.GetItemRect(i, &r);
str.Format(_T("item %d: left = %d, top = %d, right = %d, ")
_T("bottom = %d\r\n"),
i,
r.left,
r.top,
r.right,
r.bottom);
AFXDUMP(str);
}
열당 항목 수를 검색합니다.
DWORD GetListBoxInfo() const;
개체의 열당 항목 수입니다 CListBox
.
이 멤버 함수는 Windows SDK에 LB_GETLISTBOXINFO
설명된 대로 메시지의 기능을 에뮬레이트합니다.
목록 상자에서 사용하는 로캘을 검색합니다.
LCID GetLocale() const;
목록 상자의 문자열에 대한 LCID(로캘 식별자) 값입니다.
예를 들어 로캘은 정렬된 목록 상자에서 문자열의 정렬 순서를 결정하는 데 사용됩니다.
CListBox::SetLocale
에 대한 예를 참조하세요.
항목의 선택 상태를 검색합니다.
int GetSel(int nIndex) const;
nIndex
항목의 0부터 시작하는 인덱스를 지정합니다.
지정된 항목이 선택된 경우 양수입니다. 그렇지 않으면 0입니다. 반환 값은 LB_ERR
오류가 발생하는 경우입니다.
이 멤버 함수는 단일 및 다중 선택 목록 상자에서 모두 작동합니다.
현재 선택한 목록 상자 항목의 인덱스 검색하려면 .를 사용합니다 CListBox::GetCurSel
.
// Dump all of the items select state.
CString str;
for (int i = 0; i < m_myListBox.GetCount(); i++)
{
str.Format(_T("item %d: select state is %s\r\n"),
i,
m_myListBox.GetSel(i) > 0 ? _T("true") : _T("false"));
AFXDUMP(str);
}
다중 선택 목록 상자에서 선택한 항목의 총 수를 검색합니다.
int GetSelCount() const;
목록 상자에서 선택한 항목의 수입니다. 목록 상자가 단일 선택 목록 상자인 경우 반환 값은 .입니다 LB_ERR
.
CListBox::GetSelItems
에 대한 예를 참조하세요.
다중 선택 목록 상자에서 선택한 항목의 항목 번호를 지정하는 정수 배열로 버퍼를 채웁니다.
int GetSelItems(
int nMaxItems,
LPINT rgIndex) const;
nMaxItems
항목 번호를 버퍼에 배치할 선택한 항목의 최대 수를 지정합니다.
rgIndex
로 지정된 nMaxItems
정수 수에 충분히 큰 버퍼에 대한 포인터를 지정합니다.
버퍼에 배치된 실제 항목 수입니다. 목록 상자가 단일 선택 목록 상자인 경우 반환 값은 .입니다 LB_ERR
.
// Get the indexes of all the selected items.
int nCount = m_myODListBox.GetSelCount();
CArray<int, int> aryListBoxSel;
aryListBoxSel.SetSize(nCount);
m_myODListBox.GetSelItems(nCount, aryListBoxSel.GetData());
// Dump the selection array.
AFXDUMP(aryListBoxSel);
목록 상자에서 문자열을 가져옵니다.
int GetText(
int nIndex,
LPTSTR lpszBuffer) const;
void GetText(
int nIndex,
CString& rString) const;
nIndex
검색할 문자열의 인덱스(0부터 시작)를 지정합니다.
lpszBuffer
문자열을 받는 버퍼를 가리킵니다. 버퍼에는 문자열과 종료 Null 문자를 위한 충분한 공간이 있어야 합니다. 멤버 함수를 호출 GetTextLen
하여 문자열의 크기를 미리 확인할 수 있습니다.
rString
CString
개체에 대한 참조입니다.
종결 null 문자를 제외한 문자열의 길이(바이트)입니다. 유효한 인덱스가 지정되지 않으면 nIndex
반환 값은 .입니다 LB_ERR
.
이 멤버 함수의 두 번째 형식은 문자열 텍스트로 CString
개체를 채웁니다.
// Dump all of the items in the list box.
CString str, str2;
int n;
for (int i = 0; i < m_myListBox.GetCount(); i++)
{
n = m_myListBox.GetTextLen(i);
m_myListBox.GetText(i, str.GetBuffer(n));
str.ReleaseBuffer();
str2.Format(_T("item %d: %s\r\n"), i, str.GetBuffer(0));
AFXDUMP(str2);
}
목록 상자 항목의 문자열 길이를 가져옵니다.
int GetTextLen(int nIndex) const;
nIndex
문자열의 인덱스(0부터 시작하는 인덱스)를 지정합니다.
종결 null 문자를 제외한 문자열의 길이(문자)입니다. 유효한 인덱스가 지정되지 않으면 nIndex
반환 값은 .입니다 LB_ERR
.
CListBox::GetText
에 대한 예를 참조하세요.
목록 상자에서 표시되는 첫 번째 항목의 인덱스(0부터 시작)를 검색합니다.
int GetTopIndex() const;
성공하면 목록 상자에 표시되는 첫 번째 항목의 인덱스(0부터 시작) LB_ERR
입니다.
처음에는 항목 0이 목록 상자의 맨 위에 있지만 목록 상자가 스크롤되면 다른 항목이 맨 위에 있을 수 있습니다.
// Want an item in the bottom half to be the first visible item.
int n = m_myListBox.GetCount() / 2;
if (m_myListBox.GetTopIndex() < n)
{
m_myListBox.SetTopIndex(n);
ASSERT(m_myListBox.GetTopIndex() == n);
}
목록 상자 항목을 저장하기 위한 메모리를 할당합니다.
int InitStorage(
int nItems,
UINT nBytes);
nItems
추가할 항목 수를 지정합니다.
nBytes
항목 문자열에 할당할 메모리 양(바이트)을 지정합니다.
성공하면 메모리 재할당이 필요하기 전에 목록 상자에 저장할 수 있는 최대 항목 수가고, 그렇지 않으면 LB_ERRSPACE
메모리를 충분히 사용할 수 없습니다.
에 많은 수의 항목을 추가하기 전에 이 함수를 CListBox
호출합니다.
이 함수는 많은 수의 항목(100개 이상)이 있는 목록 상자의 초기화를 가속화하는 데 도움이 됩니다. 지정된 양의 메모리를 미리 할당하여 후속 AddString
InsertString
및 Dir
함수가 가능한 가장 짧은 시간이 소요되도록 합니다. 매개 변수에 대한 예상치를 사용할 수 있습니다. 과대 평가하면 일부 추가 메모리가 할당됩니다. 과소 평가하면 미리 할당된 양을 초과하는 항목에 대해 일반 할당이 사용됩니다.
Windows 95/98에만 해당: nItems
매개 변수는 16비트 값으로 제한됩니다. 즉, 목록 상자에는 최대 32,767개 항목까지 포함할 수 있습니다. 항목 수가 제한되어 있지만 목록 상자에 있는 항목의 총 크기는 사용 가능한 메모리에 의해서만 제한됩니다.
// Initialize the storage of the list box to be 256 strings with
// about 10 characters per string, performance improvement.
int n = m_myListBox.InitStorage(256, 16 * sizeof(TCHAR));
ASSERT(n != LB_ERRSPACE);
// Add 256 items to the list box.
CString str;
for (int i = 0; i < 256; i++)
{
str.Format(_T("item string %d"), i);
m_myListBox.AddString(str);
}
목록 상자에 문자열을 삽입합니다.
int InsertString(
int nIndex,
LPCTSTR lpszItem);
nIndex
문자열을 삽입할 위치의 인덱스(0부터 시작하는 인덱스)를 지정합니다. 이 매개 변수가 -1이면 문자열이 목록의 끝에 추가됩니다.
lpszItem
삽입할 null 종료 문자열을 가리킵니다.
문자열이 삽입된 위치의 0부터 시작하는 인덱스입니다. 반환 값은 LB_ERR
오류가 발생하는 경우입니다. 반환 값은 새 문자열을 저장할 공간이 부족한 경우입니다 LB_ERRSPACE
.
멤버 함수 InsertString
와 AddString
LBS_SORT
달리 스타일이 있는 목록은 정렬되지 않습니다.
// Insert items in between existing items.
CString str;
int n = m_myListBox.GetCount();
for (int i = 0; i < n; i++)
{
str.Format(_T("item string %c"), (char)('A' + i));
m_myListBox.InsertString(2 * i, str);
}
에 지정된 지점과 가장 가까운 목록 상자 항목을 결정합니다 pt
.
UINT ItemFromPoint(
CPoint pt,
BOOL& bOutside) const;
pt
목록 상자의 클라이언트 영역의 왼쪽 위 모서리를 기준으로 지정된 가장 가까운 항목을 찾을 지점입니다.
bOutside
목록 상자의 BOOL
클라이언트 영역 내에 있는 경우 pt
목록 상자 FALSE
의 클라이언트 영역 외부에 있는 경우 pt
로 설정 TRUE
되는 변수에 대한 참조입니다.
에 지정된 지점에 가장 가까운 항목의 인덱스입니다 pt
.
이 함수를 사용하여 마우스 커서가 이동하는 목록 상자 항목을 확인할 수 있습니다.
CListBox::SetAnchorIndex
에 대한 예를 참조하세요.
소유자 그리기 스타일이 있는 목록 상자가 만들어지면 프레임워크에서 호출됩니다.
virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);
lpMeasureItemStruct
구조체에 대한 긴 포인터입니다 MEASUREITEMSTRUCT
.
기본적으로 이 멤버 함수는 아무 작업도 수행하지 않습니다. 이 멤버 함수를 재정의하고 구조를 입력하여 Windows에 MEASUREITEMSTRUCT
목록 상자 차원을 알립니다. 스타일이 포함된 목록 상자가 만들어 LBS_OWNERDRAWVARIABLE
지면 프레임워크는 목록 상자의 각 항목에 대해 이 멤버 함수를 호출합니다. 그렇지 않으면 이 멤버는 한 번만 호출됩니다.
멤버 함수로 SubclassDlgItem
만든 소유자 그리기 목록 상자에서 스타일을 사용하는 LBS_OWNERDRAWFIXED
방법에 대한 자세한 내용은 Technical Note 14의 CWnd
설명을 참조하세요.
구조에 대한 설명은 참조 CWnd::OnMeasureItem
하세요 MEASUREITEMSTRUCT
.
// CMyODListBox is my owner-drawn list box derived from CListBox. This
// example measures an item and sets the height of the item to twice the
// vertical extent of its text. The list box control was created with the
// following code:
// m_myODListBox.Create(
// WS_CHILD|WS_VISIBLE|WS_BORDER|WS_HSCROLL|WS_VSCROLL|
// LBS_SORT|LBS_MULTIPLESEL|LBS_OWNERDRAWVARIABLE|LBS_WANTKEYBOARDINPUT,
// CRect(10,250,200,450), pParentWnd, IDC_MYODLISTBOX);
//
void CMyODListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
ASSERT(lpMeasureItemStruct->CtlType == ODT_LISTBOX);
LPCTSTR lpszText = (LPCTSTR)lpMeasureItemStruct->itemData;
ASSERT(lpszText != NULL);
CSize sz;
CDC *pDC = GetDC();
sz = pDC->GetTextExtent(lpszText);
ReleaseDC(pDC);
lpMeasureItemStruct->itemHeight = 2 * sz.cy;
}
목록 상자에서 모든 항목을 제거합니다.
void ResetContent();
// Delete all the items from the list box.
m_myListBox.ResetContent();
ASSERT(m_myListBox.GetCount() == 0);
지정된 문자열과 일치하는 목록 상자 항목을 검색하고 일치하는 항목이 있으면 항목을 선택합니다.
int SelectString(
int nStartAfter,
LPCTSTR lpszItem);
nStartAfter
검색할 첫 번째 항목 앞에 있는 항목의 인덱스(0부터 시작)를 포함합니다. 검색이 목록 상자의 맨 아래에 도달하면 목록 상자의 맨 위에서 지정한 항목 nStartAfter
까지 계속됩니다. -1이면 nStartAfter
전체 목록 상자가 처음부터 검색됩니다.
lpszItem
검색할 접두사를 포함하는 null로 끝나는 문자열을 가리킵니다. 검색은 대/소문자를 구분하므로 이 문자열에는 대문자와 소문자의 조합이 포함될 수 있습니다.
검색에 성공한 경우 선택한 항목의 인덱스입니다. 검색에 실패한 경우 반환 값은 LB_ERR
현재 선택 영역이 변경되지 않습니다.
필요한 경우 목록 상자를 스크롤하여 선택한 항목을 볼 수 있습니다.
이 멤버 함수는 LBS_MULTIPLESEL
스타일이 있는 목록 상자와 함께 사용할 수 없습니다.
항목은 시작점의 초기 문자가 지정한 문자열의 문자와 일치하는 경우에만 선택됩니다 lpszItem
.
멤버 함수를 FindString
사용하여 항목을 선택하지 않고 문자열을 찾습니다.
// The string to match.
LPCTSTR lpszmyString = _T("item 5");
// Select the item that begins with the specified string.
int nIndex = m_myListBox.SelectString(0, lpszmyString);
ASSERT(nIndex != LB_ERR);
다중 선택 목록 상자에서 여러 개의 연속 항목을 선택합니다.
int SelItemRange(
BOOL bSelect,
int nFirstItem,
int nLastItem);
bSelect
선택 항목을 설정하는 방법을 지정합니다. 이 TRUE
경우 bSelect
문자열이 선택되고 강조 표시됩니다. 이 경우 FALSE
강조 표시가 제거되고 문자열이 더 이상 선택되지 않습니다.
nFirstItem
설정할 첫 번째 항목의 인덱스(0부터 시작)를 지정합니다.
nLastItem
설정할 마지막 항목의 인덱스(0부터 시작하는 인덱스)를 지정합니다.
LB_ERR
오류가 발생하는 경우
다중 선택 목록 상자에서만 이 멤버 함수를 사용합니다. 다중 선택 목록 상자에서 항목 하나만 선택해야 하는 경우, 즉 같은 경우 nFirstItem
멤버 함수를 대신 호출 SetSel
합니다 nLastItem
.
// Select half of the items.
m_myODListBox.SelItemRange(TRUE, 0, m_myODListBox.GetCount() / 2);
다중 선택 목록 상자의 앵커를 설정하여 확장된 선택을 시작합니다.
void SetAnchorIndex(int nIndex);
nIndex
앵커가 될 목록 상자 항목의 인덱스(0부터 시작)를 지정합니다.
다중 선택 목록 상자에서 앵커 항목은 연속된 선택한 항목 블록의 첫 번째 또는 마지막 항목입니다.
void CMyODListBox::OnLButtonDown(UINT nFlags, CPoint point)
{
BOOL bOutside = TRUE;
UINT uItem = ItemFromPoint(point, bOutside);
if (!bOutside)
{
// Set the anchor to be the middle item.
SetAnchorIndex(uItem);
ASSERT((UINT)GetAnchorIndex() == uItem);
}
CListBox::OnLButtonDown(nFlags, point);
}
포커스 사각형을 다중 선택 목록 상자에 지정된 인덱스 항목으로 설정합니다.
int SetCaretIndex(
int nIndex,
BOOL bScroll = TRUE);
nIndex
목록 상자에서 포커스 사각형을 받을 항목의 인덱스(0부터 시작하는 인덱스)를 지정합니다.
bScroll
이 값이 0이면 항목이 완전히 표시될 때까지 스크롤됩니다. 이 값이 0이 아니면 항목이 적어도 부분적으로 표시될 때까지 스크롤됩니다.
LB_ERR
오류가 발생하는 경우
항목이 표시되지 않으면 보기로 스크롤됩니다.
// Set the caret to be the middle item.
m_myListBox.SetCaretIndex(m_myListBox.GetCount() / 2);
ASSERT(m_myListBox.GetCaretIndex() == m_myListBox.GetCount() / 2);
여러 열 목록 상자에서 모든 열의 너비를 픽셀 단위로 설정합니다(스타일을 사용하여 LBS_MULTICOLUMN
생성됨).
void SetColumnWidth(int cxWidth);
cxWidth
모든 열의 너비를 픽셀 단위로 지정합니다.
// Find the pixel width of the largest item.
CString str;
CSize sz;
int dx = 0;
CDC* pDC = myListBox.GetDC();
for (int i = 0; i < myListBox.GetCount(); i++)
{
myListBox.GetText(i, str);
sz = pDC->GetTextExtent(str);
if (sz.cx > dx)
dx = sz.cx;
}
myListBox.ReleaseDC(pDC);
// Set the column width of the first column to be one and 1/3 units
// of the largest string.
myListBox.SetColumnWidth(dx * 4 / 3);
문자열을 선택하고 필요한 경우 보기로 스크롤합니다.
int SetCurSel(int nSelect);
nSelect
선택할 문자열의 인덱스(0부터 시작)를 지정합니다. -1이면 nSelect
목록 상자에 선택 항목이 없도록 설정됩니다.
LB_ERR
오류가 발생하는 경우
새 문자열이 선택되면 목록 상자는 이전에 선택한 문자열에서 강조 표시를 제거합니다.
단일 선택 목록 상자에서만 이 멤버 함수를 사용합니다.
다중 선택 목록 상자에서 선택 영역을 설정하거나 제거하려면 .를 사용합니다 CListBox::SetSel
.
// Select the last item in the list box.
int nCount = m_myListBox.GetCount();
if (nCount > 0)
m_myListBox.SetCurSel(nCount - 1);
목록 상자를 가로로 스크롤할 수 있는 너비를 픽셀 단위로 설정합니다.
void SetHorizontalExtent(int cxExtent);
cxExtent
목록 상자를 가로로 스크롤할 수 있는 픽셀 수를 지정합니다.
목록 상자의 크기가 이 값보다 작으면 가로 스크롤 막대가 목록 상자의 항목을 가로로 스크롤합니다. 목록 상자가 이 값보다 크거나 크면 가로 스크롤 막대가 숨겨집니다.
호출 SetHorizontalExtent
에 응답하려면 목록 상자가 스타일로 정의 WS_HSCROLL
되어 있어야 합니다.
이 멤버 함수는 여러 열 목록 상자에는 유용하지 않습니다. 다중 열 목록 상자의 경우 멤버 함수를 호출합니다 SetColumnWidth
.
// Find the longest string in the list box.
CString str;
CSize sz;
int dx = 0;
TEXTMETRIC tm;
CDC *pDC = m_myListBox.GetDC();
CFont *pFont = m_myListBox.GetFont();
// Select the listbox font, save the old font
CFont *pOldFont = pDC->SelectObject(pFont);
// Get the text metrics for avg char width
pDC->GetTextMetrics(&tm);
for (int i = 0; i < m_myListBox.GetCount(); i++)
{
m_myListBox.GetText(i, str);
sz = pDC->GetTextExtent(str);
// Add the avg width to prevent clipping
sz.cx += tm.tmAveCharWidth;
if (sz.cx > dx)
dx = sz.cx;
}
// Select the old font back into the DC
pDC->SelectObject(pOldFont);
m_myListBox.ReleaseDC(pDC);
// Set the horizontal extent so every character of all strings
// can be scrolled to.
m_myListBox.SetHorizontalExtent(dx);
목록 상자에서 지정된 항목과 연결된 값을 설정합니다.
int SetItemData(
int nIndex,
DWORD_PTR dwItemData);
nIndex
항목의 0부터 시작하는 인덱스를 지정합니다.
dwItemData
항목과 연결할 값을 지정합니다.
LB_ERR
오류가 발생하는 경우
// Set the data of each item to be equal to its index.
for (int i = 0; i < m_myListBox.GetCount(); i++)
{
m_myListBox.SetItemData(i, i);
}
목록 상자에서 지정한 항목과 연결된 32비트 값을 지정된 포인터( void
*)로 설정합니다.
int SetItemDataPtr(
int nIndex,
void* pData);
nIndex
항목의 0부터 시작하는 인덱스를 지정합니다.
pData
항목과 연결할 포인터를 지정합니다.
LB_ERR
오류가 발생하는 경우
항목이 추가되거나 제거될 때 목록 상자 내 항목의 상대 위치가 변경될 수 있더라도 이 포인터는 목록 상자의 수명 동안 유효합니다. 따라서 상자 내의 항목 인덱스가 변경 될 수 있지만 포인터는 신뢰할 수 있습니다.
// Set the data pointer of each item to be NULL.
for (int i = 0; i < m_myListBox.GetCount(); i++)
{
m_myListBox.SetItemDataPtr(i, NULL);
}
목록 상자에 있는 항목의 높이를 설정합니다.
int SetItemHeight(
int nIndex,
UINT cyItemHeight);
nIndex
목록 상자에서 항목의 0부터 시작하는 인덱스를 지정합니다. 이 매개 변수는 목록 상자에 LBS_OWNERDRAWVARIABLE
스타일이 있는 경우에만 사용되며, 그렇지 않으면 0으로 설정해야 합니다.
cyItemHeight
항목의 높이를 픽셀 단위로 지정합니다.
LB_ERR
인덱스 또는 높이가 잘못된 경우
목록 상자에 스타일이 LBS_OWNERDRAWVARIABLE
있으면 이 함수는 지정한 항목 nIndex
의 높이를 설정합니다. 그렇지 않으면 이 함수는 목록 상자에 있는 모든 항목의 높이를 설정합니다.
// Set the height of every item to be the
// vertical size of the item's text extent.
CString str;
CSize sz;
CDC *pDC = myListBox.GetDC();
for (int i = 0; i < myListBox.GetCount(); i++)
{
myListBox.GetText(i, str);
sz = pDC->GetTextExtent(str);
myListBox.SetItemHeight(i, sz.cy);
}
myListBox.ReleaseDC(pDC);
이 목록 상자의 로캘 식별자를 설정합니다.
LCID SetLocale(LCID nNewLocale);
nNewLocale
목록 상자에 대해 설정할 새 LCID(로캘 식별자) 값입니다.
이 목록 상자의 이전 LCID(로캘 식별자) 값입니다.
SetLocale
호출되지 않으면 시스템에서 기본 로캘을 가져옵니다. 이 시스템 기본 로캘은 제어판 지역(또는 국제) 애플리케이션을 사용하여 수정할 수 있습니다.
// My LCID to use.
LCID mylcid = MAKELCID(MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_MEXICAN),
SORT_DEFAULT);
// Force the list box to use my locale.
m_myListBox.SetLocale(mylcid);
ASSERT(m_myListBox.GetLocale() == mylcid);
다중 선택 목록 상자에서 문자열을 선택합니다.
int SetSel(
int nIndex,
BOOL bSelect = TRUE);
nIndex
설정할 문자열의 인덱스(0부터 시작)를 포함합니다. -1이면 값에 따라 선택 영역이 모든 문자열에 bSelect
추가되거나 제거됩니다.
bSelect
선택 항목을 설정하는 방법을 지정합니다. 이 TRUE
경우 bSelect
문자열이 선택되고 강조 표시됩니다. 이 경우 FALSE
강조 표시가 제거되고 문자열이 더 이상 선택되지 않습니다. 지정된 문자열이 선택되고 기본적으로 강조 표시됩니다.
LB_ERR
오류가 발생하는 경우
다중 선택 목록 상자에서만 이 멤버 함수를 사용합니다.
단일 선택 목록 상자에서 항목을 선택하려면 .를 사용합니다 CListBox::SetCurSel
.
// Select all of the items with an even index and
// deselect all others.
for (int i = 0; i < m_myODListBox.GetCount(); i++)
{
m_myODListBox.SetSel(i, ((i % 2) == 0));
}
목록 상자에서 탭 중지 위치를 설정합니다.
void SetTabStops();
BOOL SetTabStops(const int& cxEachStop);
BOOL SetTabStops(
int nTabStops,
LPINT rgTabStops);
cxEachStop
탭 정지는 모든 cxEachStop
대화 상자 단위에서 설정됩니다. 대화 상자에 대한 설명은 참조 rgTabStops
하세요.
nTabStops
목록 상자에 포함할 탭 중지 횟수를 지정합니다.
rgTabStops
대화 상자 단위의 탭 중지 위치를 포함하는 정수 배열의 첫 번째 멤버를 가리킵니다. 대화 상자 단위는 가로 또는 세로 거리입니다. 가로 대화 상자 단위 1개는 현재 대화 상자 기본 너비 단위의 1/4와 같고 세로 대화 상자 단위는 현재 대화 상자 기본 높이 단위의 1/8과 같습니다. 대화 상자 기본 단위는 현재 시스템 글꼴의 높이와 너비를 기준으로 계산됩니다. Windows 함수는 GetDialogBaseUnits
현재 대화 상자 기본 단위를 픽셀 단위로 반환합니다. 탭 정지는 순서대로 정렬되어야 합니다. 뒤로 탭은 허용되지 않습니다.
모든 탭이 설정된 경우 0이 아닌 경우 그렇지 않으면 0입니다.
탭 정지를 기본 크기 2 대화 상자 단위로 설정하려면 이 멤버 함수의 매개 변수가 없는 버전을 호출합니다. 탭 정지를 2 이외의 크기로 설정하려면 인수를 사용하여 버전을 호출합니다 cxEachStop
.
탭 정지를 크기 배열로 설정하려면 버전과 nTabStops
인수를 rgTabStops
사용합니다. 탭 정지는 각 값에 rgTabStops
대해 설정되며, 이 값은 지정한 수 nTabStops
까지 설정됩니다.
멤버 함수에 대한 호출에 SetTabStops
응답하려면 스타일이 포함된 목록 상자가 만들어졌 LBS_USETABSTOPS
어야 합니다.
// Find the pixel width of the largest first substring.
CString str;
CSize sz;
int nIndex, dx = 0;
CDC *pDC = myListBox.GetDC();
for (int i = 0; i < myListBox.GetCount(); i++)
{
myListBox.GetText(i, str);
if ((nIndex = str.Find('\t')) != -1)
str = str.Right(nIndex);
sz = pDC->GetTextExtent(str);
if (sz.cx > dx)
dx = sz.cx;
}
myListBox.ReleaseDC(pDC);
// Set tab stops at every one and 1/3 units
// of the largest string.
// NOTE: Convert pixels to dialog units.
myListBox.SetTabStops((dx * 4 / 3 * 4) / LOWORD(::GetDialogBaseUnits()));
특정 목록 상자 항목이 표시되는지 확인합니다.
int SetTopIndex(int nIndex);
nIndex
목록 상자 항목의 인덱스(0부터 시작하는 인덱스)를 지정합니다.
성공하거나 LB_ERR
오류가 발생하는 경우 0입니다.
시스템에서 지정 nIndex
한 항목이 목록 상자의 맨 위에 표시되거나 최대 스크롤 범위에 도달할 때까지 목록 상자를 스크롤합니다.
// Set the first visible item in the list box to be the middle item
m_myListBox.SetTopIndex(m_myListBox.GetCount() / 2);
목록 상자의 부모 창이 목록 상자에서 메시지를 받을 때 프레임워크에서 호출됩니다 WM_VKEYTOITEM
.
virtual int VKeyToItem(
UINT nKey,
UINT nIndex);
nKey
사용자가 누른 키의 가상 키 코드입니다. 표준 가상 키 코드 목록은 Winuser.h
nIndex
list-box caret의 현재 위치입니다.
추가 작업이 없는 경우 - 2, 기본 작업의 경우 1 또는 키 입력에 대한 기본 작업을 수행할 목록 상자 항목의 인덱스 지정을 위한 음수가 아닌 값을 반환합니다.
메시지는 WM_VKEYTOITEM
메시지를 받을 때 목록 상자에서 WM_KEYDOWN
전송되지만 목록 상자가 다음 두 가지를 모두 충족하는 경우에만 전송됩니다.
스타일 집합이
LBS_WANTKEYBOARDINPUT
있습니다.항목이 하나 이상 있습니다.
이 함수를 직접 호출해서는 안 됩니다. 키보드 메시지의 사용자 지정 처리를 제공하도록 이 함수를 재정의합니다.
재정의가 수행한 작업을 프레임워크에 알리려면 값을 반환해야 합니다. 반환 값 - 2는 애플리케이션이 항목 선택의 모든 측면을 처리했으며 목록 상자에서 추가 작업이 필요하지 않음을 나타냅니다. 반환하기 전에 - 2, 당신은 선택을 설정하거나 캐리트 또는 둘 다를 이동할 수 있습니다. 선택 항목을 설정하려면 사용 SetCurSel
하거나 SetSel
. 캐리트를 이동하려면 .를 사용합니다 SetCaretIndex
.
반환 값 - 1은 키 입력에 대한 응답으로 목록 상자가 기본 작업을 수행해야 함을 나타냅니다. 기본 구현은 - 1을 반환합니다.
반환 값이 0 이상인 경우 목록 상자에서 항목의 인덱스를 지정하고 목록 상자가 지정된 항목의 키 입력에 대한 기본 작업을 수행해야 함을 나타냅니다.
// CMyODListBox is my owner-drawn list box derived from CListBox. This
// example moves the caret down one item on the down key and up one item
// on the up key. The list box control was created with the following
// code:
// m_myODListBox.Create(
// WS_CHILD|WS_VISIBLE|WS_BORDER|WS_HSCROLL|WS_VSCROLL|
// LBS_SORT|LBS_MULTIPLESEL|LBS_OWNERDRAWVARIABLE|LBS_WANTKEYBOARDINPUT,
// CRect(10,250,200,450), pParentWnd, IDC_MYODLISTBOX);
//
int CMyODListBox::VKeyToItem(UINT nKey, UINT nIndex)
{
// On key up, move the caret up one item.
if ((nKey == VK_UP) && (nIndex > 0))
{
SetCaretIndex(nIndex - 1);
}
// On key down, move the caret down one item.
else if ((nKey == VK_DOWN) && (nIndex < (UINT)GetCount()))
{
SetCaretIndex(nIndex + 1);
}
// Do not perform any default processing.
return -2;
}
MFC 샘플 CTRLTEST
CWnd
클래스
계층 구조 차트
CWnd
클래스
CButton
클래스
CComboBox
클래스
CEdit
클래스
CScrollBar
클래스
CStatic
클래스