언어/C++

[MFC] 다이얼로그 2

O_oz 2023. 10. 29. 11:37
반응형

https://oz-97.tistory.com/45 에서 이어진다

남은 도서 대여, 주소 입력, 도서 목록 까지 만들어보자!

 

주소 입력부터

메뉴에 주소 입력을 추가하고 ID를 수정해준다

 

주소 입력 메뉴 활성화

 

다이얼로그 생성

ID는 IDD_DIALOG2

 

다이얼로그를 제어할 클래스 추가

 

뷰 소스파일에 생성한 제어 클래스 include

 

아까 클래스 마법사로 생성한 화면 출력 함수에 위와 같이 코드 작성

 

실행하면 위와 같이 뜸

 

이제 아래 요구사항을 바탕으로 콤보 박스를 채워보자

요구사항
처음 실행시 시/도 콤보박스만 기본 값으로 설정
처음 상태는 시/도, 구/군, 동/면 모두 선택
구/군, 동/면은 앞선 콤보 박스가 선택되어야 내용물 확인 가능
앞선 콤보 박스가 재설정되면 이후 콤보 박스들 모두 초기화
콤보 박스 아래 static text는 활성화 된 부분만 나타나고 콤보 박스 안의 내용이 달라질때마다 바뀜
확인 누르면 선택된 정보로 주소 출력

대충 이런 모양

먼저 시/도 콤보 박스는 항상 기본으로 활성화되어야 하므로

클래스 위저드에서 위 함수를 활성화한다

 

콤보 박스 제어 변수 추가

1부터 3까지

 

// NameDlg2.cpp: 구현 파일
//

#include "pch.h"
#include "MFCDialogHW.h"
#include "afxdialogex.h"
#include "NameDlg2.h"

CString sido[] = { _T("선택"), _T("서울특별시"), _T("광주광역시"), _T("사랑시") };
CString seoul[] = { _T("선택"), _T("강남구"), _T("강북구"), _T("강서구"), _T("강동구")};
CString gangnam[] = {_T("선택"), _T("역삼동"), _T("청담동"), _T("논현동"), _T("수서동") };
CString gangbuk[] = { _T("선택"), _T("미아동"), _T("수유동"), _T("우이동") };
CString gangseo[] = { _T("선택"), _T("화곡동"), _T("등촌동"), _T("마곡동"), _T("방화동") };
CString gangdong[] = { _T("선택"), _T("천호동"), _T("성내동"), _T("고덕동"), _T("강일동") };
CString gwangju[] = { _T("선택"), _T("광산구"), _T("남구"), _T("동구"), _T("서구"), _T("북구") };
CString donggu[] = { _T("선택"), _T("학동"), _T("산수동"), _T("소태동") };
CString namgu[] = { _T("선택"), _T("봉선동"), _T("행암동"), _T("월산동") };
CString bukgu[] = { _T("선택"), _T("중흥동"), _T("일곡동"), _T("연제동"), _T("풍향동") };
CString seogu[] = { _T("선택"), _T("화정동"), _T("매월동"), _T("치평동"), _T("유촌동") };
CString gwangsangu[] = { _T("선택"), _T("송정동"), _T("신촌동"), _T("수완동"), _T("흑석동") };
CString sarang[] = { _T("선택"), _T("고백구") };
CString goback[] = { _T("선택"), _T("행복동") };


// CNameDlg2 대화 상자

IMPLEMENT_DYNAMIC(CNameDlg2, CDialog)

CNameDlg2::CNameDlg2(CWnd* pParent /*=nullptr*/)
	: CDialog(IDD_DIALOG2, pParent)
{

}

CNameDlg2::~CNameDlg2()
{
}

void CNameDlg2::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_COMBO1, m_ComboBox1);
	DDX_Control(pDX, IDC_COMBO2, m_ComboBox2);
	DDX_Control(pDX, IDC_COMBO3, m_ComboBox3);
}


BEGIN_MESSAGE_MAP(CNameDlg2, CDialog)
END_MESSAGE_MAP()


