MFC는 모달 또는 모덜리스 MFC 대화 상자에서 Windows Forms 사용자 컨트롤(CWinFormsDialog
)을 호스트할 수 있도록 템플릿 클래스 UserControl 를 제공합니다.
CWinFormsDialog
는 MFC 클래스 CDialog
에서 파생되므로 대화 상자를 모달 또는 모덜리스로 시작할 수 있습니다.
사용자 컨트롤을 호스트하는 데 사용하는 프로세스는 CWinFormsDialog
프로세스 와 비슷합니다. 그러나 CWinFormsDialog
수동으로 프로그래밍할 필요가 없도록 사용자 컨트롤의 초기화 및 호스팅을 관리합니다.
MFC 호스트 애플리케이션을 만들려면
MFC 애플리케이션 프로젝트를 만듭니다.
[파일] 메뉴에서 [새로 만들기]를 선택한 다음 [프로젝트]를 클릭합니다. Visual C++ 폴더에서 MFC 애플리케이션을 선택합니다.
이름 상자에 솔루션 설정을 입력
MFC03
하고 솔루션에 추가로 변경합니다. OK를 클릭합니다.MFC 애플리케이션 마법사에서 모든 기본값을 적용한 다음 마침을 클릭합니다. 이렇게 하면 다중 문서 인터페이스가 있는 MFC 애플리케이션이 만들어집니다.
프로젝트를 구성합니다.
솔루션 탐색기 MFC03 프로젝트 노드를 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다. 속성 페이지 대화 상자가 나타납니다.
속성 페이지 대화 상자에서 구성 속성>을 선택합니다. 프로젝트 기본값 섹션에서 공용 언어 런타임 지원을공용 언어 런타임 지원(/clr)으로 설정합니다. 확인을 선택합니다.
.NET 컨트롤에 대한 참조를 추가합니다.
솔루션 탐색기 MFC03 프로젝트 노드를 마우스 오른쪽 단추로 클릭하고 추가, 참조를 선택합니다. 속성 페이지에서 새 참조 추가를 클릭하고 WindowsControlLibrary1(프로젝트 탭 아래)을 선택한 다음 확인을 클릭합니다. 이것은 프로그램이 컴파일되도록
/FU
컴파일러 옵션 참조를 추가합니다. 또한WindowsControlLibrary1.dll
을(를)MFC03
프로젝트 디렉터리에 복사하여 프로그램이 실행되도록 합니다.기존
#include <afxwinforms.h>
문의 끝에 pch.h(Visual Studio 2017 이하의 stdafx.h)에 추가#include
합니다.서브클래싱하는 새 클래스를 추가합니다
CDialog
.프로젝트 이름을 마우스 오른쪽으로 클릭한 후
CHostForWinForm
를 서브클래싱하는 MFC 클래스(CDialog
라고 호출)를 추가합니다. 대화 상자 리소스가 필요하지 않으므로 리소스 ID를 삭제할 수 있습니다(리소스 보기 선택, 대화 상자 폴더 확장 및 리소스 삭제IDD_HOSTFORWINFORM
). 그런 다음 코드에서 ID에 대한 참조를 제거합니다.).CDialog
및CHostForWinForm.h
파일에서CHostForWinForm.cpp
를CWinFormsDialog<WindowsControlLibrary1::UserControl1>
로 대체하십시오.DoModal
클래스에서CHostForWinForm
을(를) 호출합니다.MFC03.cpp
에#include "HostForWinForm.h"
을(를) 추가합니다.정의에서 return 문 앞에 다음을 추가:
CMFC03App::InitInstance
CHostForWinForm m_HostForWinForm; m_HostForWinForm.DoModal();
프로젝트를 빌드하고 실행합니다.
빌드 메뉴에서 솔루션 빌드를 클릭합니다.
디버그 메뉴에서 디버깅하지 않고 시작을 클릭합니다.
다음으로 MFC 애플리케이션에서 Windows Forms의 컨트롤 상태를 모니터링하는 코드를 추가합니다.
OnInitDialog
에 대한 처리기를 추가합니다.속성 창(F4)을 표시합니다. 클래스 뷰에서 .를 선택합니다
CHostForWinForm
. 속성 창에서OnInitDialog
행을 선택하고, 왼쪽 열을 클릭한 다음 <을 선택하여 > 추가합니다. 다음 줄을CHostForWinForm.h
에 추가합니다.virtual BOOL OnInitDialog();
OnInitDialog
다음과 같이 정의합니다(inCHostForWinForm.cpp
).BOOL CHostForWinForm::OnInitDialog() { CWinFormsDialog<WindowsControlLibrary1::UserControl1>::OnInitDialog(); GetControl()->button1->Click += MAKE_DELEGATE(System::EventHandler, OnButton1); return TRUE; }
다음으로
OnButton1
처리기를 추가합니다. 클래스의 public 섹션CHostForWinForm
에 다음 줄을 추가합니다.CHostForWinForm.h
virtual void OnButton1( System::Object^ sender, System::EventArgs^ e ); BEGIN_DELEGATE_MAP( CHostForWinForm ) EVENT_DELEGATE_ENTRY( OnButton1, System::Object^, System::EventArgs^ ); END_DELEGATE_MAP()
에서
CHostForWinForm.cpp
다음 정의를 추가합니다.void CHostForWinForm::OnButton1( System::Object^ sender, System::EventArgs^ e ) { System::Windows::Forms::MessageBox::Show("test"); }
프로젝트를 빌드하고 실행합니다. Windows Form에 있는 단추를 클릭하면 MFC 애플리케이션의 코드가 실행됩니다.
다음으로 MFC 코드에서 Windows Form의 텍스트 상자에 값을 표시할 코드를 추가합니다.
클래스
CHostForWinForm
의CHostForWinForm.h
public 섹션에서 다음 선언을 추가합니다.CString m_sEditBoxOnWinForm;
DoDataExchange
의 정의에서CHostForWinForm.cpp
함수의 끝에 다음 네 줄을 추가하십시오.if (pDX->m_bSaveAndValidate) m_sEditBoxOnWinForm = CString( GetControl()->textBox1->Text); else GetControl()->textBox1->Text = gcnew System::String(m_sEditBoxOnWinForm);
OnButton1
에서CHostForWinForm.cpp
의 정의에 다음 세 줄을 함수의 끝 부분에 추가합니다.this->UpdateData(TRUE); System::String ^ z = gcnew System::String(m_sEditBoxOnWinForm); System::Windows::Forms::MessageBox::Show(z);
프로젝트를 빌드하고 실행합니다.
참고 항목
System.Windows.Forms.UserControl
MFC에서 Windows Form 사용자 정의 컨트롤 사용