Размещение пользовательского элемента управления формы Windows Forms в диалоговом окне MFC
Обновлен: Ноябрь 2007
В библиотеке MFC представлен класс шаблона CWinFormsDialog, который обеспечивает размещение пользовательского элемента управления Windows Forms (UserControl) в модальном или немодальном диалоговом окне MFC. Класс CWinFormsDialog наследуется от класса CDialog библиотеки MFC и обеспечивает запуск диалогового окна в модальном или немодальном режиме.
Процесс, в котором используется класс CWinFormsDialog, подобен описанному в разделе Размещение пользовательского элемента управления формы Windows Forms в диалоговом окне MFC. Однако класс CWinFormsDialog обеспечивает автоматическое управление инициализацией и размещением пользовательского элемента управления и не требует программирования этих функций вручную.
Образец приложения, в котором используются элементы управления Windows Forms и диалоговые окна MFC, см. на веб-странице Интеграция MFC и WinForms (на английском языке).
Создание ведущего приложения MFC
Создайте новый проект приложения MFC.
В меню Файл выберите команду New и затем пункт Проект. В папке Visual C++ выберите значок приложения MFC.
В поле Имя введите MFC03, затем измените значение параметра "Решение" на Добавить в решение. Нажмите кнопку ОК.
В мастере приложений MFC примите все параметры по умолчанию и нажмите кнопку Готово. Создается приложение MFC с интерфейсом MDI.
Настройте конфигурацию проекта.
В обозревателе решений щелкните правой кнопкой мыши узел проекта MFC03 и выберите пункт Свойства в контекстном меню. Открывается диалоговое окно Страницы свойств.
В диалоговом окне Страницы свойств в дереве Свойства конфигурации выберите пункт Общие, затем в разделе Значения по умолчанию для проекта установите для параметра Поддержка общеязыковой среды выполнения (CLR) значение Поддержка CLR-среды (/clr). Нажмите кнопку OК.
Добавьте ссылку на элемент управления .NET.
В обозревателе решений щелкните правой кнопкой мыши узел проекта MFC03 и выберите пункт Ссылки. В окне Страница свойств выберите пункт Добавить новую ссылку, выберите проект WindowsControlLibrary1 (на вкладке Проекты) и нажмите кнопку ОК. В результате этого добавляется ссылка в форме параметра компилятора /FU, что позволяет скомпилировать программу. Также в каталог проекта MFC03 копируется файл WindowsControlLibrary1.dll, что позволяет выполнять программу.
В файле stdafx.h добавьте оператор #include <afxwinforms.h> после существующих операторов #include.
Добавьте новый класс, который наследуется от класса CDialog.
Щелкните правой кнопкой мыши имя проекта и добавьте класс MFC с именем CHostForWinForm, который наследуется от класса CDialog. Поскольку ресурсы диалогового окна не используются, можно удалить идентификатор ресурса. Для этого выберите пункт "Ресурсы", разверните папку "Диалоговое окно" и удалите ресурс IDD_HOSTFORWINFORM. Затем удалите любые ссылки на этот идентификатор в коде.
Замените класс CDialog в файлах CHostForWinForm.h и CHostForWinForm.cpp классом CWinFormsDialog<WindowsControlLibrary1::UserControl1>.
Вызовите метод DoModal для класса CHostForWinForm.
В файл MFC03.cpp добавьте строку #include "HostForWinForm.h".
Добавьте следующие строки перед оператором return в определении CMFC03App::InitInstance:
CHostForWinForm m_HostForWinForm;
m_HostForWinForm.DoModal();
Выполните построение и запуск проекта.
В меню Построение выберите команду Построить решение.
В меню Отладка выберите команду Запуск без отладки.
Далее добавьте код для отслеживания состояния элемента управления на форме Windows Forms из приложения MFC.
Добавьте обработчик событий OnInitDialog.
Откройте окно Свойства (нажмите клавишу F4). На панели инструментов Представление классов выберите класс CHostForWinForm. В окне Свойства выберите overrides, затем в строке OnInitDialog щелкните левый столбец и выберите < Добавить >. В файл CHostForWinForm.h добавляется следующая строка:
virtual BOOL OnInitDialog();
В файле CHostForWinForm.cpp определите обработчик событий OnInitDialog следующим образом:
BOOL CHostForWinForm::OnInitDialog() { CWinFormsDialog<WindowsControlLibrary1::UserControl1>::OnInitDialog(); GetControl()->button1->Click += MAKE_DELEGATE(System::EventHandler, OnButton1); return TRUE; }
Далее добавьте обработчик событий OnButton1. В файле CHostForWinForm.h добавьте следующие строки в раздел public класса 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 Forms выполняется код приложения MFC.
Далее добавьте код для отображения в приложении MFC значения, содержащегося в текстовом поле на форме Windows Forms.
В файле CHostForWinForm.h добавьте следующее объявление в разделе public класса 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.UserControl
Другие ресурсы
Использование пользовательского элемента управления формы Windows Form в MFC