단순 목록 상자를 만드는 방법
이 항목에서는 단순 목록 상자에서 항목을 초기화하고 검색하는 방법을 보여 줍니다.
이 항목의 C++ 코드 예제에는 스포츠 팀의 선수 정보로 목록 상자를 채우는 대화 상자 프로시저가 있습니다. 사용자가 목록에서 선수 이름을 선택하면 선수 정보가 대화 상자에 표시됩니다. 목록 상자의 창 스타일에는 항목 목록을 정렬하는 LBS_SORT가 있습니다. 다음 스크린샷은 대화 상자를 보여줍니다.
알아야 하는 작업
기술
필수 구성 요소
- C/C++
- Windows 사용자 인터페이스 프로그래밍
지침
애플리케이션은 목록 상자와 관련된 다음 작업을 수행해야 합니다.
- 목록 상자 초기화
- 목록 상자에서 사용자의 선택 항목 검색
다음 C++ 코드 예제에서는 선수 정보가 구조체 배열에 저장됩니다. 초기화하는 동안 대화 상자 프로시저는 LB_ADDSTRING 메시지를 사용하여 팀 멤버의 이름을 한 번에 하나씩 목록 상자(IDC_LISTBOX_EXAMPLE)에 추가합니다. 또한 LB_SETITEMDATA 메시지를 사용하여 선수 배열 인덱스를 목록 상자에 항목 데이터로 추가합니다. 이후에 사용자가 목록 상자에서 선수를 선택하면 대화 상자 프로시저는 LB_GETITEMDATA 메시지를 사용하여 해당 배열 인덱스를 검색합니다. 그런 다음 검색한 배열 인덱스를 사용하여 배열에서 선수 정보를 검색합니다.
typedef struct
{
TCHAR achName[MAX_PATH];
TCHAR achPosition[12];
int nGamesPlayed;
int nGoalsScored;
} Player;
Player Roster[] =
{
{TEXT("Haas, Jonathan"), TEXT("Midfield"), 18, 4 },
{TEXT("Pai, Jyothi"), TEXT("Forward"), 36, 12 },
{TEXT("Hanif, Kerim"), TEXT("Back"), 26, 0 },
{TEXT("Anderberg, Michael"), TEXT("Back"), 24, 2 },
{TEXT("Jelitto, Jacek"), TEXT("Midfield"), 26, 3 },
{TEXT("Raposo, Rui"), TEXT("Back"), 24, 3},
{TEXT("Joseph, Brad"), TEXT("Forward"), 13, 3 },
{TEXT("Bouchard, Thomas"), TEXT("Forward"), 28, 5 },
{TEXT("Salmre, Ivo "), TEXT("Midfield"), 27, 7 },
{TEXT("Camp, David"), TEXT("Midfield"), 22, 3 },
{TEXT("Kohl, Franz"), TEXT("Goalkeeper"), 17, 0 },
};
INT_PTR CALLBACK ListBoxExampleProc(HWND hDlg, UINT message,
WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
{
// Add items to list.
HWND hwndList = GetDlgItem(hDlg, IDC_LISTBOX_EXAMPLE);
for (int i = 0; i < ARRAYSIZE(Roster); i++)
{
int pos = (int)SendMessage(hwndList, LB_ADDSTRING, 0,
(LPARAM) Roster[i].achName);
// Set the array index of the player as item data.
// This enables us to retrieve the item from the array
// even after the items are sorted by the list box.
SendMessage(hwndList, LB_SETITEMDATA, pos, (LPARAM) i);
}
// Set input focus to the list box.
SetFocus(hwndList);
return TRUE;
}
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK:
case IDCANCEL:
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
case IDC_LISTBOX_EXAMPLE:
{
switch (HIWORD(wParam))
{
case LBN_SELCHANGE:
{
HWND hwndList = GetDlgItem(hDlg, IDC_LISTBOX_EXAMPLE);
// Get selected index.
int lbItem = (int)SendMessage(hwndList, LB_GETCURSEL, 0, 0);
// Get item data.
int i = (int)SendMessage(hwndList, LB_GETITEMDATA, lbItem, 0);
// Do something with the data from Roster[i]
TCHAR buff[MAX_PATH];
StringCbPrintf (buff, ARRAYSIZE(buff),
TEXT("Position: %s\nGames played: %d\nGoals: %d"),
Roster[i].achPosition, Roster[i].nGamesPlayed,
Roster[i].nGoalsScored);
SetDlgItemText(hDlg, IDC_STATISTICS, buff);
return TRUE;
}
}
}
return TRUE;
}
}
return FALSE;
}
관련 항목