언어/C++

[MFC] 다이얼로그 1

O_oz 2023. 10. 28. 16:36
반응형

MFC (Microsoft Foundation Classes)는 Windows OS에서 작동하는 GUI 응용프로그램을 개발하기 위한 C++ 언어 기반의 GUI 라이브러리이다

MFC를 이용하면 비교적 간단하게 GUI 프로그램을 개발할 수 있다

그런데 솔직히 깊은 이해보다는 이렇게 사용해야 한다 수준에 그칠 수밖에 없을 것 같다

다음에 시간 내서 좀더 깊은 공부를 해봐야겠다

 

이번 장의 목표는

해당 사진을 한 프로젝트 내에서 모두 구현하는 것이다

 

비주얼 스튜디오에서 MFC 앱으로 새 프로젝트를 생성하자

 

설정은 이렇게

시작 페이지에서 4개의 창을 띄우게 할거라 단일문서로 설정했다

 

리소스 뷰에서 IDR_MAINFRAME을 클릭해서 메인 프레임에 위와 같이 메뉴를 추가하자

ID는 IDD_Dialog1로 설정

 

신상 입력 버튼을 활성화 하기 위해

클래스 위자드에 들어가 뷰 클래스에 방금 만든 메뉴 아이디로 멤버 함수를 추가해주자

 

그러면 실행했을 때 메뉴버튼이 활성화된 것을 볼 수 있다

그런데 아직 신상 입력 메뉴와 아무것도 연결을 하지 않았기 때문에 클릭해도 아무 이벤트가 발생하지 않는다

 

이제 리소스 뷰에서 다이얼로그 리소스를 추가하자

 

새로 만들기

 

그럼 이렇게 다이얼로그가 새로 생성된다

속성에서 캡션만 바꿔주자

해당 다이얼로그의 ID는 IDD_DIALOG1 이다

 

해당 다이얼로그를 컨트롤할 수 있도록 클래스를 추가해주자

클래스 이름을 입력하면 자동으로 헤더파일과 소스파일의 이름이 정해지는데, 다시 수정해서 위와 같이 설정

 

솔루션 탐색기에서 헤더파일과 소스파일이 생성된 것을 확인할 수 있고 클래스 뷰로 생성한 클래스를 간단하게 확인할 수 있다

 

이제 메뉴와 다이얼로그를 연결해줘야 한다

#include "NameDlg1.h"

CNameDlg1 dlg1;
dlg1.DoModal();

뷰 소스파일의 맨 위에 다이얼로그 클래스를 include하고

메뉴 멤버 함수에 3, 4번 라인의 코드를 추가하자

추가된 모습

이제 실행하고 신상 입력 메뉴를 누르면 연결된 다이얼로그가 뜨는 것을 확인할 수 있다

이제 다이얼로그를 꾸며보자!

 

각각 컴포넌트들의 아이디를 표시했다

 

제일 먼저 라디오 버튼을 제어할 것이다

Ctrl + D를 눌러서 다이얼로그 안 컴포넌트들의 순서를 위와 같이 설정해주자

그룹 박스 내의 컴포넌트들은 연속되게 해줘야한다

각 그룹의 첫 번째 라디오버튼 속성에서 그룹 속성을 True로 바꿔준다

 

그러면 자동으로 해당 라디오버튼이 멤버 변수로 추가된

클래스 위저드에서 라디오 1번과 라디오 3번을 클릭해서 제어 변수를 추가해주자

이렇게

완료되면 이런 모습이다

 

실행하면 초기값으로 설정한 라디오버튼이 활성화되었고 그룹 박스 내 설정한 순서대로 0부터 차례대로 값을 리턴한다

 

이제 리스트 박스랑 콤보 박스를 설정하자

아까 라디오버튼 제어 변수 만든 것 처럼 위와 같이 제어 변수를 추가한다

완료되면 이런 모습

 

리스트 박스와 콤보 박스의 초기 상태를 설정해줘야하기 때문에

클래스 위저드에서 OnInitDialog 함수를 재정의해주자

 

