?
Hallo zusammen,
ich hab das Problem, das ich zu meiner bestehenden MFC Appliktion ein .NET Element dazufügen möchte.
Der Haken an der Sache ist, das ich meine MFC Applikation nicht im CLR Modus debuggen möchte.
Deshalb habe ich ein neues Unerprojekt zu meiner Solution angelegt (WinForms ControlLibrary), die managed ist (also mit CLR support gebaut wird), und einen Wrapper beinhaltet, der der Spagat zwischen managed/unmanaged macht.
Als .NET Element habe ich mal einen Button in ein WinFormsControl eingefügt.
Dieses WinFormsControl füge ich nun in einen MFC Dialog ein.
Nun zum Problem:
Das Programm lässt sich ausführen, und die WinFormsControl wird problemlos im MFC-Dialog angezeigt.
Nur sobald der Button gedrückt wird (auch ohne das ein Event abgefangen wird), läuft das Programm in eine Endlosschleife in einer der zahlreichen MFC- Dateien (in diesem FAll: wincore.cpp).
Was zur Folge hat, das beim minimieren/maximieren des Programms, der Dialog nicht mehr neu gezeichnet wird.
Zum Programmablauf:
In meinem MFC Programm mache ich einen Aufruf auf meinen Wrapper
CWnd * m_pChildDialog;
VDialogFactory m_factory;
m_pChildDialog=m_factory.CreateMixedDialog(this);
m_pChildDialog->ShowWindow(SW_SHOW);
In meiner Factory wird nun ein Object von WinFormsControl erzeugt und mit create iniziert:
CWnd * VDialogFactory::CreateMixedDialog(CWnd* pParent)
{
CHostForWinForm* m_pChildDialog;
m_pChildDialog= new CHostForWinForm;
m_pChildDialog->Create(m_pChildDialog->GetResourceId(),pParent);
return m_pChildDialog;
}
Als Rückgabewert dieser Methode wird ein CWnd geliefert der nun alle Informationen beinhalten soll (eigentlich auch tut, da es ja richtig eingebunden und angezeigt wird)
Mit der Klasse CHostForWinForm sollen nun die Handles bearbeitet (OnBnClickedWinForm) und die Verknüpfungen zwischen .NET und MFC gemanaged werden.
// HostForWinForm.cpp : implementation file
//
#include "stdafx.h"
#include "HostForWinForm.h"
// CHostForWinForm dialog
IMPLEMENT_DYNAMIC(CHostForWinForm, CWinFormsDialog<VCLRControl::VCLRControlControl>)
CHostForWinForm::CHostForWinForm(CWnd* pParent /*=NULL*/)
:CWinFormsDialog<VCLRControl::VCLRControlControl>(CHostForWinForm::IDD, pParent)
{
}
CHostForWinForm::~CHostForWinForm(){ }
BOOL CHostForWinForm::OnInitDialog()
{
CWinFormsDialog<VCLRControl::VCLRControlControl>::OnInitDialog();
//Hook up a method on the MFC side to a handler on the WinForm side
this->ShowWindow(SW_SHOWNORMAL);
//UpdateData(FALSE);
return TRUE;
}
UINT CHostForWinForm::GetResourceId()
{
return this->IDD;
}
void CHostForWinForm::DoDataExchange(CDataExchange* pDX)
{
CWinFormsDialog<VCLRControl::VCLRControlControl>::DoDataExchange(pDX);
}
void CHostForWinForm::OnBnClickedWinForm(System::Object^ o , System::EventArgs^ e)
{
}
BEGIN_MESSAGE_MAP(CHostForWinForm, CWinFormsDialog<VCLRControl::VCLRControlControl>)
END_MESSAGE_MAP()
Das WinFormsControl wurde nun erzeugt, und wird über ein CWnd* in dem Wrapper zurück zu meiner MFC Applikation gegeben die über ein ShowWindow das ganze anzeigbar macht (siehe oben).
Wie gesagt, das erste Anzeige geht.
Doch nachdem der .NET Button gedrückt wurde, läuft das gesamte Programm in eine Endlosschleife in wincore.cpp (MFC Standarddatei).
Wenn man den Button nicht drückt und maximiert/minimiert wird alles problemlos neu gezeichnet.
Kann mir bei der Sache jeamand helfen, bzw. hat sich jemand schonmal mit der Verknüpfung von den beiden Technologien beschäftigt/ beschäftigen müssen ?
Danke für die Hilfe!!!
Gruß