대화상자 기반

유혜정·2022년 4월 18일
0
post-thumbnail

생성 설정

대화상자 기반 초기 화면


----LogonDemo.cpp

	CLogonDemoDlg dlg;
	m_pMainWnd = &dlg; // AfxGetMainWnd() -> CLogonDemoDlg의 객체를 얻음
	INT_PTR nResponse = dlg.DoModal(); // 대화상자를 띄우는 코드

대화상자 기반 특징

직관적으로 윈도우 화면을 구성할 수 있음

static Text

Edit Control

Picture Control

----2Dlg.cpp


void CLogonDemo2Dlg::OnBnClickedCancel()
{
	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
	CDialog::OnCancel();
}


void CLogonDemo2Dlg::OnBnClickedOk()
{
	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
	CString strId;
	CString strPwd;

	GetDlgItemText(IDC_EDIT1, strId); // 화면의 값을 변수로 읽어 들임
	GetDlgItemText(IDC_EDIT2, strPwd);

	if (strId == _T("aaaa") && strPwd == _T("1234")) {
		CDialog::OnOK();
	}
	else {
		MessageBox(_T("아이디 또는 비밀번호가 잘못되었습니다."));
	}
	CDialog::OnOK();
}

초기화

----2Dlg.cpp

// 윈도우가 생성됬을 때 알려주는 메세지 : WM_CREATE
BOOL CLogonDemo2Dlg::OnInitDialog() // WM_INITDIAlOG
{
	CDialog::OnInitDialog();

	// 시스템 메뉴에 "정보..." 메뉴 항목을 추가합니다.

	// IDM_ABOUTBOX는 시스템 명령 범위에 있어야 합니다.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != nullptr)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 이 대화 상자의 아이콘을 설정합니다.  응용 프로그램의 주 창이 대화 상자가 아닐 경우에는
	//  프레임워크가 이 작업을 자동으로 수행합니다.
	SetIcon(m_hIcon, TRUE);			// 큰 아이콘을 설정합니다.
	SetIcon(m_hIcon, FALSE);		// 작은 아이콘을 설정합니다.

	// TODO: 여기에 추가 초기화 작업을 추가합니다.
	CString strText = _T("ID 입력");
	SetDlgItemText(IDC_EDIT1, strText); // 초기 글자 입력
	// 변수 값을 화면에 출력


	return TRUE;  // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다.
}



코드에 추가됨
----Dlg.h

public:
	afx_msg void OnBnClickedCancel();
	afx_msg void OnBnClickedOk();
	CString m_strID;
};

----Dlg.cpp

void CLogonDemo2Dlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Text(pDX, IDC_EDIT1, m_strID);
	DDV_MaxChars(pDX, m_strID, 12);
}

코드 변경하기

// 윈도우가 생성됬을 때 알려주는 메세지 : WM_CREATE
BOOL CLogonDemo2Dlg::OnInitDialog() // WM_INITDIAlOG
{
	CDialog::OnInitDialog();

	// 시스템 메뉴에 "정보..." 메뉴 항목을 추가합니다.

	// IDM_ABOUTBOX는 시스템 명령 범위에 있어야 합니다.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != nullptr)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 이 대화 상자의 아이콘을 설정합니다.  응용 프로그램의 주 창이 대화 상자가 아닐 경우에는
	//  프레임워크가 이 작업을 자동으로 수행합니다.
	SetIcon(m_hIcon, TRUE);			// 큰 아이콘을 설정합니다.
	SetIcon(m_hIcon, FALSE);		// 작은 아이콘을 설정합니다.

	// TODO: 여기에 추가 초기화 작업을 추가합니다.
	// 변수 값을 화면에 출력1
	//CString strText = _T("ID 입력");
	//SetDlgItemText(IDC_EDIT1, strText); // 초기 글자 입력

	// 변수 값을 화면에 출력2
	m_strID = _T("ID 입력");
	UpdateData(FALSE);
	

	return TRUE;  // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다.
}
/////////
void CLogonDemo2Dlg::OnBnClickedOk()
{
	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
	//CString strId;
	//CString strPwd;

	//GetDlgItemText(IDC_EDIT1, strId); // 화면의 값을 변수로 읽어 들임
	//GetDlgItemText(IDC_EDIT2, strPwd);

	UpdateData();

	if (m_strID == _T("aaaa") && m_strPW == _T("1234")) {
		MessageBox(_T("로그인 성공"), _T("로그인"), MB_ICONEXCLAMATION | MB_OK);

		CDialog::OnOK();
	}
	else {
		MessageBox(_T("아이디 또는 비밀번호가 잘못되었습니다."));
	}
	//CDialog::OnOK();
}

디버깅으로 띄우기

----2.cpp

BOOL CLogonDemo2App::InitInstance()
{
	// 애플리케이션 매니페스트가 ComCtl32.dll 버전 6 이상을 사용하여 비주얼 스타일을
	// 사용하도록 지정하는 경우, Windows XP 상에서 반드시 InitCommonControlsEx()가 필요합니다.
	// InitCommonControlsEx()를 사용하지 않으면 창을 만들 수 없습니다.
	INITCOMMONCONTROLSEX InitCtrls;
	InitCtrls.dwSize = sizeof(InitCtrls);
	// 응용 프로그램에서 사용할 모든 공용 컨트롤 클래스를 포함하도록
	// 이 항목을 설정하십시오.
	InitCtrls.dwICC = ICC_WIN95_CLASSES;
	InitCommonControlsEx(&InitCtrls);

	CWinApp::InitInstance();


	AfxEnableControlContainer();


	// 표준 초기화
	// 이들 기능을 사용하지 않고 최종 실행 파일의 크기를 줄이려면
	// 아래에서 필요 없는 특정 초기화
	// 루틴을 제거해야 합니다.
	// 해당 설정이 저장된 레지스트리 키를 변경하십시오.
	// TODO: 이 문자열을 회사 또는 조직의 이름과 같은
	// 적절한 내용으로 수정해야 합니다.
	SetRegistryKey(_T("로컬 애플리케이션 마법사에서 생성된 애플리케이션"));

	CLogonDemo2Dlg dlg;
	m_pMainWnd = &dlg;
	INT_PTR nResponse = dlg.DoModal();
	if (nResponse == IDOK)
	{
		TRACE("id = %d\n", dlg.m_strID); // Dlg.h 값 가져오기
		TRACE("pwd = %d\n", dlg.m_strPW);

		//AfxMessageBox(_T("로그인 성공"));
		// MessageBox를 쓰려면 부모가 Wnd여야 함
		// App의 부모는 Object임 -> messagebox를 호출 불가
		// 따라서 전역함수인 AfxMessageBox로 호출
	}
	else if (nResponse == IDCANCEL)
	{
		// TODO: 여기에 [취소]를 클릭하여 대화 상자가 없어질 때 처리할
		//  코드를 배치합니다.
	}
	else if (nResponse == -1)
	{
		TRACE(traceAppMsg, 0, "경고: 대화 상자를 만들지 못했으므로 애플리케이션이 예기치 않게 종료됩니다.\n");
	}


#if !defined(_AFXDLL) && !defined(_AFX_NO_MFC_CONTROLS_IN_DIALOGS)
	ControlBarCleanUp();
#endif

	// 대화 상자가 닫혔으므로 응용 프로그램의 메시지 펌프를 시작하지 않고 응용 프로그램을 끝낼 수 있도록 FALSE를
	// 반환합니다.
	return FALSE;
}
profile
내가 시작한 공부, 공유할 코드

0개의 댓글