티스토리 뷰

프로그래밍/MFC

MFC 버튼 컨트롤

에어버스 2016. 6. 26. 11:45

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(202015050), this101);
    m_checkbox.Create(L"체크박스", WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, CRect(2070150100), this102);
    m_radio1.Create(L"라디오버튼1", WS_CHILD | WS_VISIBLE | WS_GROUP | BS_AUTORADIOBUTTON, CRect(20140150170), this103);
    m_radio2.Create(L"라디오버튼2", WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, CRect(20180150210), this104);
    m_groupbox.Create(L"그룹박스", WS_CHILD | WS_VISIBLE | BS_GROUPBOX, CRect(20110160220), this105);
    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, 핸들러함수) 처럼 원하는 메시지만걸러낼 수있다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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