콤보 박스란?
버튼(또는 박스)을 누르면 아래로 컨텍스트 메뉴가 제공되어 항목을 선택할 수 있게 해주는 컨트롤을 의미합니다.
콤보 박스 컨트롤 생성
도구 상자에서 Combo Box(이하 콤보 박스) 컨트롤을 하나 만듭니다.
콤보 박스 컨트롤에서 가장 많이 쓰이는 속성은 위의 2가지 입니다.
속성 (한글) | 속성 (영어) | 설명 |
정렬 | Sort | 항목이 추가되었을 때 자동으로 정렬할지 유무 (알파벳 순서) |
형식 | Type | 콤보 박스 형식 (Simple, Dropdown, Drop List) |
정렬 항목이 true인 경우에는
// AddString은 ComboBox에 항목을 추가하는 기능을 합니다.
ctrlCBox->AddString(_T("Tomato"));
ctrlCBox->AddString(_T("Apple"));
ctrlCBox->AddString(_T("Banana"));
위와 같이 Tomato, Apple, Banana 순으로 항목을 추가하더라도
알파벳 순으로 자동 정렬되어 Apple, Banana, Tomato 순으로 추가가 됩니다.
반대로 false인 경우에는
추가한 순서대로 정렬하지 않고 Tomato, Apple, Banana 순으로 추가가 됩니다.
콤보 박스 형식은 다음과 같습니다.
Simple의 경우에는 모든 항목이 미리 펼쳐져있으며 선택한 항목은 Edit 컨트롤로서 수정할 수 있습니다.
Dropdown의 경우에는 화살표를 눌러서 항목을 펼쳐야 하며 선택한 항목은 Edit 컨트롤로서 수정할 수 있습니다.
Drop List의 경우에는 화살표를 눌러서 항목을 펼쳐야 하며 선택한 항목은 수정할 수 없습니다.
콤보 박스 항목 추가
콤보 박스에서 항목을 추가하는 함수는 "AddString" 함수입니다.
AddString의 인자에는 LPCTSTR 값이 들어갑니다.
(CString값이나 _T("")를 활용한 문자열 값 등..)
항목을 추가하는데는 여러가지 방법이 있지만 그 중에서 직접 컨트롤을 연결하여 항목을 추가하는 방법을 사용하겠습니다.
(Wizard 이용)
콤보 박스에 오른쪽 클릭을 하여 변수 추가를 합니다.
(이렇게 하지 않고 직접 SubclassDlgItem 함수를 사용하여 연결하여도 됩니다.)
이렇게 생성하겠습니다.
생성한 후에는
#pragma once
class CMFC노리터Dlg : public CDialogEx
{
// ... 생략 ...
private:
CComboBox m_ctrlCBox;
// ... 생략 ...
};
이렇게 컨트롤이 헤더파일의 class에 생성이 되며
void CMFC노리터Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_COMBO2, m_ctrlCBox); // <-- 변수에 컨트롤 연결
}
DoDataExchange라는 함수에 "DDX_Control" 이라는 함수로 IDC_COMBO2 라는 ID를 가진 컨트롤이 m_ctrlCBox로 연결이 됩니다.
이제 컨트롤을 변수에 연결하였으니 이것을 이용하여 항목을 추가하여봅시다.
다이얼로그에서 컨트롤들의 설정 타이밍은 일반적으로
BOOL CMFC노리터Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
// <-- 이 지점!!!
return TRUE;
}
OnInitDialog() 함수의 return 바로 앞 부분에서 이루어집니다.
이제 항목을 추가하여봅시다.
BOOL CMFC노리터Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
m_ctrlCBox.AddString(_T("Tomato"));
m_ctrlCBox.AddString(_T("Apple"));
m_ctrlCBox.AddString(_T("Melon"));
m_ctrlCBox.AddString(_T("Watermelon"));
m_ctrlCBox.AddString(_T("Cherry"));
return TRUE;
}
초기 항목 선택
처음 프로그램을 실행시 콤보 박스는 일반적으로 아무것도 선택하지 않은 상태입니다.
이것을 선택하도록 유도해봅시다.
BOOL CMFC노리터Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
m_ctrlCBox.AddString(_T("Tomato"));
m_ctrlCBox.AddString(_T("Apple"));
m_ctrlCBox.AddString(_T("Melon"));
m_ctrlCBox.AddString(_T("Watermelon"));
m_ctrlCBox.AddString(_T("Cherry"));
// 콤보 박스에 항목이 1개 이상인 경우 첫번째 항목으로 선택
if (m_ctrlCBox.GetCount() > 0)
{
m_ctrlCBox.SetCurSel(0);
}
return TRUE;
}
SetCurSel 함수는 인자로 받은 위치의 항목을 선택하게 됩니다.
현재 항목의 인덱스 받아오기
바로 위에서 SetCurSel 함수를 이용하여 초기 항목을 선택하는 방법을 알아보았습니다.
반대로 GetCurSel 함수를 이용하여 현재 선택된 항목의 값을 받아올수도 있습니다.
버튼을 하나 생성하여 버튼 클릭 이벤트를 이용하여 현재 선택된 항목의 인덱스 값을 출력하도록 해보겠습니다.
이렇게 버튼을 추가하고 버튼 클릭 이벤트를 추가합니다.
// 버튼 클릭 이벤트
void CMFC노리터Dlg::OnBnClickedButton1()
{
int nCurSel = m_ctrlCBox.GetCurSel();
// 선택 Focus가 없어진 경우에는 -1을 반환
if (nCurSel >= 0)
{
CString strText = _T("");
strText.Format(_T("현재 선택한 콤보 박스의 인덱스는 %d 입니다."), nCurSel);
MessageBox(strText);
}
}
실행시켜보면 다음과 같은 결과를 도출합니다.
콤보 박스 이벤트 사용
주로 사용하는 몇가지 이벤트를 살펴봅니다.
이벤트 | 설명 |
CBN_DROPDOWN | Drop 항목이 펼쳐졌을 때 발생하는 이벤트 (Dropdown, Drop List) |
CBN_EDITCHANGE | 선택 항목을 수정했을 때 발생하는 이벤트 (Simple, Dropdown) |
CBN_SELCHANGE | 선택한 항목이 이전과 다를 때(항목을 새로 선택했을 때) |
먼저 CBN_DROPDOWN 이벤트는
Dropdown이 끝나면 이벤트가 발생하게 됩니다.
CBN_EDITCHANGE 이벤트는
값이 변경될때마다 이벤트가 발생하게됩니다.
CBN_SELCHANGE 이벤트는
항목을 변경하였을 때 발생하게 됩니다.
'Study > MFC' 카테고리의 다른 글
[MFC] Radio Button 컨트롤 (라디오 버튼) (0) | 2022.09.03 |
---|---|
[MFC] Check Box 컨트롤 (체크 박스) (0) | 2022.09.03 |
[MFC] Button 컨트롤 - 색상 변경 (0) | 2022.02.17 |
[MFC] Button 컨트롤 (버튼 컨트롤) (0) | 2022.02.17 |
[MFC] Tab 컨트롤 (0) | 2022.02.05 |