MFC 프로그래밍 - 2 -

choiyongheon·2025년 2월 24일

0. 목표

간단한 To-Do List 만들기


위 와 같이 제목+내용을 버튼클릭 할 시 저장되며, LIST에 한 줄씩 쌓이도록 설계함. 또한, LIST의 아이템을 더블클릭할 시 세부적으로 내용이 출력되도록 설계

설계와 비슷하게 GUI를 배치했다. 변수 설정은 아래와 같다.


1. listBox 추가하기


  • Dlg.h
public:
	CEdit m_Edit_Title;		// 제목
	CEdit m_Edit_Content;	// 내용
	CListBox m_listBox;		// 리스트 박스
	afx_msg void OnBnClickedSubmitBtn();		// 버튼클릭
  • Dlg.cpp
void CMFCToDoListDlg::OnBnClickedSubmitBtn()
{
	// 제목, 내용 텍스트 저장
	CString title, content;
	m_Edit_Title.GetWindowTextW(title);
	m_Edit_Content.GetWindowTextW(content);
	
	// 예외 처리
	if (title.IsEmpty() || content.IsEmpty()) {
		MessageBox(L"제목 혹은 내용을 입력하세요!", L"오류 발생", MB_OK);
		return;
	}

	// 제목, 컨텐츠 하나로 합치기 format
	CString listItem;
	listItem.Format(_T("%s | %s"), title, content);

	// 리스트 박스에 추가
	m_listBox.AddString(listItem);

	// 제목, 내용 초기화
	m_Edit_Title.SetWindowTextW(_T(""));
	m_Edit_Content.SetWindowTextW(_T(""));
}

앞 서 했던 것과 비슷하므로 자세한 내용은 생략.

리스트 박스에 아이템이 추가된다.


2. list 아이템 모달



세부 사항 GUI를 만들기 위해서 아래의 세팅 과정을 거친다.

  1. 리소스 추가 - Detail 창 GUI를 구성한다. (CEdit 2개)
  2. 클래스 추가 - 여기서는 CDetailDlg로 생성

또한, 모달창을 띄우기 위한 과정을 정리하면 아래와 같다.

  1. ListBox의 인덱스(GetCursel)를 가져옴
  2. 가져온 인덱스에 해당하는 아이템 Text 가져오기(GetText)
  3. 가져온 텍스트를 모달 다이얼로그로 전달 후 init
  • CDetailDlg.h
public:
	// A 다이얼로그에서 전달 받을 값
	CString m_Detail_Title;
	CString m_Detail_Content;

	// Edit Control과 연결할 변수
	CEdit m_Edit_Title;
	CEdit m_Edit_Content;

	// 초기화
	virtual BOOL OnInitDialog();
  • CDetailDlg.cpp
void CDetailDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_EDIT_TITLE, m_Edit_Title);  // 제목 Edit Control과 연결
	DDX_Control(pDX, IDC_EDIT_CONTENT, m_Edit_Content);  // 내용 Edit Control과 연결
}

// CDetailDlg 초기화
BOOL CDetailDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// A 다이얼로그에서 받은 데이터를 Edit Control에 출력
	m_Edit_Title.SetWindowText(m_Detail_Title);
	m_Edit_Content.SetWindowText(m_Detail_Content);

	return TRUE;
}

  • MFC_ToDoList.cpp (ListBox 더블클릭 이벤트)
void CMFCToDoListDlg::OnLClickList() 
{
	int sel = m_listBox.GetCurSel();		// 현재 클릭된 아이템 인덱스
	if (sel == LB_ERR)	return;			// 반환 값 없을 시 리턴

	CString clickItem;
	m_listBox.GetText(sel, clickItem);		// 클릭 인덱스의 아이템 가져오기

	int sperator = clickItem.Find(_T(" | "));		// 제목, 내용 분리
	if (sperator == 1)	return;

	CString title = clickItem.Left(sperator);		// 문자열의 왼쪽이 제목
	CString content = clickItem.Mid(sperator+3);

	CDetailDlg dlg;
	dlg.m_Detail_Title = title;
	dlg.m_Detail_Content = content;

	dlg.DoModal();		// 모달창 GUI를 실행
}

3. 결과물

다음에는 이것을 수정했을 경우, List에 반영되도록 만들 계획이다.

profile
주니어 백엔드 개발자

0개의 댓글