티스토리 뷰
MFC 버튼 컨트롤
푸시버튼, 체크박스, 라디오버튼, 그룹박스 4가지 종류가 있다.
MFC에서 컨트롤을 생성하는 방법
1. 일반 윈도우(View)에서 직접 컨트롤을 만들기
1 |
BOOL Create(LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID); |
cs |
lpszCaption : 버튼 컨트롤에 사용될 문자열
dwStyle : 윈도우 스타일(WS_*)과 버튼 스타일(BS_*)의 조합, WS_CHILD | WS_VISIBLE 은 필수 값, WS_CHILD 생략해도 MFC에서 자동으로 추가해준다.
<버튼 스타일>
버튼 컨트롤 스타일 |
의미 |
BS_PUSHBUTTON |
푸시 버튼 |
BS_DEFPUSHBUTTON |
기본 푸시 버튼 - 일반 윈도우에서는 차이 없으나 대화상자에서 사용할때는 Enter 키 누르면 이 버튼이 눌려진다. |
BS_CHECKBOX |
체크 박스 |
BS_AUTOCHECK |
자동 체크 박스 - 클릭하면 자동으로 체크 표시가 On/Off 된다. |
BS_3STATE |
3상태 체크 박스 |
BS_AUTO3STATE |
자동 3상태 체크 박스 - 클릭하면 자동으로 체크표시가 On/Gray/Off 된다. |
BS_RADIOBUTTON |
라디오 버튼 |
BS_AUTORADIOBUTTON |
자동 라디오 버튼 - 클릭하면 자동으로 선택/해제 된다. |
BS_GROUPBOX |
그룹 박스 |
rect : 컨트롤 크기와 위치로 RECT 또는 CRect 객체를 사용한다.
pParentWnd : 부모 윈도우, NULL 값을 사용하면 실행 중 오류가 발생한다.
nID : 버튼 컨트롤 ID, 부모 윈도우가 같은 경우 서로 다른 ID 를 가져야 한다.
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 |
class CMFCApplication4View : public CView
{
...
private:
CButton m_pushbutton, m_checkbox, m_radio1, m_radio2, m_groupbox;
};
BEGIN_MESSAGE_MAP(CMFCApplication4View, CView)
...
ON_BN_CLICKED(101, &OnButtonClicked)
END_MESSAGE_MAP()
int CMFCApplication4View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
m_pushbutton.Create(L"푸시버튼", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(20, 20, 150, 50), this, 101);
m_checkbox.Create(L"체크박스", WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, CRect(20, 70, 150, 100), this, 102);
m_radio1.Create(L"라디오버튼1", WS_CHILD | WS_VISIBLE | WS_GROUP | BS_AUTORADIOBUTTON, CRect(20, 140, 150, 170), this, 103);
m_radio2.Create(L"라디오버튼2", WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, CRect(20, 180, 150, 210), this, 104);
m_groupbox.Create(L"그룹박스", WS_CHILD | WS_VISIBLE | BS_GROUPBOX, CRect(20, 110, 160, 220), this, 105);
m_checkbox.SetCheck(BST_CHECKED);
m_radio1.SetCheck(BST_CHECKED);
return 0;
}
void CMFCApplication4View::OnButtonClicked()
{
BOOL bCheckBox, bRadio1, bRadio2;
bCheckBox = bRadio1 = bRadio2 = FALSE;
if (m_checkbox.GetCheck() == BST_CHECKED)
bCheckBox = TRUE;
if (m_radio1.GetCheck() == BST_CHECKED)
bRadio1 = TRUE;
if (m_radio2.GetCheck() == BST_CHECKED)
bRadio2 = TRUE;
CString str1, str2, str3;
if (bCheckBox)
str1 = L"체크 박스가 체크되었습니다.";
else
str1 = L"체크 박스가 체크되지 않았습니다.";
if (bRadio1)
str2 = L"라디오 버튼1이 선택되었습니다.";
else
str2 = L"라디오 버튼1이 선택되지 않았습니다.";
if(bRadio2)
str3 = L"라디오 버튼2가 선택되었습니다.";
else
str3 = L"라디오 버튼2가 선택되지 않았습니다.";
MessageBox(str1 + '\n' + str2 + '\n' + str3);
} |
cs |
CMFCApplication4View::OnCreate()에서 컨트롤을 만들때 푸시버튼 ID를 101로 지정했으로 메시지 핸들러에도 101 로 같게 해줘야 한다.
2. 대화상자에 시각적으로 디자인하는 과정을 통해 만들기
뷰 클래스는 CView 가 아닌 CFormView(폼뷰)를 상속 받는다.
아래 그림처럼 컨트롤을 추가한다.
클래스 마법사를 이용해서 IDC_RADIO1, IDC_CHECK1 컨트롤형 변수와 IDC_BUTTON1 의 BN_CLICKED 메시지 핸들러를 추가한다.
IDC_RADIO2 는 마법사로 변수 추가 안되니 수동으로 추가해야만 한다.
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 |
class CMFCApplication5View : public CFormView
{
...
private:
CButton m_checkbox;
CButton m_radio1, m_radio2;
};
BEGIN_MESSAGE_MAP(CMFCApplication5View, CFormView)
ON_BN_CLICKED(IDC_BUTTON1, &CMFCApplication5View::OnClickedButton1)
END_MESSAGE_MAP()
void CMFCApplication5View::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
DDX_Control(pDX, IDC_CHECK1, m_checkbox);
DDX_Control(pDX, IDC_RADIO1, m_radio1);
DDX_Control(pDX, IDC_RADIO2, m_radio2);
}
void CMFCApplication5View::OnInitialUpdate()
{
...
m_checkbox.SetCheck(BST_CHECKED);
m_radio1.SetCheck(BST_CHECKED);
}
void CMFCApplication5View::OnClickedButton1()
{
BOOL bCheckBox, bRadio1, bRadio2;
bCheckBox = bRadio1 = bRadio2 = FALSE;
if (m_checkbox.GetCheck() == BST_CHECKED)
bCheckBox = TRUE;
if (m_radio1.GetCheck() == BST_CHECKED)
bRadio1 = TRUE;
if (m_radio2.GetCheck() == BST_CHECKED)
bRadio2 = TRUE;
CString str1, str2, str3;
if (bCheckBox)
str1 = L"체크 박스가 체크되었습니다.";
else
str1 = L"체크 박스가 체크되지 않았습니다.";
if (bRadio1)
str2 = L"라디오 버튼1이 선택되었습니다.";
else
str2 = L"라디오 버튼1이 선택되지 않았습니다.";
if (bRadio2)
str3 = L"라디오 버튼2가 선택되었습니다.";
else
str3 = L"라디오 버튼2가 선택되지 않았습니다.";
MessageBox(str1 + '\n' + str2 + '\n' + str3);
} |
cs |
라디오 버튼이 여러개인 경우 메시지맴 범위 매크로를 이용할 수 있다.
이때 라디오버튼의 ID 정수값은 연속된 값을 가져야만 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 |
class CMFCApplication5View : public CFormView
{
...
public:
afx_msg void OnRadio(UINT nID);
};
BEGIN_MESSAGE_MAP(CMFCApplication5View, CFormView)
...
ON_CONTROL_RANGE(BN_CLICKED, IDC_RADIO1, IDC_RADIO5, OnRadio)
END_MESSAGE_MAP()
void CMFCApplication5View::OnRadio(UINT nID)
{
switch (nID)
{
case IDC_RADIO1: break;
case IDC_RADIO2: break;
case IDC_RADIO3: break;
case IDC_RADIO4: break;
case IDC_RADIO5: break;
}
} |
cs |
1
2
3
4 |
BEGIN_MESSAGE_MAP(CMFCApplication5View, CFormView)
...
ON_COMMAND_RANGE(IDC_RADIO1, IDC_RADIO5, OnRadio)
END_MESSAGE_MAP() |
cs |
<ON_COMMANF_RANGE() 와 ON_CONTROL_RANGE() 매크로 차이점>
ON_CONTROL_RANGE(컨트롤 통지메시지, 범위 처음ID, 범위 마지막ID, 핸들러함수) 처럼 원하는 메시지만걸러낼 수있다.