[Intel AI SW 아카데미] MFC - Dialog

Jimeaning·2023년 10월 27일
0

Intel AIoT

목록 보기
10/38

23.10.27 (금) 29일차

Dialog (SDI based)

새 프로젝트를 만들고, 애플리케이션 종류 > 단일 문서, 프로젝트 스타일 > MFC standard로 설정

리소스 뷰에서 리소스 추가해서 다이얼로그 하나 더 만들어주기

속성 창에서 캡션을 바꾸면 타이틀이 바뀐다

메뉴 창
메뉴 창에 Dialog > 다이얼로그 열기를 만들어준다
ID도 수정해주기

클래스 추가
다이얼로그 박스 위에서 !! 클래스 추가 열기

클래스 이름에는 C를 붙여주고, 파일 이름에는 C를 빼주기 (그냥 약속~)
+) 이렇게 만들면 오류가 날 것이다 ..ㅎ 기본 클래스를 CDialogEx가 아니라 CDialog로 만들어야 한다 ~~!
클래스 이름 CDlgTestView에서 IDD_Dialog Command를 활성화해주기
도구 상자에서 다이얼로그 꾸며주기

코드

// DlgTestView.cpp

#include "NameDlg.h"

void CDlgTestView::OnIddDialog()
{
	CNameDlg dlg;
	dlg.DoModal();
}

코드는 이것만 추가해주면 다이얼로그가 잘 뜰 것이다.

혹시 몰라서 헤더파일도 첨부,,

// NameDlg.h

#pragma once
#include "afxdialogex.h"


// CNameDlg 대화 상자

class CNameDlg : public CDialog
{
	DECLARE_DYNAMIC(CNameDlg)

public:
	CNameDlg(CWnd* pParent = nullptr);   // 표준 생성자입니다.
	virtual ~CNameDlg();

// 대화 상자 데이터입니다.
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_DIALOG1 };
#endif

protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 지원입니다.

	DECLARE_MESSAGE_MAP()
};

버튼에 동작 추가하기

변수 추가에서
이름창은 다음과 같이 추가하기
변수 이름은 m으로 시작.
나이 창은 int형으로

변수 값 제한하기

// NameDlg.cpp

void CNameDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Text(pDX, IDC_EDIT1, m_strName);
	DDV_MaxChars(pDX, m_strName, 10);
	DDX_Text(pDX, IDC_EDIT2, m_nAge);
	DDV_MinMaxInt(pDX, m_nAge, 0, 100);
}

Age에 200을 넣으면 해당 다이얼로그가 뜸 (변수를 1에서 100까지로 설정해주었기 때문. 100은 됨!)

초기값 넣기

// DlgTestView.cpp

void CDlgTestView::OnIddDialog()
{
	CNameDlg dlg;
	dlg.m_strName = _T("Merlin");
	dlg.m_nAge = 20;

	dlg.DoModal();

}

입력된 값 출력하기

// DlgTestView.cpp

void CDlgTestView::OnIddDialog()
{
	CNameDlg dlg;
	dlg.m_strName = _T("Merlin");
	dlg.m_nAge = 20;

	if (dlg.DoModal() == IDOK)
	{
		CString strOutText;
		strOutText.Format(_T("Name: %s, Age: %d"), dlg.m_strName, dlg.m_nAge);
		AfxMessageBox(strOutText);

	}
}

체크 박스 추가하기

속성에서 왼쪽 텍스트를 True로 바꾸고 캡션을 다음과 같이 바꿔준다.

마우스 오른쪽을 클릭해 제어 변수를 추가한다.

코드

// DlgTestView.cpp

void CDlgTestView::OnIddDialog()
{
	CNameDlg dlg;
	dlg.m_strName = _T("Merlin");
	dlg.m_nAge = 20;

	if (dlg.DoModal() == IDOK)
	{
		CString strOutText;
		strOutText.Format(_T("Name: %s, Age: %d\nLicense %d"),
			dlg.m_strName, dlg.m_nAge, dlg.m_bLicense);
		AfxMessageBox(strOutText);

	}
}

Checkbox가 체크되면 1이 출력됨. 안 되면 0.

라디오 버튼 추가

다이얼로그에 라디오 버튼 네 개 추가
그룹 박스로 묶어주기
밑에도 똑같이 ,,

탭 키 순서 정하기
다이얼로그에서 Ctrl + d를 누르면 탭 키 순서를 설정할 수 있다.

Police와 1F만 속성에서 그룹을 True로 바꿔준다.
탭 키가 그룹 박스 안에서만 움직일 수 있도록 !

변수 연결하기
Police와 1F 변수 추가해서 연결한다.

코드

// DlgTestView.h

void CDlgTestView::OnIddDialog()
{
	CNameDlg dlg;
	CString temp;

	dlg.m_strName = _T("Merlin");
	dlg.m_nAge = 20;

	if (dlg.DoModal() == IDOK)
	{
		CString strOutText, strOutText2;
		strOutText.Format(_T("Name: %s, Age: %d"),
			dlg.m_strName, dlg.m_nAge);
		AfxMessageBox(strOutText);
		strOutText2.Format(_T(" Job: %d, Residence : %d, Licence: %d"), dlg.m_nJob, dlg.m_nResidence, dlg.m_bLicense);

		temp = strOutText + strOutText2;
		AfxMessageBox(temp);
	}
}

결과 화면
디폴트로 선택되어 있는 것을 볼 수 있음.
라디오버튼은 0부터 시작


스핀 컨트롤 추가하기

도구 상자에서 Spin Control 가져오기
속성을 다음과 같이 보여주기

