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