// CNameDlg2 메시지 처리기


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

	// TODO:  여기에 추가 초기화 작업을 추가합니다.
	CString data;

	for (int i = 0; i < sizeof(sido) / sizeof(CString); i++)
	{
		data.Format(_T("%s"), sido[i]);
		m_ComboBox1.AddString(data);
	}
	m_ComboBox1.SetCurSel(0);
	m_ComboBox2.AddString(_T("선택"));
	m_ComboBox2.SetCurSel(0);
	m_ComboBox3.AddString(_T("선택"));
	m_ComboBox3.SetCurSel(0);

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

9부터 22번 라인까지 콤보 박스에 사용될 배열들을 선언해주었다

CNameDlg2의 OnInitDialog() 함수에

처음 실행 시 콤보 박스들의 상태를 정해준다

 

요런 느낌

 

이제 각 콤보 박스를 선택할 때 이벤트를 다르게 하기위해서 함수 세개를 활성화 했다

 

void CNameDlg2::OnSelchangeCombo1()
{
	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
	int num = m_ComboBox1.GetCurSel();//Search the current position
	CString data;
	m_ComboBox1.GetLBText(num, data);//get character at select position
	
	switch (num)
	{
		case 0 :
			m_ComboBox2.ResetContent();
			m_ComboBox3.ResetContent();
			m_ComboBox2.AddString(_T("선택"));
			m_ComboBox2.SetCurSel(0);
			m_ComboBox3.AddString(_T("선택"));
			m_ComboBox3.SetCurSel(0);
			break;
		case 1:
			m_ComboBox2.ResetContent();
			m_ComboBox3.ResetContent();
			for (int i = 0; i < sizeof(seoul) / sizeof(CString); i++)
			{
				data.Format(_T("%s"), seoul[i]);
				m_ComboBox2.AddString(data);
			}
			m_ComboBox2.SetCurSel(0);
			m_ComboBox3.AddString(_T("선택"));
			m_ComboBox3.SetCurSel(0);
			break;
		case 2 :
			m_ComboBox2.ResetContent();
			m_ComboBox3.ResetContent();
			for (int i = 0; i < sizeof(gwangju) / sizeof(CString); i++)
			{
				data.Format(_T("%s"), gwangju[i]);
				m_ComboBox2.AddString(data);
			}
			m_ComboBox2.SetCurSel(0);
			m_ComboBox3.AddString(_T("선택"));
			m_ComboBox3.SetCurSel(0);
			break;
		case 3 :
			m_ComboBox2.ResetContent();
			m_ComboBox3.ResetContent();
			for (int i = 0; i < sizeof(sarang) / sizeof(CString); i++)
			{
				data.Format(_T("%s"), sarang[i]);
				m_ComboBox2.AddString(data);
			}
			m_ComboBox2.SetCurSel(0);
			m_ComboBox3.AddString(_T("선택"));
			m_ComboBox3.SetCurSel(0);
			break;
	}
}


