
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 |