Размещение пользовательского элемента управления формы Windows Forms в диалоговом окне MFC
MFC предоставляет класс шаблона CWinFormsDialog , чтобы разместить пользовательский элемент управления Windows Forms (UserControl) в модальном или безрежимном диалоговом окне MFC. CWinFormsDialog
является производным от класса CDialog MFC, поэтому диалоговое окно может быть запущено как модальное или без режима.
Процесс, CWinFormsDialog
который используется для размещения пользовательского элемента управления, аналогичен описанному в разделе "Размещение пользовательского элемента управления Windows Form в диалоговом окне MFC". Однако управляет инициализацией и размещением пользовательского элемента управления, CWinFormsDialog
чтобы его не нужно было запрограммировать вручную.
Создание ведущего приложения MFC
Создайте проект приложения MFC.
В меню "Файл" выберите "Создать" и нажмите кнопку "Проект". В папке Visual C++ выберите приложение MFC.
В поле "Имя" введите
MFC03
и измените параметр решения на "Добавить в решение". Нажмите кнопку "ОК".В мастере приложений MFC примите все значения по умолчанию и нажмите кнопку "Готово". При этом создается приложение MFC с несколькими интерфейсами документов.
Настройка проекта.
В Обозреватель решений щелкните правой кнопкой мыши узел проекта MFC03 и выберите "Свойства". Откроется диалоговое окно "Страницы свойств".
В диалоговом окне "Страницы свойств" выберите "Общие свойства>конфигурации". В разделе "Параметры по умолчанию проекта" задайте поддержку среды CLR для поддержки среды CLR (/clr). Выберите OK.
Добавьте ссылку на элемент управления .NET.
В Обозреватель решений щелкните правой кнопкой мыши узел проекта MFC03 и выберите "Добавить", "Ссылки". На странице свойств нажмите кнопку "Добавить новую ссылку", выберите WindowsControlLibrary1 (на вкладке "Проекты") и нажмите кнопку "ОК". Это добавляет ссылку в виде параметра компилятора /FU , чтобы программа компилировала; она также копирует WindowsControlLibrary1.dll в
MFC03
каталог проекта, чтобы программа выполнялось.Добавьте
#include <afxwinforms.h>
в pch.h (stdafx.h в Visual Studio 2017 и более ранних версиях) в конце существующих#include
инструкций.Добавьте новый класс, который подклассы
CDialog
.Щелкните правой кнопкой мыши имя проекта и добавьте класс MFC (cHostForWinForm), который подклассы
CDialog
. Так как ресурс диалогового окна не нужен, можно удалить идентификатор ресурса (выберите "Представление ресурсов", разверните папку диалогового окна и удалитеIDD_HOSTFORWINFORM
ресурс. Затем удалите все ссылки на идентификатор в коде.).Замените
CDialog
файлы CHostForWinForm.h и CHostForWinForm.cpp файламиCWinFormsDialog<WindowsControlLibrary1::UserControl1>
.ВызовИте DoModal в классе CHostForWinForm.
Добавьте
#include "HostForWinForm.h"
в MFC03.cpp.Перед инструкцией return в определении CMFC03App::InitInstance добавьте:
CHostForWinForm m_HostForWinForm; m_HostForWinForm.DoModal();
Постройте и запустите проект.
В меню Сборка выберите Построить решение.
В меню отладки нажмите кнопку "Пуск" без отладки.
Затем вы добавите код для мониторинга состояния элемента управления в Windows Forms из приложения MFC.
Добавьте обработчик для 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 в 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 добавьте следующее объявление:
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Использование пользовательского элемента управления формы Windows Forms в MFC