Compartir por


Hospedar un control de usuario de Windows Forms en un cuadro de diálogo MFC

MFC proporciona la clase de plantilla CWinFormsDialog para que pueda hospedar un control de usuario de Windows Forms (UserControl) en un cuadro de diálogo MFC modal o no modal. CWinFormsDialog se deriva de la clase MFC CDialog, por lo que el cuadro de diálogo se puede iniciar como modal o no modal.

El proceso que CWinFormsDialog usa para hospedar el control de usuario es similar al descrito en Hospedaje de un control de usuario de Windows Forms en un cuadro de diálogo MFC. Sin embargo, CWinFormsDialog administra la inicialización y el hospedaje del control de usuario para que no tenga que programarse manualmente.

Para crear la aplicación host MFC

  1. Cree un proyecto de aplicación MFC.

    En el menú Archivo, seleccione Nuevo y después haga clic en Proyecto. En la carpeta Visual C++, seleccione Aplicación MFC.

    En el cuadro Nombre, escriba MFC03 y cambie la configuración solución a Agregar a la solución. Haga clic en Aceptar.

    En el Asistente para aplicaciones MFC, acepte todos los valores predeterminados y, a continuación, haga clic en Finalizar. Esto crea una aplicación MFC con una interfaz de múltiples documentos.

  2. Configure el proyecto.

    En el Explorador de soluciones, haga clic con el botón derecho en el nodo del proyecto MFC03 y seleccione Propiedades. Aparecerá el cuadro de diálogo Páginas de propiedades.

    En el cuadro de diálogo Páginas de propiedades, seleccione Propiedades de configuración>General. En la sección Valores predeterminados del proyecto, establezca Compatibilidad con Common Language Runtime en Compatibilidad con Common Language Runtime (/clr). Elija Aceptar.

  3. Agregue una referencia al control .NET.

    En el Explorador de soluciones, haga clic con el botón derecho en el nodo del proyecto MFC03 y elija Agregar, Referencias. En la página de propiedades, haga clic en Agregar nueva referencia, seleccione WindowsControlLibrary1 (en la pestaña Proyectos ) y haga clic en Aceptar. De este modo, se agregará una referencia en forma de opción del compilador /FU para que el programa se compile; también se copiará WindowsControlLibrary1 en el directorio del proyecto MFC03 para que se ejecute el programa.

  4. Agregue #include <afxwinforms.h> a pch.h (stdafx.h en Visual Studio 2017 y versiones anteriores), al final de las instrucciones existentes #include.

  5. Agregue una nueva clase que subclasifique CDialog.

    Haga clic con el botón derecho en el nombre del proyecto y agregue una clase MFC (denominada CHostForWinForm) que subclasifique CDialog. Puesto que no necesita el recurso del cuadro de diálogo, puede eliminar el identificador de recurso (seleccione Vista de recursos, expanda la carpeta Cuadro de diáloo y elimine el recurso IDD_HOSTFORWINFORM. A continuación, quite las referencias al identificador en el código).

  6. Reemplace CDialog en los archivos CHostForWinForm.h y CHostForWinForm.cpp por CWinFormsDialog<WindowsControlLibrary1::UserControl1>.

  7. Llame a DoModal en la clase CHostForWinForm.

    En MFC03.cpp, agregue #include "HostForWinForm.h".

    Antes de la instrucción "return" en la definición de CMFC03App::InitInstance, agregue:

    CHostForWinForm m_HostForWinForm;
    m_HostForWinForm.DoModal();
    
  8. Crear y ejecutar el proyecto.

    En el menú Compilar , haga clic en Compilar solución.

    En el menú Depurar, haga clic en Iniciar sin depurar.

    A continuación, agregará código para supervisar el estado de un control en Windows Forms desde la aplicación MFC.

  9. Agregue un controlador para OnInitDialog.

    Muestra la ventana Propiedades (F4). En la Vista de clases, seleccione CHostForWinForm. En la ventana Propiedades, seleccione los reemplazos y, en la fila de OnInitDialog, haga clic en la columna izquierda y seleccione <Agregar >. Esto agrega la siguiente línea a CHostForWinForm.h:

    virtual BOOL OnInitDialog();
    
  10. Defina OnInitDialog (en CHostForWinForm.cpp) de la siguiente manera:

    BOOL CHostForWinForm::OnInitDialog() {
       CWinFormsDialog<WindowsControlLibrary1::UserControl1>::OnInitDialog();
       GetControl()->button1->Click += MAKE_DELEGATE(System::EventHandler, OnButton1);
       return TRUE;
    }
    
  11. A continuación, agregue el controlador OnButton1. Agregue las líneas siguientes a la sección pública de la clase CHostForWinForm en 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()
    

    En CHostForWinForm.cpp, agregue esta definición:

    void CHostForWinForm::OnButton1( System::Object^ sender, System::EventArgs^ e )
    {
       System::Windows::Forms::MessageBox::Show("test");
    }
    
  12. Crear y ejecutar el proyecto. Al hacer clic en el botón , que se encuentra en Windows Forms, se ejecutará el código de la aplicación MFC.

    A continuación, agregará código para mostrar desde el código MFC el valor en el cuadro de texto de Windows Form.

  13. En la sección pública de la clase CHostForWinForm en CHostForWinForm.h, agregue la siguiente declaración:

    CString m_sEditBoxOnWinForm;
    
  14. En la definición de DoDataExchange en CHostForWinForm.cpp, agregue las tres líneas siguientes al final de la función:

    if (pDX->m_bSaveAndValidate)
       m_sEditBoxOnWinForm = CString( GetControl()->textBox1->Text);
    else
       GetControl()->textBox1->Text = gcnew System::String(m_sEditBoxOnWinForm);
    
  15. En la definición de OnButton1 en CHostForWinForm.cpp, agregue las tres líneas siguientes al final de la función:

    this->UpdateData(TRUE);
    System::String ^ z = gcnew System::String(m_sEditBoxOnWinForm);
    System::Windows::Forms::MessageBox::Show(z);
    
  16. Crear y ejecutar el proyecto.

Consulte también

System.Windows.Forms.UserControlUso de un control de usuario de Windows Forms en MFC