void CNameDlg2::OnSelchangeCombo2()
{
	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
	int num1 = m_ComboBox1.GetCurSel();//Search the current position
	int num2 = m_ComboBox2.GetCurSel();//Search the current position
	CString data;
	m_ComboBox2.GetLBText(num2, data);//get character at select position

	if (num1 == 1)	// 서울
	{
		switch (num2)
		{
			case 0:
				
				m_ComboBox3.AddString(_T("선택"));
				m_ComboBox3.SetCurSel(0);
				break;
			case 1:
				m_ComboBox3.ResetContent();
				for (int i = 0; i < sizeof(gangnam) / sizeof(CString); i++)
				{
					data.Format(_T("%s"), gangnam[i]);
					m_ComboBox3.AddString(data);
				}
				m_ComboBox3.SetCurSel(0);
				break;
			case 2:
				m_ComboBox3.ResetContent();
				for (int i = 0; i < sizeof(gangbuk) / sizeof(CString); i++)
				{
					data.Format(_T("%s"), gangbuk[i]);
					m_ComboBox3.AddString(data);
				}
				m_ComboBox3.SetCurSel(0);
				break;
			case 3:
				m_ComboBox3.ResetContent();
				for (int i = 0; i < sizeof(gangseo) / sizeof(CString); i++)
				{
					data.Format(_T("%s"), gangseo[i]);
					m_ComboBox3.AddString(data);
				}
				m_ComboBox3.SetCurSel(0);
				break;
			case 4:
				m_ComboBox3.ResetContent();
				for (int i = 0; i < sizeof(gangdong) / sizeof(CString); i++)
				{
					data.Format(_T("%s"), gangdong[i]);
					m_ComboBox3.AddString(data);
				}
				m_ComboBox3.SetCurSel(0);
				break;
		}
	}
	else if (num1 == 2)		// 광주
	{
		switch (num2)
		{
			case 0:
				break;
			case 1:
				m_ComboBox3.ResetContent();
				for (int i = 0; i < sizeof(gwangsangu) / sizeof(CString); i++)
				{
					data.Format(_T("%s"), gwangsangu[i]);
					m_ComboBox3.AddString(data);
				}
				m_ComboBox3.SetCurSel(0);
				break;
			case 2:
				m_ComboBox3.ResetContent();
				for (int i = 0; i < sizeof(namgu) / sizeof(CString); i++)
				{
					data.Format(_T("%s"), namgu[i]);
					m_ComboBox3.AddString(data);
				}
				m_ComboBox3.SetCurSel(0);
				break;
			case 3:
				m_ComboBox3.ResetContent();
				for (int i = 0; i < sizeof(donggu) / sizeof(CString); i++)
				{
					data.Format(_T("%s"), donggu[i]);
					m_ComboBox3.AddString(data);
				}
				m_ComboBox3.SetCurSel(0);
				break;
			case 4:
				m_ComboBox3.ResetContent();
				for (int i = 0; i < sizeof(seogu) / sizeof(CString); i++)
				{
					data.Format(_T("%s"), seogu[i]);
					m_ComboBox3.AddString(data);
				}
				m_ComboBox3.SetCurSel(0);
				break;
			case 5:
				m_ComboBox3.ResetContent();
				for (int i = 0; i < sizeof(bukgu) / sizeof(CString); i++)
				{
					data.Format(_T("%s"), bukgu[i]);
					m_ComboBox3.AddString(data);
				}
				m_ComboBox3.SetCurSel(0);
				break;
		}
	}
	else// 사랑시
	{
		m_ComboBox3.ResetContent();
		for (int i = 0; i < sizeof(goback) / sizeof(CString); i++)
		{
			data.Format(_T("%s"), goback[i]);
			m_ComboBox3.AddString(data);
		}
		m_ComboBox3.SetCurSel(0);
	}
}


void CNameDlg2::OnSelchangeCombo3()
{
	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
	int num = m_ComboBox3.GetCurSel();
	CString data;
	m_ComboBox3.GetLBText(num, data);
}

다이얼로그 제어 소스파일 안에 생성한 3개의 콤보 박스 셀렉 함수 내부를 위 처럼 작성한다

 

이렇게 콤보 박스가 제어된다

 

이제 static text 변경을 해보자

다이얼로그 제어 헤더 파일에 static text 제어에 사용할 변수를 선언해준다

 

다이얼로그 소스파일의

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

 

{
	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
	int num = m_ComboBox1.GetCurSel();//Search the current position
	CString data;
	m_ComboBox1.GetLBText(num, data);//get character at select position

	switch (num)
	{
		case 0 :	// 선택
			m_ComboBox2.ResetContent();
			m_ComboBox3.ResetContent();
			m_ComboBox2.AddString(_T("선택"));
			m_ComboBox2.SetCurSel(0);
			m_ComboBox3.AddString(_T("선택"));
			m_ComboBox3.SetCurSel(0);
			break;
		case 1 :	// 서울
			m_ComboBox2.ResetContent();
			m_ComboBox3.ResetContent();
			for (int i = 0; i < sizeof(seoul) / sizeof(CString); i++)
			{
				data.Format(_T("%s"), seoul[i]);
				m_ComboBox2.AddString(data);
			}
			m_ComboBox2.SetCurSel(0);
			m_ComboBox3.AddString(_T("선택"));
			m_ComboBox3.SetCurSel(0);
			break;
		case 2 :	// 광주
			m_ComboBox2.ResetContent();
			m_ComboBox3.ResetContent();
			for (int i = 0; i < sizeof(gwangju) / sizeof(CString); i++)
			{
				data.Format(_T("%s"), gwangju[i]);
				m_ComboBox2.AddString(data);
			}
			m_ComboBox2.SetCurSel(0);
			m_ComboBox3.AddString(_T("선택"));
			m_ComboBox3.SetCurSel(0);
			break;
		case 3 :	// 사랑시
			m_ComboBox2.ResetContent();
			m_ComboBox3.ResetContent();
			for (int i = 0; i < sizeof(sarang) / sizeof(CString); i++)
			{
				data.Format(_T("%s"), sarang[i]);
				m_ComboBox2.AddString(data);
			}
			m_ComboBox2.SetCurSel(0);
			m_ComboBox3.AddString(_T("선택"));
			m_ComboBox3.SetCurSel(0);
			break;
	}
	
	m_ComboBox1.GetLBText(num, data);//get character at select position
	UpdateData(true);
	if (num == 0)
	{
		m_change_static1 = _T("");
		m_change_static2 = _T("");
		m_change_static3 = _T("");
	}
	else
	{
		m_change_static1 = data;
		m_change_static2 = _T("");
		m_change_static3 = _T("");
	}
	UpdateData(false);
}


