Hospedando um controle de usuário do Windows Form como uma caixa de diálogo MFC
O MFC fornece um modelo de classe CWinFormsDialog para que você possa hospedar um controle de usuário do Windows Forms (UserControl) em uma caixa de diálogo MFC modal ou sem janela restrita. CWinFormsDialog
é derivado da classe MFC CDialog, portanto, a caixa de diálogo pode ser inicializada como modal ou sem janela restrita.
O processo que CWinFormsDialog
utiliza para hospedar o controle de usuário é semelhante ao descrito na Hospedagem de um controle de usuário do Windows Forms em uma caixa de diálogo MFC. No entanto, CWinFormsDialog
gerencia a inicialização e a hospedagem do controle de usuário para que ele não tenha que ser programado manualmente.
Para criar o aplicativo host do MFC
Crie um projeto de aplicativo MFC.
No menu Arquivo, selecione Novo e, em seguida, clique em Projeto. Na pasta Visual C++, selecione Aplicativo MFC.
Na caixa Nome, insira
MFC03
e altere a configuração da solução para Adicionar à Solução. Clique em OK.No Assistente de Aplicativo MFC, aceite todos os padrões e clique em Concluir. Será criado um aplicativo MFC com uma interface de documentos múltiplos.
Configurar o projeto.
No Gerenciador de Soluções, clique com o botão direito do mouse no nó de projeto MFC03 e selecione Propriedades. A caixa de diálogo Páginas de Propriedades é aberta.
Na caixa de diálogo Páginas de Propriedades, selecione Propriedades de Configuração>Geral. Na seção Padrões do Projeto, defina Suporte ao Common Language Runtime para Suporte ao Common Language Runtime (/clr). Escolha OK.
Adicione uma referência ao controle do .NET.
No Gerenciador de Soluções, clique com o botão direito do mouse no nó de projeto MFC03 e selecione Adicionar, Referências. Na Página de Propriedades, clique em Adicionar Nova Referência, selecione WindowsControlLibrary1 (na aba Projetos) e clique em OK. Será adicionada uma referência na forma de uma opção de compilador /FU para que o programa seja compilado; ele também copia o WindowsControlLibrary1.dll no
MFC03
diretório do projeto para que o programa seja executado.Adicione
#include <afxwinforms.h>
a pch.h (stdafx.h no Visual Studio 2017 e anterior), no final das instruções existentes#include
.Adicione uma nova classe que subclassifique
CDialog
.Clique com o botão direito do mouse no nome do projeto e adicione uma classe MFC (chamada CHostForWinForm) que subclassifique
CDialog
. Caso não precise do recurso da caixa de diálogo, você poderá excluir a ID do recurso (selecione Modo de Exibição de Recurso, expanda a pasta Diálogo e exclua o recursoIDD_HOSTFORWINFORM
. Em seguida, remova todas as referências para a ID no código.).Substitua
CDialog
nos arquivos CHostForWinForm.h e CHostForWinForm.cpp porCWinFormsDialog<WindowsControlLibrary1::UserControl1>
.Chame DoModal na classe CHostForWinForm.
Em MFC03.cpp, adicione
#include "HostForWinForm.h"
.Antes da instrução return na definição de CMFC03App::InitInstance, adicione:
CHostForWinForm m_HostForWinForm; m_HostForWinForm.DoModal();
Compile e execute o projeto.
No menu Compilar, clique em Compilar Solução.
No menu Depurar, clique em Iniciar sem depurar.
Em seguida, você adicionará o código para monitorar o estado de um controle no Windows Forms a partir do aplicativo MFC.
Adicione um manipulador para OnInitDialog.
Exiba a janela Propriedades (F4). Em Modo de Exibição de Classe, selecione CHostForWinForm. Na janela Propriedades, selecione as substituições na linha para OnInitDialog, clique na coluna à esquerda e selecione < Adicionar >. A linha a seguir será adicionada ao CHostForWinForm.h:
virtual BOOL OnInitDialog();
Defina OnInitDialog (em CHostForWinForm.cpp) da seguinte maneira:
BOOL CHostForWinForm::OnInitDialog() { CWinFormsDialog<WindowsControlLibrary1::UserControl1>::OnInitDialog(); GetControl()->button1->Click += MAKE_DELEGATE(System::EventHandler, OnButton1); return TRUE; }
Em seguida, adicione o manipulador OnButton1. Adicione as seguintes linhas à seção pública da classe CHostForWinForm em 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()
Em CHostForWinForm.cpp, adicione esta definição:
void CHostForWinForm::OnButton1( System::Object^ sender, System::EventArgs^ e ) { System::Windows::Forms::MessageBox::Show("test"); }
Compile e execute o projeto. Quando você clicar no botão, que está no Windows Forms, o código no aplicativo MFC será executado.
Em seguida, você adicionará o código para exibir o valor na caixa de texto no Windows Forms pelo código MFC.
Na seção pública da classe CHostForWinForm em CHostForWinForm.h, adicione a declaração a seguir:
CString m_sEditBoxOnWinForm;
Na definição de DoDataExchange em CHostForWinForm.cpp, adicione as três linhas a seguir no final da função:
if (pDX->m_bSaveAndValidate) m_sEditBoxOnWinForm = CString( GetControl()->textBox1->Text); else GetControl()->textBox1->Text = gcnew System::String(m_sEditBoxOnWinForm);
Na definição de OnButton1 em CHostForWinForm.cpp, adicione as três linhas a seguir no final da função:
this->UpdateData(TRUE); System::String ^ z = gcnew System::String(m_sEditBoxOnWinForm); System::Windows::Forms::MessageBox::Show(z);
Compile e execute o projeto.
Confira também
System.Windows.Forms.UserControlUsar um controle de usuário do Windows Forms no MFC