리스트박스는 선택 가능한 여러 개의 항목들을 나열해 놓고 그 중 하나(또는 여러개를 선택하는 컨트롤이며 여기서 항목이란 주로 문자열이다.
"listbox"라는 윈도우 클래스로 생성한다.
스타일 |
설 명 |
LBS_MULTIPLESEL |
여러 개의 항목을 선택할 수 있다. 이 스타일을 적용하지 않으면 디폴트로 하나만 선택할 수 있다. |
LBS_NOTIFY |
사용자가 목록중 하나를 선택했을 때 부모 윈도우로 통지 메시지를 보낸다. |
LBS_SORT |
추가된 항목들을 자동 정렬한다. |
LBS_OWNERDRAW |
문자열이 아닌 비트맵이나 그림을 넣을 수 있다. |
LBS_STANDARD |
LBS_NOTIFY|LBS_SORT|WS_BORDER |
LBS_NOTIFY 스타일은 거의 필수적으로 선택하는 것이 좋으며, 그 외 스타일은 필요시에 선택하면 된다.
부모 윈도우가 리스트 박스를 조작하고자 할 때는 리스트 박스 메시지를 사용한다.
부모윈도우 -메세지-> 리스트 박스
메시지 |
설 명 |
LB_ADDSTRING |
리스트 박스에 항목을 추가한다. lParam으로 추가하고자 하는 문자열의 번지를 넘겨준다. |
LB_DELETESTRING |
항목을 삭제한다. wParam으로 항목의 번호를 넘겨주며 남은 항목수를 리턴한다. |
LB_GETCURSEL |
현재 선택된 항목의 번호를 조사한다. |
LB_GETTEXT |
지정한 항목의 문자열을 읽는다. wParam에 항목 번호, lParam에 문자열 버퍼의 번지를 넘기면 버퍼에 문자열 채워준다. |
LB_GETCOUNT |
항목의 개수를 조사한다. |
LB_SETCURSEL |
wParam이 지정한 항목을 선택한다. |
리스트 박스에 선택한 항목들을 채울 때는 LB_ADDSTRING을 사용하며 현재 선택된 항목의 인덱스는 LB_GETCURSEL로 구하고 특정 인덱스의 문자열을 읽을 때는 LB_GETTEXT메시지를 사용한다.
이 메시지들은 부모 윈도우가 리스트 박스에게 명령을 내리기 위해 사용하며 반대로 리스트 박스에서 어떤 사건이 발생했을 때 부모 윈도우로 다음과 같은 통지 메시지를 보낸다.
#define ID_LISTBOX 100
HWND hList;
TCHAR *Items[] = {TEXT("Apple"),TEXT("Orange"),TEXT("Melon"),TEXT("Grape"),TEXT("Strawberry")};
int i;
TCHAR str[128];
LRESULT OnCreate(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
hList = CreateWindow(TEXT("listbox"),NULL,WS_CHILD|WS_VISIBLE|WS_BORDER|LBS_NOTIFY,
10,10,100,200,hWnd,(HMENU)ID_LISTBOX,g_hInst,NULL);
for(i=0;i<5;i++)
{
SendMessage(hList,LB_ADDSTRING,0,(LPARAM)Items[i]);
}
return 0;
}
LRESULT OnCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
switch(LOWORD(wParam))
{
case ID_LISTBOX:
switch(HIWORD(wParam))
{
case LBN_SELCHANGE:
i=SendMessage(hList,LB_GETCURSEL,0,0);
SendMessage(hList,LB_GETTEXT,i,(LPARAM)str);
SetWindowText(hWnd,str);
break;
}
}
return 0;
}
LRESULT OnPaint(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
hdc=BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);
return 0;
}
LRESULT OnDestroy(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
PostQuitMessage(0);
return 0;
}
2. 콤보 박스
콤보박스는 에디트 컨트롤과 리스트 박스를 결합해 놓은 컨트롤이다. "combobox" 윈도우 클래스를 사용하며 세가지 종류가 있는데 스타일로 원하는 종료를 선택한다.
스타일 |
설 명 |
CBS_SIMPLE |
에디트와 리스트 박스를 가지되 리스트 박스가 항상 펼쳐져 있다. |
CBS_DROPDOWN |
에디트와 리스트 박스를 가진다. |
CBS_DROPDOWNLIST |
리스트 박스만 가지며 에디트에 항목을 입력할 수는 없다. |
#define ID_COMBOBOX 100
HWND hCombo;
TCHAR *Items[] = {TEXT("Apple"),TEXT("Orange"),TEXT("Melon"),TEXT("Grape"),TEXT("Strawberry")};
int i;
TCHAR str[128];
LRESULT OnCreate(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
hCombo = CreateWindow(TEXT("combobox"),NULL,WS_CHILD|WS_VISIBLE|CBS_DROPDOWN,
10,10,100,200,hWnd,(HMENU)ID_COMBOBOX,g_hInst,NULL);
for(i=0;i<5;i++)
{
SendMessage(hCombo,CB_ADDSTRING,0,(LPARAM)Items[i]);
}
return 0;
}
LRESULT OnCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
switch(LOWORD(wParam))
{
case ID_COMBOBOX:
switch(HIWORD(wParam))
{
case CBN_SELCHANGE:
i=SendMessage(hCombo,CB_GETCURSEL,0,0);
SendMessage(hCombo,CB_GETLBTEXT,i,(LPARAM)str);
SetWindowText(hWnd,str);
break;
case CBN_EDITCHANGE:
GetWindowText(hCombo,str,128);
SetWindowText(hWnd,str);
break;
}
}
return 0;
}
LRESULT OnPaint(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
hdc=BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);
return 0;
}
LRESULT OnDestroy(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
PostQuitMessage(0);
return 0;
WM_COMMAND가 처리하는 통지 메시지를 보면 LBN_SELCHANGE에 대응되는 CBN_SELCHANGE와 EN_CHANGE에 대응되는 CBN_EDITCHANGE메시지 뿐이다. 두메시지는 리스트 박스, 에디트의 메시지와 동일한 의미를 가진다.