void CNameDlg2::OnSelchangeCombo2()
{
	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
	int num1 = m_ComboBox1.GetCurSel();//Search the current position
	int num2 = m_ComboBox2.GetCurSel();//Search the current position
	CString data;
	m_ComboBox2.GetLBText(num2, data);//get character at select position

	if (num1 == 0)	// 시/군 : 선택
	{
		m_ComboBox2.ResetContent();
		m_ComboBox2.AddString(_T("선택"));
		m_ComboBox2.SetCurSel(0);
		m_ComboBox3.ResetContent();
		m_ComboBox3.AddString(_T("선택"));
		m_ComboBox3.SetCurSel(0);
	}
	else if (num1 == 1)	// 서울
	{
		switch (num2)
		{
			case 0 :	// 구/군 : 선택
				m_ComboBox3.ResetContent();
				m_ComboBox3.AddString(_T("선택"));
				m_ComboBox3.SetCurSel(0);
				break;
			case 1 :	// 구/군 : 강남
				m_ComboBox3.ResetContent();
				for (int i = 0; i < sizeof(gangnam) / sizeof(CString); i++)
				{
					data.Format(_T("%s"), gangnam[i]);
					m_ComboBox3.AddString(data);
				}
				m_ComboBox3.SetCurSel(0);
				break;
			case 2 :	// 구/군 : 강북
				m_ComboBox3.ResetContent();
				for (int i = 0; i < sizeof(gangbuk) / sizeof(CString); i++)
				{
					data.Format(_T("%s"), gangbuk[i]);
					m_ComboBox3.AddString(data);
				}
				m_ComboBox3.SetCurSel(0);
				break;
			case 3 :	// 구/군 : 강서
				m_ComboBox3.ResetContent();
				for (int i = 0; i < sizeof(gangseo) / sizeof(CString); i++)
				{
					data.Format(_T("%s"), gangseo[i]);
					m_ComboBox3.AddString(data);
				}
				m_ComboBox3.SetCurSel(0);
				break;
			case 4 :	// 구/군 : 강동
				m_ComboBox3.ResetContent();
				for (int i = 0; i < sizeof(gangdong) / sizeof(CString); i++)
				{
					data.Format(_T("%s"), gangdong[i]);
					m_ComboBox3.AddString(data);
				}
				m_ComboBox3.SetCurSel(0);
				break;
		}
	}
	else if (num1 == 2)		// 광주
	{
		switch (num2)
		{
			case 0 :	// 구/군 : 선택
				m_ComboBox3.ResetContent();
				m_ComboBox3.AddString(_T("선택"));
				m_ComboBox3.SetCurSel(0);
				break;
			case 1 :	// 구/군 : 광산구
				m_ComboBox3.ResetContent();
				for (int i = 0; i < sizeof(gwangsangu) / sizeof(CString); i++)
				{
					data.Format(_T("%s"), gwangsangu[i]);
					m_ComboBox3.AddString(data);
				}
				m_ComboBox3.SetCurSel(0);
				break;
			case 2 :	// 구/군 : 남구
				m_ComboBox3.ResetContent();
				for (int i = 0; i < sizeof(namgu) / sizeof(CString); i++)
				{
					data.Format(_T("%s"), namgu[i]);
					m_ComboBox3.AddString(data);
				}
				m_ComboBox3.SetCurSel(0);
				break;
			case 3 :	// 구/군 : 동구
				m_ComboBox3.ResetContent();
				for (int i = 0; i < sizeof(donggu) / sizeof(CString); i++)
				{
					data.Format(_T("%s"), donggu[i]);
					m_ComboBox3.AddString(data);
				}
				m_ComboBox3.SetCurSel(0);
				break;
			case 4 :	// 구/군 : 서구
				m_ComboBox3.ResetContent();
				for (int i = 0; i < sizeof(seogu) / sizeof(CString); i++)
				{
					data.Format(_T("%s"), seogu[i]);
					m_ComboBox3.AddString(data);
				}
				m_ComboBox3.SetCurSel(0);
				break;
			case 5 :	// 구/군 : 북구
				m_ComboBox3.ResetContent();
				for (int i = 0; i < sizeof(bukgu) / sizeof(CString); i++)
				{
					data.Format(_T("%s"), bukgu[i]);
					m_ComboBox3.AddString(data);
				}
				m_ComboBox3.SetCurSel(0);
				break;
		}
	}
	else if (num1 == 3)// 사랑시
	{
		switch (num2)
		{
			case 0 :
				m_ComboBox3.ResetContent();
				m_ComboBox3.AddString(_T("선택"));
				m_ComboBox3.SetCurSel(0);
			case 1 :
				m_ComboBox3.ResetContent();
				for (int i = 0; i < sizeof(goback) / sizeof(CString); i++)
				{
					data.Format(_T("%s"), goback[i]);
					m_ComboBox3.AddString(data);
				}
				m_ComboBox3.SetCurSel(0);
		}
	}

	CString data2;
	m_ComboBox1.GetLBText(num1, data);//get character at select position
	m_ComboBox2.GetLBText(num2, data2);
	UpdateData(true);
	if (num1 == 0)
	{
		m_change_static1 = _T("");
		m_change_static2 = _T("");
		m_change_static3 = _T("");
	}
	else
	{
		if (num2 == 0)
		{
			m_change_static1 = data;
			m_change_static2 = _T("");
			m_change_static3 = _T("");
		}
		else
		{
			m_change_static1 = data;
			m_change_static2 = data2;
			m_change_static3 = _T("");
		}
	}
	UpdateData(false);
	
}