Ctrl + d를 눌러 Name 입력란을 1, Age 입력란을 2, Spin Control을 3으로 해주면 Age 입력란 옆에 붙음 ! (ctrl d 눌렀을 때 뜨는 화면은 캡쳐가 안 됨..)


새로운 다이얼로그 추가하기

리소스 뷰에서 다이얼로그 하나 더 추가

다이얼로그 다음과 같이 디자인
다이얼로그 위에서 클래스 다음과 같이 추가하기

메뉴에 컨트롤 박스 추가하고 속성(ID) 변경하기

클래스 마법사 설정

코드

// DlgTestView.cpp

#include "NameDlg2.h"

void CDlgTestView::OnIddDlg2()
{
	CNameDlg2 dlg2;
	dlg2.DoModal();

}

결과 화면
다이얼로그 띄우기 성공~


변수 추가하기
컨트롤 체크박스를 범주 > 컨트롤로 하고 이름을 바꿔준다.

  • Visible & Hide 버튼은 함수 처리
    각각 버튼을 더블 클릭해 함수를 만들어준다.

    코드
// NameDlg2.cpp

BEGIN_MESSAGE_MAP(CNameDlg2, CDialog)
	ON_BN_CLICKED(IDC_BUTTON1, &CNameDlg2::OnBnClickedButton1)
	ON_BN_CLICKED(IDC_BUTTON2, &CNameDlg2::OnBnClickedButton2)
END_MESSAGE_MAP()


// CNameDlg2 메시지 처리기


void CNameDlg2::OnBnClickedButton1()
{
	m_ctrlCheck.ShowWindow(SW_SHOW);

}


void CNameDlg2::OnBnClickedButton2()
{
	m_ctrlCheck.ShowWindow(SW_HIDE);

}

컨트롤이 버튼 클릭에 따라 나타났다 사라졌다 함

확인 버튼을 누르면 메세지 박스 출력

// DlgTestView.cpp

void CDlgTestView::OnIddDlg2()
{
	CNameDlg2 dlg2;
	CString temp;

	if (dlg2.DoModal() == IDOK)
	{
		temp.Format(_T("컨트롤 키가 눌렸음"));
		AfxMessageBox(temp);
	}

}


Timer

새 프로젝트에서 애플리케이션 종류 > 대화 상자 기반으로 생성하기

다이얼로그 디자인하기

클래스 마법사 설정
메시지에서 WM_TIMER를 더블 클릭해 활성화시킨다

변수 추가
클래스 뷰에서 CTimerDlg > 추가 > 변수 추가
m_bTimer, m_bTimer1을 bool 형식으로 추가한다.

코드

// TimerDlg.cpp

CTimerDlg::CTimerDlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_TIMER_DIALOG, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	m_bTimer = 1;
	m_bTimer1 = 1;
}

void CTimerDlg::OnBnClickedButton1()
{
	m_bTimer = 1;
	if (m_bTimer == 1)
	{
		SetTimer(0, 3000, NULL);  // 타이머 설정
	}

}


void CTimerDlg::OnBnClickedButton2()
{
	m_bTimer = 1;
	if (m_bTimer1 == 1)
	{
		SetTimer(1, 5000, NULL);  // 타이머 설정
	}

}


void CTimerDlg::OnBnClickedButton3()
{
	if (m_bTimer == 1) m_bTimer = 0;
	KillTimer(0);
	AfxMessageBox(_T("Timer0이 중지되었습니다!!"));

}


void CTimerDlg::OnBnClickedButton4()
{
	if (m_bTimer1 == 1) m_bTimer1 = 0;
	KillTimer(1);
	AfxMessageBox(_T("Timer1이 중지되었습니다!!"));

}


void CTimerDlg::OnTimer(UINT_PTR nIDEvent)
{
	if (nIDEvent == 0) AfxMessageBox(_T("Timer1 3sec!!"));
	if (nIDEvent == 1) AfxMessageBox(_T("Timer2 5sec!!"));

	CDialogEx::OnTimer(nIDEvent);
}

결과 화면

  • Timer 1 Start 버튼을 누르면 3초 후에 메세지 박스가 뜬다
    Timer 1 Stop 버튼을 누르면 중지되었다는 메세지가 뜬다

  • Timer 2 Start 버튼을 누르면 5초 후에 메세지 박스가 든다
    Timer 2 Stop 버튼을 누르면 중지되었다는 메세지가 뜬다


Dialog 2 (Resource Control)

새 프로젝트 생성
최소화, 최대화 선택해주기

다이얼로그 만들고 속성 > ID : IDD_DIGTEST로 바꾸기

클래스 추가

메뉴 추가
속성 > ID : IDD_DIALOGSHOW로 바꿔주기

클래스 마법사
클래스 이름은 OnDialogshow로 해줌

코드

// MExDlgView.cpp

#include "DlgTest.h"

void CMExDlgView::OnDialogshow()
{
	CDlgTest* pDlg = new CDlgTest;
	pDlg->DoModal();
	delete pDlg;
}

체크 박스나 라디오 버튼, 버튼을 클릭하면 메세지가 떠요

다이얼로그 디자인

변수 추가

코드

// MExDlgView.cpp

void CDlgTest::OnBnClickedCheck1()
{
	UpdateData(TRUE);
	CString message;
	message.Format(_T("Check button press value:%d"),m_bCheckButton);
	AfxMessageBox(message);

}


void CDlgTest::OnBnClickedRadio1()
{
	AfxMessageBox(_T("Radio Button 1 Press"));	
}


void CDlgTest::OnBnClickedRadio2()
{
	AfxMessageBox(_T("Radio Button 2 Press"));

}


void CDlgTest::OnBnClickedButton1()
{
	AfxMessageBox(_T("Button 1 Press"));

}

결과 화면

profile
I mean

0개의 댓글