안녕하세요. 이번시간에는 지난 시간에 작성한 예제를 기반으로 Check Box 와 Radio Button 을 추가한 예제를 만들어 보도록 하겠습니다.
지난번 진행했던 코드에 이어서 진행하기 때문에 추가적으로 변동된 사항만 넣도록 하겠습니다.
리소스 편집기를 통해서 도구 상자에서 Radio Button , Check Box, Group Box를 추가적으로 선택하여
위의 사진처럼 배치를 진행하면 됩니다.
추가적으로 변수 추가 할 때 필요한 속성으로는 아래 테이블에 맞게 진행하면 됩니다.
(굵은 글자체가 전 게시물과 비교해서 추가된 컨트롤 변수들입니다.)
컨트롤 | ID | 기타 속성 |
Edit Control | IDC_EDIT_NAME | |
Edit Control | IDC_EDIT_INFO | Multiline : True, Read Only : True, Horizontal Scroll : True Vertical Scroll : True |
Edit Control | IDC_EDIT_INTEREST | |
Group Box | IDC_STATIC | Caption : 이름을 입력하세요 |
Group Box | IDC_STATIC | Caption : 성별을 선택하세요 |
Group Box | IDC_STATIC | Caption : 관심분야를 선택하세요 (예 : 앱 개발 , 데이터 베이스) |
Radio Button | IDC_RADIO_FEMALE | Caption : 여성, Group : True |
Radio Button | IDC_RADIO_MALE | Caption : 남성, Group : False |
Button | IDC_BUTTON_ENLIST | Caption : 가입 |
Radio Button 을 만들 때 같은 그룹에 속하는 Radio Button 중 가장 먼저 만들어진 라디오 버튼의 Group 속성을 True 로 설정해야 합니다. 이렇게 하게 되면 그 이후에 만들어진 라디오 버튼이 모두 자동으로 같은 그룹에 속하게 됩니다.
ID | 자료형 | 변수 이름 | 컨트롤 변수 |
IDC_EDIT_NAME | CString | m_strName | 체크 해제 |
IDC_EDIT_INFO | CString | m_strInfo | 체크 해제 |
IDC_EDIT_INTEREST | CString | m_interest | 체크 해제 |
IDC_RADIO_FEMALE | int | m_Sex | 체크 해제 |
같은 그룹에 속하는 Radio Button 을 위한 변수를 만들 때는 정수 변수 하나면 됩니다.
Radio Button 은 같은 그룹에서 하나만 선택이 가능하기 때문에 선택되면 변수에는 선택된 버튼의 인덱스 번호가 저장됩니다.
Radio Button 가운데 Group 속성이 True 인 컨트롤에 대해서만 변수를 만들면 되는것입니다.
이제 TestDlg.cpp 파일로 넘어와서 DoDataExchange()함수에 Radio Button 과 Edit Control 변수를 추가해줍니다.
위의 IDC_EDIT_NAME 과 IDC_EDIT_INFO 는 전 게시물에서 추가하였고, 이번에 만든 두 컨트롤에 대해 새로운 함수를 추가하였습니다.
void CTestDlg::OnBnClickedButtonEnlist()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
LPCTSTR gender[2] = { _T("여성"),_T("남성") };// TCHAR 문자열에 대한 포인터 상수 자료형
UpdateData();
if (m_strName.IsEmpty())
return;
m_strInfo.Append(m_strName);
m_strInfo.AppendChar(_T(':')); // 성별과 관심 분야 정보를 추가할 때 구분하기 위해서 : 문자를 추가함
m_strInfo.Append(gender[m_Sex]); // m_Sex에 저장된 값을 이용하여 성별 정보 문자열을 m_strInfo 에 추가한다.
m_strInfo.AppendChar(_T(':')); // 성별과 관심 분야 정보를 추가할 때 구분하기 위해서 : 문자를 추가함
m_strInfo.Append(m_interest); // 관심 분야 정보를 m_interest 에서 가져와서 추가함
m_strInfo.Append(_T("\r\n"));
m_Sex = 0; // 가입 버튼을 완료한후 선택 Radio Button 을 초기화함
m_strName.Empty();
m_interest.Empty();
UpdateData(false);
}
OnBnClickedButtonEnlist() 함수에도 마찬가지로 주석이 달린 부분을 추가해 줍니다.
여기서 LPCTSTR 자료형은 다음과 같습니다.
LPCTSTR = long pointer constant string = const char * 로써
const 를 붙히는 이유는 안정성 때문이라고 합니다.
이제 빌드를 진행해보면 전 게시물의 예제와는 다르게 성별을 Radio Button 을 통해 선택할 수 있고
관심분야도 추가할 수 있습니다.
관심 분야를 입력할 수 있지만, 프로그램은 특정 분야에 사용되는 경우가 많기 때문에
이번 프로그램에서는 컴퓨터 분야에 한정하여 관심분야를 선택할 수 있도록 Check Box를 이용하여 진행해보도록 하겠습니다.
다음과 같이 Check Box 컨트롤을 배치합니다. 각 컨트롤의 속성과 컨트롤에 대한 변수는 아래의 테이블과 같습니다.
컨트롤 | ID | 기타 속성 |
Edit Control | IDC_EDIT_NAME | |
Edit Control | IDC_EDIT_INFO | Multiline : True, Read Only : True, Horizontal Scroll : True Vertical Scroll : True |
Edit Control | IDC_EDIT_INTEREST | |
Group Box | IDC_STATIC | Caption : 이름을 입력하세요 |
Group Box | IDC_STATIC | Caption : 성별을 선택하세요 |
Group Box | IDC_STATIC | Caption : 관심분야를 선택하세요 (예 : 앱 개발 , 데이터 베이스) |
Radio Button | IDC_RADIO_FEMALE | Caption : 여성, Group : True |
Radio Button | IDC_RADIO_MALE | Caption : 남성, Group : False |
Button | IDC_BUTTON_ENLIST | Caption : 가입 |
Check Box | IDC_CHECK_APP | Caption : 앱 개발 |
Check Box | IDC_CHECK_NET | Caption : 네트워크 보안 |
Check Box | IDC_CHECK_DB | Caption : 데이터베이스 |
Check Box | IDC_CHECK_EMB | Caption : 임베디드 |
ID | 자료형 | 변수 이름 | 컨트롤 변수 |
IDC_EDIT_NAME | CString | m_strName | 체크 해제 |
IDC_EDIT_INFO | CString | m_strInfo | 체크 해제 |
IDC_EDIT_INTEREST | CString | m_interest | 체크 해제 |
IDC_RADIO_FEMALE | int | m_Sex | 체크 해제 |
IDC_CHECK_APP | int * | m_flag | 체크 해제 |
각 체크박스는 선택될 수도 있고 선택되지 않을 수 있기 때문에 체크박스마다 변수가 필요합니다.
여기에서는 배열 변수를 만들어 각 체크박스에 연결할 것이므로 포인터 변수 하나만 만들어 줍니다.
여기서 중요한 점이 아까 관심 분야에 대한 코딩을 진행할 때 DDX_Text함수를 추가한 상태에서
리소스 편집기에서 Edit Control 를 제거하여도 코딩했던 부분은 자동적으로 지워지지 않기 때문에
TestDlg.h 와 TestDlg.cpp 파일에서 생성된 변수 및 함수를 모두 수동으로 지워주셔야 합니다.
지우지 않으면 빌드 에러가 나기 때문에 잊으셔도 에러 문구를 따라가서 차근차근 지울 수 있습니다.
이제 m_flag 변수를 생성하였으니 TestDlg.cpp 파일에서 동적 메모리를 할당하여 변수 네개를 생성합니다.
마찬가지로 데이터 교환을 위해 DoDataExchange()함수에서도 CheckBox 에 대한 DDX 함수를 작성해주어야 합니다.
for문을 이용하여 IDC_CHECK_APP 이라는 ID 주소에 1씩 증가시켜 정의하는 이유는 아래에 Resource.h 에 해답이 있습니다.
Resource.h 파일에는 각 ID 에 해당하는 주소값이 모두 define 되어 있습니다.
리소스 편집기에서 컨트롤들을 생성하고 저장하면 각 컨트롤들의 ID 에 해당하는 주소값들을 자동으로 비주얼 스튜디오에서 배정해 주는 겁니다.
Check Box를 네개 연속으로 생성하였기때문에 자동적으로 주소 + 1 씩 증가 되어 있기 때문에 for문을 이용하여
DDX_Check()함수를 생성할 수 있는겁니다.
만약 ID의 주소값이 위와 일치하지 않다면 수동으로 주소를 바꿀 필요가 없고(위험합니다) 일일히 지정해 주셔도 됩니다.
마지막으로 버튼을 클릭하는 이벤트 처리 함수에 아래와 같이 추가해 줍니다.
void CTestDlg::OnBnClickedButtonEnlist()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
int i;
bool comma = false;
LPCTSTR gender[2] = { _T("여성"),_T("남성") };
LPCTSTR kind[4][2] = { {_T(""), _T("앱 개발")},{ _T(""), _T("네트워크 보안") } ,
{ _T(""), _T("데이터베이스") } ,{ _T(""), _T("임베디드") } };
UpdateData();
if (m_strName.IsEmpty())
return;
m_strInfo.Append(m_strName);
m_strInfo.AppendChar(_T(':'));
m_strInfo.Append(gender[m_Sex]);
m_strInfo.AppendChar(_T(':'));
for (i = 0; i < 4; i++)
{
if (comma && m_flag[i])
m_strInfo.Append(_T(","));
m_strInfo.Append(kind[i][m_flag[i]]);
comma = comma || m_flag[i];
m_flag[i] = 0;
}
m_strInfo.Append(_T("\r\n"));
m_Sex = 0;
m_strName.Empty();
UpdateData(false);
}
위와 같이 OnBnClickedButtonEnlist() 함수를 작성하고 빌드를 진행하면 아래와 같이 정상적으로 프로그램이 구동됩니다.
감사합니다.
'MFC Programming' 카테고리의 다른 글
[MFC] Dialog 기반 프로젝트 생성 및 Button 과 Edit Control 사용 (0) | 2021.03.08 |
---|