void CNameDlg2::OnSelchangeCombo3()
{
	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
	int num1 = m_ComboBox1.GetCurSel();//Search the current position
	int num2 = m_ComboBox2.GetCurSel();//Search the current position
	int num3 = m_ComboBox3.GetCurSel();//Search the current position
	CString data, data2, data3;
	m_ComboBox1.GetLBText(num1, data);//get character at select position
	m_ComboBox2.GetLBText(num2, data2);//get character at select position
	m_ComboBox3.GetLBText(num3, data3);//get character at select position

	UpdateData(true);
	if (num1 == 0 && num2 == 0 && num3 == 0)
	{
		m_change_static1 = _T("");
		m_change_static2 = _T("");
		m_change_static3 = _T("");
	}
	else if (num1 != 0 && num2 == 0 && num3 == 0)
	{
		m_change_static1 = data;
		m_change_static2 = _T("");
		m_change_static3 = _T("");
	}
	else if (num1 != 0 && num2 != 0 && num3 == 0)
	{
		m_change_static1 = data;
		m_change_static2 = data2;
		m_change_static3 = _T("");
	}
	else
	{
		m_change_static1 = data;
		m_change_static2 = data2;
		m_change_static3 = data3;
	}
	UpdateData(false);
}

아까 셀렉 함수 코드에 데이터 업데이트 코드를 중간 중간 넣어준다

(머리가 안돌아가서 일단 하드 코딩으로 작성했는데, 나중에 바꿔야될 것 같고

또 예외 처리 다 했는데 사랑시 - 고백구 -행복동으로 설정하고 사랑시 - 선택으로 설정하면 동/면 컴포넌트에 행복동이 유지되는? 그런 예외가 아직 남았다 도저히 안돼서 일단 나중에 하는걸로,,)

 

예외 하나 빼곤 다 실행된다

 

마지막으로 확인 눌렀을 때 입력 값을 출력하는 알림창만 설정하자

 

다이얼로그 헤더 파일에서 알림창에 사용할 스트링 변수를 하나 선언해주고

 

소스 파일에서 생성한 변수에 출력하고 싶은 내용을 담는다

뷰 클래스도 위와 같이 수정해준다

반응형

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

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