BOOL CNameDlg1::OnInitDialog()
{
	CDialog::OnInitDialog();

	// TODO:  여기에 추가 초기화 작업을 추가합니다.
	CString arr[7] = { _T("삼성전자"), _T("대우중공업"), _T("엘지전자"),
		_T("현대건설"), _T("기아자동차"), _T("한화화학"), _T("기타") };
	CString data;

	for (int i = 1; i < 7; i++)
	{
		data.Format(_T("%s"), arr[i]);
		m_ListBox.AddString(data);
		m_ComboBox.AddString(data);
	}

	return TRUE;  // return TRUE unless you set the focus to a control
	// 예외: OCX 속성 페이지는 FALSE를 반환해야 합니다.
}

다이얼로그 소스 파일에 재정의된 OnInitDialog() 함수에 위와 같이 코드를 작성한다

추가적으로 리스트 박스와 콤보 박스 속성에서 정렬을 False로 해주면 정렬되지 않고 입력한 순서대로 나온다

 

 

이제 마지막으로 '초기'라고 적혀있는 static text 컴포넌트를 리스트, 콤보 박스와 연동하여 선택시 선택한 텍스트로 변하는 기능을 추가해보겠다

 

클래스 위저드에서 리스트의 요소를 한번 클릭했을 때 static text의 내용을 바꾸기 위해서 위의 함수를 활성화한다

 

해당 static text의 ID를 바꾸고 사이즈를 처음 사이즈보다 더 크게 늘려주자

(최소 5글자 이상 받을 수 있게끔)

 

다이얼로그 헤더파일 클래스 내부에 변경된 값을 받을 변수를 추가한다

 

다이얼로그 소스파일의

DoDataExchange() 함수 내부에 IDC_CHANGE_STATIC을 m_change_static 변수로 바꾼다는 코드를 작성하고

 

void CNameDlg1::OnSelchangeList1()
{
	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
	int num = m_ListBox.GetCurSel();//Search the current position
	CString data;
	m_ListBox.GetText(num, data);//get character at select position
	UpdateData(true);
	m_change_static = data;
	UpdateData(false);
}

동일한 파일의 아까 활성화한 함수를 위와 같이 작성해주자

리스트 요소를 클릭했을 때 해당하는 데이터를 data에 넣고 m_change_static 변수를 업데이트 해준다는 의미이다

 

실행하면 위와 같이 처음에 초기라고 적혀있던 static text는 나오지 않고

리스트 내부의 요소를 선택하면 설정한 static text가 바뀐다

 

콤보 박스도 똑같이 해주면 된다

함수 생성해주고

 

void CNameDlg1::OnSelchangeCombo1()
{
	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
	int num = m_ComboBox.GetCurSel();
	CString data;
	m_ComboBox.GetLBText(num, data);
	UpdateData(true);
	m_change_static = data;
	UpdateData(false);
}

생성한 함수에 위의 코드를 작성한다

그러면 콤보 박스도 똑같이 작동된다

 

리스트 박스와 콤보 박스가 서로 연동된다면 더 좋지 않을까?

리스트 박스에서 선택해도 콤보 박스도 바뀌고, 콤보 박스에서 선택해도 리스트 박스가 바뀌게

 

똑같이 선택했을 때 크로스해서 커서를 셋하는 함수를 추가했다

 

마지막으로 선택을 마무리하고 확인을 눌렀을 때 알림창이 뜨도록 만들자

 

다이얼로그 헤더파일에 리스트 박스나 콤보 박스에서 선택한 텍스트를 받을 변수를 선언하고

 

다이얼로그 소스파일의 각각 함수에서 선택한 데이터를 m_strBox 변수에 넣는다

 

뷰 소스파일의 출력 부분을 위와 같이 작성하고

 

선택하고 확인을 누르면 선택을 바탕으로 알림이 뜬다

 

남은 3가지는 다음 장에서 마저 작성할게요,,

반응형

'언어 > C++' 카테고리의 다른 글

소수 구하는 알고리즘  (0) 2024.09.12
c++ 자료형  (0) 2024.09.09
[MFC] 다이얼로그 2  (1) 2023.10.29
[C++] 클래스  (1) 2023.10.23
[C++] namespace  (1) 2023.10.23