네개의 컨트롤을 추가하고 다뤄본다.
Dialog 에서는 컨트롤이 쉽지만 View 에서는 수동으로 해야한다. 따라서 View --> dialog 로 전환시키는 방법을 고려한다.
CEdit m_edit;
CButton m_button;
CListBox m_listBox;
CComboBox m_comboBox;
1. h 파일에 위의 멤버 변수 추가
2 초기화 - view 의 window 가 onCreate 될때
m_edit.Create(WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE|WS_HSCROLL|WS_VSCROLL,
CRect(10, 10, 100, 100), this, IDC_EDIT);
m_edit.SetMargins(10, 5);
m_edit.SetLimitText(15);
m_button.Create(L"OK", WS_CHILD | WS_VISIBLE | WS_BORDER | BS_DEFPUSHBUTTON,
CRect(110, 10, 200, 200), this, IDC_BUTTON);
// 주의 할 점
// 리스트 박스는 기본 동작이 통지코드가 발생하지 않습니다.
// 부모 윈도에서 통지 코드를 받기 위해서는 스타일에 LBS_NOTIFY 를 추가해야 합니다.
m_listBox.Create(WS_CHILD | WS_VISIBLE | WS_BORDER| LBS_NOTIFY,
CRect(210, 10, 300, 100), this, IDC_LISTBOX);
m_comboBox.Create(WS_CHILD | WS_VISIBLE | WS_BORDER |CBS_DROPDOWNLIST,
CRect(310, 10, 400, 100), this, IDC_COMBOBOX);
여기서 사용되는 ID 는 미리 정의해둔다.
// 내부적으로 사용하는 컨트롤에 대해 매크로를 통해 아이디를 관리해야 한다.
#define IDC_EDIT 1
#define IDC_BUTTON 2
#define IDC_LISTBOX 3
#define IDC_COMBOBOX 4
각 컨트롤들의 이벤트를 처리하기위한 Message Map 을 직접 추가한다.
ON_EN_CHANGE(IDC_EDIT, onEdit) // 함수의 형태는 : void onEdit()
ON_BN_CLICKED(IDC_BUTTON, onClick)
ON_LBN_DBLCLK(IDC_LISTBOX, onListBoxDbClk)
각 함수를 구현한다.
void CChildView::OnClick()
{
// edit 에서 문자열을 꺼내와서
// list 에 추가하고
// edit 를 비운다.
CString s;
m_edit.GetWindowText(s);
m_listBox.AddString(s);
m_edit.SetSel(0, -1);
m_edit.Clear();
}
void CChildView::OnListBoxDbClk()
{
// 1. 선택된 인덱스를 구한다.
int index = m_listBox.GetCurSel();
CString s;
m_listBox.GetText(index, s);
m_comboBox.AddString(s);
// 2. 인덱스를 삭제한다.
m_listBox.DeleteString(index);
}