티스토리 뷰
사용자가 선택할 수 있는 항목을 가진 윈도우, 이때 항목은 문자열이나 비트맵이 될 수 있다.
<리스트 박스 컨트롤 스타일>
리스트 박스 컨트롤 스타일 |
의미 |
속성 대화상자 목록 |
LBS_DISABLENOSCROLL |
표시할 항목의 개수가 적은 경우에도 수직 스크롤 바가 사라지지 않는다. |
Disable no scroll |
LBS_EXTENDEDSEL |
Shift, Ctrl 키와 마우스 클릭을 이용한 다중 선택이 가능하다. |
Selection : Extended |
LBS_HASSTINGS |
LBS_OWNERDRAW 스타일을 지정하지 않을 경우의 디폴트 스타일이며 컨트롤이 문자열을 저장및 관리한다. |
Has strings |
LBS_MULTICOLUMN |
여러줄로 구성된 리스트박스를 생성하여 항목이 많을 경우 수평 스롤이 가능하다. |
Multi-column |
LBS_MULTIPLESEL |
마우스 클릭을 이용한 다중 선택이 가능하다. |
Selection : Multiple |
LBS_NODATA |
항목 데이터를 컨트롤이 아닌 부모 윈도우가 유지하며 필요할 때마다 부모윈도우가 직접 그린다. 항목의 개수가 1,000개 이상일 경우에 사용한다. |
없음 |
LBS_NOINTEGERALHEIGHT |
이 스타일을 지정하지 않으면 항목의 일부가 잘려서 보이지 않는 경우가 발생할 수 있다. |
No integral height |
LBS_NOREDRAW |
항목의 변화가 생기더라도 리스트 박스 컨트롤을 다시 그리지 않는다. |
No redraw |
LBS_NOSEL |
항목을 선택할 수 없다. |
Selection ; None |
LBS_NOTIFY |
사용자가 항목을 클릭하거나 더블 클릭하면 부모 윈도우에게 통지 메시지를 보낸다. |
Notify |
LBS_OWNERDRAWFIXED |
부모 윈도우가 리스트 박스 항목을 직접 그리되 항목의 높이가 일정한 경우다. |
Owner draw : Fixed |
LBS_OWNERDRAWVARIABLE |
부모 윈도우가 리스트 항목을 직접 그리되 항목의 높이가 일정하지 않은 경우다. |
Owner draw : Variable |
LBS_SORT |
항목이 문자열인 경우 정렬하여 포시한다. |
Sort |
LBS_STANDARD |
LBS_NOTIFY, LBS_SORT, LBS_VSCROLL, WS_BORDER 4가지 스타일의 조합이다. |
Notify, Sort, Border, Vertical scroll |
LBS_USETABSTOPS |
이 스타일을 지정하면 항목 문자열에 포함된 탭 문자('\t')를 제대로 처리할 수 있다. |
Use tabstops |
LBS_WANTKEYBORDINPUT |
리스트박스 컨트롤이 키보드 포커스를 가진 상태에서 사용자가 키를 누르면 부모 윈도우가 이를 감지하여 특별한 처리를 할 수 있다. |
Want key input |
<리스트 박스 컨트롤의 통지 메시지>
통지 메시지 |
의미 |
LBN_DBLCLK |
사용자가 항목을 더블 클릭했다. |
LBN_SELCHANGE |
사용자가 선택을 변경했다. |
LBN_SELCANCEL |
사용자가 선택을 취소했다. |
LBN_SETFOCUS |
키보드 포커스를 얻었다. |
LBN_KILLFOCUS |
키보드 포커스를 잃었다. |
LBN_ERRSPACE |
메모리가 부족하다. |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 |
m_list.AddString(L"사과"); // 문자열 항목을 끝 부분에 추가
m_list.DeleteString(3); // 4번째 항목을 삭제
// 단일 선택만 가능할때
m_list.SetCurSel(2); // 3번째 항목을 선택 - 단일 선택만 가능할때
// 다중 선택이 가능할때
m_list.SetSel(2); // 3번째 항목을 선택 - 다중 선택이 가능할때
m_list.SetSel(3, FALSE); // 4번째 항목을 선택 해제한다. - 다중 선택이 가능할때
// 단일 선택만 가능할 때
m_list.GetCurSel(); // 선택된 항목 번호 얻기
m_list.GetText(2, str); // 3번째 항목을 str에 얻기
// 다중 선택이 가능할때
m_list.GetCaretIndex();
m_list.GetText(2, str); |
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 |
class CMFCApplication5View : public CFormView
{
...
CListBox m_list;
CEdit m_edit;
};
void CMFCApplication5View::OnInitialUpdate()
{
...
m_list.AddString(L"사과"); // 초기 문자열 항목 추가
}
void CMFCApplication5View::OnBnClickedadd()
{
CString str;
m_edit.GetWindowText(str);
m_list.AddString(str);
}
void CMFCApplication5View::OnBnClickedDel()
{
int nIndex = m_list.GetCurSel();
if (nIndex != LB_ERR)
m_list.DeleteString(nIndex);
}
void CMFCApplication5View::OnDblclkList1()
{
int nIndex = m_list.GetCurSel();
if (nIndex != LB_ERR)
{
CString str;
m_list.GetText(nIndex, str);
MessageBox(str);
}
}
void CMFCApplication5View::OnSelchangeList1()
{
int nIndex = m_list.GetCurSel();
if (nIndex != LB_ERR)
{
CString str;
m_list.GetText(nIndex, str);
CWnd* ptr = AfxGetMainWnd();
ptr->SetWindowTextW(str);
}
}
void CMFCApplication5View::OnChangeEdit2()
{
CString str;
m_edit.GetWindowTextW(str);
CWnd* ptr = AfxGetMainWnd();
ptr->SetWindowTextW(str);
} |
cs |
리스트 박스 컨트롤 항목에 데이터를 저장하고 싶으면 SetItemData() 와 GetItemData() 를 통해 데이터를 읽고 쓸 수 있다. 이 데이터는 32bit 만을 제공하므로 정수형이 아니면 포인터로 저장한다. 포인터로 저장하는 경우 new/delete 잊지 말고, 저장할 데이터가 다양할 경우 구조체를 만들어 저장하면 편리하다.