학습목표    1

학습주제    1

예습내용    1

실습방법    1

        1

중요함수    1

모달대화상자, 메뉴작성

학습목표

모달대화상자 기반 에플리케이션과 메뉴작성을 공부한다.

학습주제

메뉴에서 모달을 선택하면 모달대화상자를 만들고 상자에 있는 데이터를 가져옵니다. 이는 대화상자에서 확인을 누른 후에 대화상자가 사라질 존재하는 데이터를 가져 옵니다. 이는 구현 하기가 쉽지만 대화상자 존재할 때는 데이터를 가져올 없어서 환경 설정든 선택이 모두 끝난 후에 데이터를 가져올 경우에 활용하면 됩니다.

단원의 내용은 “Visusal C++.NET 실전 프로그래밍”,이재원저, 가메출판사  p428~p442 참조 했습니다.

예습내용

싱글다큐먼트

실습방법

   

1. 싱글다큐먼트로 프로젝트를 만든다.

l  프로젝트명 : DialogTest

l  프로젝트 타입 : MFC -> MFC 응용프로그램

l  추가 옵션 : 단일문서를 선택한다.

유니코드 라이브러리 사용을 해제한다.

나머지는 기본을 선택하거나 마침 선택한다.

 

2. 다이어로그 리소스 추가

“Resource View”에서 다이어로그 리소스를 추가한 후에 아래 포를 참조하여 다이어로그를 구성한다.

 

컨트롤

ID

Caption

컨트롤 변수

텍스트

기본값

이름변경

 

라디오버튼

IDC_PARK

박태준

 

라디오버튼

IDC_HUH

허만권

 

라디오버튼

IDC_LEE

이상용

 

 

 

 

 

3. 다이어로그 클래스 추가

위에서 다이어로그를 관리하기 위해 클래스를 만든다. 마우스로 다이어로그 박스를 더블크릭 하거나 마우스 오른쪽키를 눌러서 클래스 추가 선택한다. 클래스 이름은 “CNameDlg” 입력한다.

 

                   

 

선택된 사람을 저장하기 위해 정수형 변수 “m_Name” 선언한다.

 

#pragma once

 

 

// CNameDlg 대화상자입니다.

 

class CNameDlg : public CDialog

{

              DECLARE_DYNAMIC(CNameDlg)

 

public:

              CNameDlg(CWnd* pParent = NULL);   // 표준생성자입니다.

              virtual ~CNameDlg();

 

// 대화상자데이터입니다.

              enum { IDD = IDD_DIALOG1 };

 

protected:

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

 

              DECLARE_MESSAGE_MAP()

public:

              int m_Name;

};

 

또한 위의 변수를 “CDialogTestDoc” 클래스에도 저장하여 다른 클래스에서도 참조 있게 한다.

 

 

// DialogTestDoc.h : CDialogTestDoc 클래스의인터페이스

//

 

#pragma once

 

 

class CDialogTestDoc : public CDocument

{

protected: // serialization에서만만들어집니다.

              CDialogTestDoc();

              DECLARE_DYNCREATE(CDialogTestDoc)

 

// 특성입니다.

public:

 

// 작업입니다.

public:

 

// 재정의입니다.

public:

              virtual BOOL OnNewDocument();

              virtual void Serialize(CArchive& ar);

 

// 구현입니다.

public:

              virtual ~CDialogTestDoc();

#ifdef _DEBUG

              virtual void AssertValid() const;

              virtual void Dump(CDumpContext& dc) const;

#endif

 

protected:

 

// 생성된메시지맵함수

protected:

              DECLARE_MESSAGE_MAP()

public:

              int m_Name;

};

 

 

4. OnInitDialog() 멤버 함수를 추가한다.

다이어로그 박스가 나타날 선택된 사람을 라디오 버튼에 표시하기 위해 “OnInitDialog()” 멤버 함수를 추가한 후에 프로그램을 추가 한다.

 

BOOL CNameDlg::OnInitDialog()

{

              CDialog::OnInitDialog();

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

              CButton* pBtn;

              switch (m_Name)

              {

              case 0:

                             pBtn = (CButton*)GetDlgItem(IDC_PARK);

                             break;

              case 1:

                             pBtn = (CButton*)GetDlgItem(IDC_HUH);

                             break;

              case 2:

                             pBtn = (CButton*)GetDlgItem(IDC_LEE);

                             break;

              }

              pBtn->SetCheck(TRUE);

              return TRUE;  // return TRUE unless you set the focus to a control

              // 예외: OCX 속성페이지는FALSE를반환해야합니다.

}

 

 

5. 라디오버튼 핸들러 작성

라디오 버튼을 선택했을 m_Name 값을 변경할 있도록 라디오 버튼을 더블 클릭하여 다음과 같은 핸들러를 만든다.

 

void CNameDlg::OnBnClickedPark()

{

              // TODO: 여기에컨트롤알림처리기코드를추가합니다.

              m_Name = 0;

}

 

void CNameDlg::OnBnClickedHuh()

{

              // TODO: 여기에컨트롤알림처리기코드를추가합니다.

              m_Name = 1;

}

 

void CNameDlg::OnBnClickedLee()

{

              // TODO: 여기에컨트롤알림처리기코드를추가합니다.

              m_Name = 2;

}

 

 

6. 메뉴항목 명령 핸들러 추가

리소스뷰에서 메뉴 “IDR_MAINFRAME” 선택하고 아래 그림과 같이 메뉴를 만들고 ID 수정한다.

 

 

메뉴항목

ID

비고

 

 

이름

 

메뉴바

 

 

이름선택(Modal)

ID_NAME_MODAL

 

 

 

 

클래스뷰에서 “CDialogTestView” 클래스를 선택하고 속성윈도우에서 이벤트버튼을 누르면 나타나는 ID 창에서 “ID_NAME_MODAL” 선택하고 명령핸들러를 추가한다.

 

 

선택된 사람을 Document 클래스의 m_Name 멤버에 있는 객체를 dlg 객체의 m_Name 전달하고 DoMoal() 멤버 함수의 확인 누르면 선택된 사람의 m_Name Document 클래스의 m_Name 멤버에 전달한다.

 

// DialogTestView.cpp : CDialogTestView 클래스의구현

//

 

#include "stdafx.h"

#include "DialogTest.h"

 

#include "DialogTestDoc.h"

#include "DialogTestView.h"

 

#include "NameDlg.h"

 

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

 

// ============ 중간 생략======================

 

void CDialogTestView::OnNameModal()

{

              // TODO: 여기에명령처리기코드를추가합니다.

              CNameDlg dlg;

 

              dlg.m_Name = GetDocument()->m_Name;

 

              if(dlg.DoModal() == IDOK)

              {

                             GetDocument()->m_Name = dlg.m_Name;

              }

}

 

 

 

처음

   

 

중요함수