흔히 위와 같은 컨트롤을 ListControl
ListBox
등으로 표현합니다.
(사실 위의 컨트롤은 TreeControl
에 가깝죠)
MFC에서는 List 관련 컨트롤이 크게 ListBox
와 ListControl
로 나뉩니다.
더욱 세부적으로 표현할 수 있는 것은 ListControl
이지만 간단하게 사용할 수 있는 것은 ListBox
입니다.
ListBox 생성 및 설정
ListBox
를 생성해 봅시다.
ListBox
를 처음 생성하면 우측과 같이 텅 빈 공간이 생깁니다.
아직 아이템이 채워지지 않은 ListBox
가 생성되었습니다.
ListBox
에서 자주 사용되는 속성 항목은 다음과 같습니다.
속성 (한글) | 속성 (영어) | 설명 |
정렬 | Sort | 아이템이 문자열 순서대로 정렬 (오름차순) |
이제 ListBox
를 사용하기 전에 초기 설정을 해봅시다.
컨트롤 | 컨트롤 ID |
ListBox | IDC_LIST |
EditControl (입력용) | IDC_EDIT_INPUT |
Button (추가) | IDC_BTN_ADD |
Button (삽입) | IDC_BTN_INSERT |
Button (제거) | IDC_BTN_DEL |
Button (초기화) | IDC_BTN_RESET |
위와 같이 UI를 만들어줍니다.
그리고 ListBox
의 Sort
항목을 false
로 설정합니다.
컨트롤 | 변수명 |
ListBox | m_ctrlList |
EditControl (입력용) | m_ctrlEditInput |
// 메인 다이얼로그의 헤더 파일
class CMFC노리터Dlg : public CDialogEx
{
// === 생략 ===
private:
CListBox m_ctrlList;
CEdit m_ctrlEditInput;
// === 생략 ===
};
// 메인 다이얼로그의 소스 파일
void CMFC노리터Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST, m_ctrlList);
DDX_Control(pDX, IDC_EDIT_INPUT, m_ctrlEditInput);
}
그리고 변수 추가 기능을 이용하여 컨트롤에 변수를 부여합니다.
(혹은 사용하실 때 GetDlgItem 함수
를 이용하여 사용하셔도 무관합니다.)
ListBox 아이템 추가 (AddString)
이제 초기 셋팅이 끝났으니 아이템을 추가해봅시다.
추가 버튼
을 더블 클릭 혹은 이벤트를 추가(BN_CLICKED
) 해줍시다.
우리가 해야 할 것은 Edit Control
에서 데이터를 가져와서 ListBox
에 추가하는 것입니다.
void CMFC노리터Dlg::OnBnClickedBtnAdd()
{
// Edit Control 에서 입력된 값 가져오기
CString strData = _T("");
m_ctrlEditInput.GetWindowText(strData);
// Edit Control에 입력된 값이 있다면
if (strData.IsEmpty() == false)
{
// ListBox에 데이터를 추가
m_ctrlList.AddString(strData);
// Edit Control 문자열 지우기
m_ctrlEditInput.SetWindowText(_T(""));
}
}
여기서 등장한 함수가 AddString
입니다.
말 그대로 문자열(String)을 추가합니다.
#include <afxwin.h>
/**
@param lpszItem : 추가할 문자열 데이터
@return 0(정상) 혹은 LB_ERR, LB_ERRSPACE
*/
int AddString(LPCTSTR lpszItem);
ListBox 아이템 삽입 (InsertString)
삽입 버튼
을 더블 클릭 혹은 이벤트를 추가(BN_CLICKED
) 해줍시다.
우리가 해야 할 것은 Edit Control
에서 데이터를 가져와서 현재 선택된 ListBox
아이템 앞에 추가하는 것입니다.
만약 선택된 아이템이 없다면 맨 뒤에 추가하도록 할 것입니다.
void CMFC노리터Dlg::OnBnClickedBtnInsert()
{
// Edit Control 에서 입력된 값 가져오기
CString strData = _T("");
m_ctrlEditInput.GetWindowText(strData);
// Edit Control에 입력된 값이 있다면
if (strData.IsEmpty() == false)
{
// 현재 ListBox에서 선택된 아이템의 인덱스를 받아오기
// (만약 선택되어 있지 않다면 -1)
int nCurSel = m_ctrlList.GetCurSel();
// 현재 선택된 아이템이 있다면
if (nCurSel >= 0)
{
// ListBox에 데이터를 삽입
m_ctrlList.InsertString(nCurSel, strData);
}
// 현재 선택된 아이템이 없다면
else
{
// ListBox에 데이터를 추가
m_ctrlList.AddString(strData);
}
// Edit Control 문자열 지우기
m_ctrlEditInput.SetWindowText(_T(""));
}
}
여기서 삽입할 때 등장하는 함수가 바로 InsertString
입니다.
InsertString
함수는 특정 위치에 문자열을 삽입합니다.
#include <afxwin.h>
/**
@param nIndex : 삽입 할 위치
@param lpszItem : 삽입 할 문자열 데이터
@return 0(정상) 혹은 LB_ERR, LB_ERRSPACE
*/
int InsertString(int nIndex, LPCTSTR lpszItem);
ListBox 아이템 제거 (DeleteString)
제거 버튼
을 더블 클릭 혹은 이벤트를 추가(BN_CLICKED
) 해줍시다.
우리가 해야 할 것은 ListBox
에서 아이템이 선택되어 있다면 해당 아이템을 제거하는 것입니다.
void CMFC노리터Dlg::OnBnClickedBtnDel()
{
// 현재 ListBox에서 선택된 아이템의 인덱스를 받아오기
// (만약 선택되어 있지 않다면 -1)
int nCurSel = m_ctrlList.GetCurSel();
// 현재 선택된 아이템이 있다면
if (nCurSel >= 0)
{
// 해당 아이템을 제거
m_ctrlList.DeleteString(nCurSel);
}
}
여기서 등장하는 함수가 바로 DeleteString
입니다.
특정 위치의 아이템을 삭제하는 기능을 가지고 있습니다.
#include <afxwin.h>
/**
@param nIndex : 제거 할 아이템의 위치 (0부터 시작)
@return 0(정상) 혹은 LB_ERR, LB_ERRSPACE
*/
int DeleteString(int nIndex);
ListBox 아이템 초기화 (ResetContent)
초기화 버튼
을 더블 클릭 혹은 이벤트를 추가(BN_CLICKED
) 해줍시다.
우리가 해야 할 것은 ListBox
의 모든 아이템을 제거하는 것입니다.
결과물
번외) 현재 선택한 항목의 데이터 (GetText)
// 현재 선택된 아이템이 있다면
if (nCurSel >= 0)
{
// 현재 선택한 아이템의 인덱스를 이용하여 데이터 받아오기 (CString 이용)
CString strCurData = _T("");
m_ctrlList.GetText(nCurSel, strCurData);
// 현재 선택한 아이템의 인덱스를 이용하여 데이터 받아오기 (문자열 배열 이용)
// GetTextLen 함수는 해당 인덱스의 아이템 문자열의 길이를 받아옵니다.
TCHAR* chData = new TCHAR[m_ctrlList.GetTextLen(nCurSel) + 1];
m_ctrlList.GetText(nCurSel, chData);
delete chData;
chData = nullptr;
}
GetText 함수를 이용하여 데이터를 받아올 수 있습니다.
#include <afxwin.h>
/**
@param nIndex : 받아올 문자열의 인덱스 값
@param lpszBuffer : 받아온 문자열을 저장할 문자 버퍼
@return 문자열 길이 혹은 LB_ERR
*/
int GetText(int nIndex, LPTSTR lpszBuffer) const;
/**
@param nIndex : 받아올 문자열의 인덱스 값
@param rString : 받아온 문자열을 저장할 CString
*/
void GetText(int nIndex, CString& rString) const;
번외) 아이템 항목 선택 (SetCurSel)
m_ctrlList.SetCurSel(2);
SetCurSel 함수를 이용하여 현재 선택 항목을 바꿀 수 있습니다.
이때 입력 값이 -1인 경우 아이템이 선택되지 않은 상태로 만듭니다.
#include <afxwin.h>
/**
@param nSelect : 선택할 아이템의 인덱스 (-1인 경우 선택 X)
@return 0 혹은 LB_ERR
*/
int SetCurSel(int nSelect);
'Study > MFC' 카테고리의 다른 글
[MFC] MFC 에서 Grid를 사용해보자 1 (MFC Grid Control) (1) | 2022.11.03 |
---|---|
[MFC/Win32 API] 파일의 생성 시간, 접근 시간, 쓰기 시간 (2) | 2022.10.15 |
[MFC] Radio Button 컨트롤 (라디오 버튼) (0) | 2022.09.03 |
[MFC] Check Box 컨트롤 (체크 박스) (0) | 2022.09.03 |
[MFC] Combo Box 컨트롤 (콤보 박스) (0) | 2022.03.05 |