Поделиться через


Размещение пользовательского элемента управления формы Windows Forms в диалоговом окне MFC

MFC предоставляет класс шаблона CWinFormsDialog , чтобы разместить пользовательский элемент управления Windows Forms (UserControl) в модальном или безрежимном диалоговом окне MFC. CWinFormsDialog является производным от класса CDialog MFC, поэтому диалоговое окно может быть запущено как модальное или без режима.

Процесс, CWinFormsDialog который используется для размещения пользовательского элемента управления, аналогичен описанному в разделе "Размещение пользовательского элемента управления Windows Form в диалоговом окне MFC". Однако управляет инициализацией и размещением пользовательского элемента управления, CWinFormsDialog чтобы его не нужно было запрограммировать вручную.

Создание ведущего приложения MFC

  1. Создайте проект приложения MFC.

    В меню "Файл" выберите "Создать" и нажмите кнопку "Проект". В папке Visual C++ выберите приложение MFC.

    В поле "Имя" введите MFC03 и измените параметр решения на "Добавить в решение". Нажмите кнопку "ОК".

    В мастере приложений MFC примите все значения по умолчанию и нажмите кнопку "Готово". При этом создается приложение MFC с несколькими интерфейсами документов.

  2. Настройка проекта.

    В Обозреватель решений щелкните правой кнопкой мыши узел проекта MFC03 и выберите "Свойства". Откроется диалоговое окно "Страницы свойств".

    В диалоговом окне "Страницы свойств" выберите "Общие свойства>конфигурации". В разделе "Параметры по умолчанию проекта" задайте поддержкусреды CLR для поддержки среды CLR (/clr). Выберите OK.

  3. Добавьте ссылку на элемент управления .NET.

    В Обозреватель решений щелкните правой кнопкой мыши узел проекта MFC03 и выберите "Добавить", "Ссылки". На странице свойств нажмите кнопку "Добавить новую ссылку", выберите WindowsControlLibrary1 (на вкладке "Проекты") и нажмите кнопку "ОК". Это добавляет ссылку в виде параметра компилятора /FU , чтобы программа компилировала; она также копирует WindowsControlLibrary1.dll в MFC03 каталог проекта, чтобы программа выполнялось.

  4. Добавьте #include <afxwinforms.h> в pch.h (stdafx.h в Visual Studio 2017 и более ранних версиях) в конце существующих #include инструкций.

  5. Добавьте новый класс, который подклассы CDialog.

    Щелкните правой кнопкой мыши имя проекта и добавьте класс MFC (cHostForWinForm), который подклассы CDialog. Так как ресурс диалогового окна не нужен, можно удалить идентификатор ресурса (выберите "Представление ресурсов", разверните папку диалогового окна и удалите IDD_HOSTFORWINFORM ресурс. Затем удалите все ссылки на идентификатор в коде.).

  6. Замените CDialog файлы CWinFormsDialog<WindowsControlLibrary1::UserControl1>CHostForWinForm.h и CHostForWinForm.cpp на .

  7. ВызовИте DoModal в классе CHostForWinForm.

    Добавьте #include "HostForWinForm.h"в MFC03.cpp.

    Перед инструкцией return в определении CMFC03App::InitInstance добавьте:

    CHostForWinForm m_HostForWinForm;
    m_HostForWinForm.DoModal();
    
  8. Постройте и запустите проект.

    В меню Сборка выберите Построить решение.

    В меню отладки нажмите кнопку "Пуск" без отладки.

    Затем вы добавите код для мониторинга состояния элемента управления в Windows Forms из приложения MFC.

  9. Добавьте обработчик для OnInitDialog.

    Отображение окна "Свойства" (F4). В представлении классов выберите CHostForWinForm. В окне "Свойства" выберите переопределения и в строке OnInitDialog щелкните в левом столбце и нажмите кнопку < "Добавить>". Это добавляет следующую строку в CHostForWinForm.h:

    virtual BOOL OnInitDialog();
    
  10. Определите OnInitDialog (в CHostForWinForm.cpp) следующим образом:

    BOOL CHostForWinForm::OnInitDialog() {
       CWinFormsDialog<WindowsControlLibrary1::UserControl1>::OnInitDialog();
       GetControl()->button1->Click += MAKE_DELEGATE(System::EventHandler, OnButton1);
       return TRUE;
    }
    
  11. Затем добавьте обработчик 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");
    }
    
  12. Постройте и запустите проект. При нажатии кнопки, которая находится в Windows Form, код в приложении MFC будет выполняться.

    Затем вы добавите код для отображения из кода MFC значение в текстовом поле в Windows Form.

  13. В общедоступном разделе класса CHostForWinForm в CHostForWinForm.h добавьте следующее объявление:

    CString m_sEditBoxOnWinForm;
    
  14. В определении DoDataExchange в CHostForWinForm.cpp добавьте следующие три строки в конец функции:

    if (pDX->m_bSaveAndValidate)
       m_sEditBoxOnWinForm = CString( GetControl()->textBox1->Text);
    else
       GetControl()->textBox1->Text = gcnew System::String(m_sEditBoxOnWinForm);
    
  15. В определении OnButton1 в CHostForWinForm.cpp добавьте следующие три строки в конец функции:

    this->UpdateData(TRUE);
    System::String ^ z = gcnew System::String(m_sEditBoxOnWinForm);
    System::Windows::Forms::MessageBox::Show(z);
    
  16. Постройте и запустите проект.

См. также

System.Windows.Forms.UserControlИспользование пользовательского элемента управления формы Windows Forms в MFC