티스토리 뷰

프로그래밍/MFC

MFC 리스트 박스 컨트롤

에어버스 2016. 6. 26. 15:27
MFC 리스트 박스 컨트롤

사용자가 선택할 수 있는 항목을 가진 윈도우, 이때 항목은 문자열이나 비트맵이 될 수 있다.

<리스트 박스 컨트롤 스타일>

리스트 박스 컨트롤 스타일 

의미 

 속성 대화상자 목록

 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 잊지 말고, 저장할 데이터가 다양할 경우 구조체를 만들어 저장하면 편리하다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
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