블로그 이미지
devtang
Instagram : @taebr0 devtaehyeong@gmail.com

calendar

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

Notice

2021. 3. 8. 17:35 MFC Programming

안녕하세요. 이번시간에는 지난 시간에 작성한 예제를 기반으로 Check Box 와 Radio Button 을 추가한 예제를 만들어 보도록 하겠습니다.

ultrakid.tistory.com/44

 

[MFC] Dialog 기반 프로젝트 생성 및 Button 과 Edit Control 사용

안녕하세요. 본 게시물에서는 대화상자 기반 MFC 프로젝트를 생성하고 위의 사진과 같이 간단한 예제를 만들 것입니다. 본 설명은 Visual Studio 2015 기준으로 진행하고 있습니다. 우선 MFC 프로젝트

ultrakid.tistory.com

 

지난번 진행했던 코드에 이어서 진행하기 때문에 추가적으로 변동된 사항만 넣도록 하겠습니다.

 

리소스 편집기를 통해서 도구 상자에서 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() 함수를 작성하고 빌드를 진행하면 아래와 같이 정상적으로 프로그램이 구동됩니다.

감사합니다.

posted by devtang