23.10.27 (금) 29일차
새 프로젝트를 만들고, 애플리케이션 종류 > 단일 문서, 프로젝트 스타일 > 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();
}
결과 화면
다이얼로그 띄우기 성공~
변수 추가하기
컨트롤 체크박스를 범주 > 컨트롤로 하고 이름을 바꿔준다.
// 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);
}
}
새 프로젝트에서 애플리케이션 종류 > 대화 상자 기반으로 생성하기
다이얼로그 디자인하기
클래스 마법사 설정
메시지에서 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 버튼을 누르면 중지되었다는 메세지가 뜬다
새 프로젝트 생성
최소화, 최대화 선택해주기
다이얼로그 만들고 속성 > 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"));
}
결과 화면