Domanda

Risponderò alla mia domanda qui perché ho trascorso alcune ore a mettere insieme questo e volevo condividere ciò che ho trovato nella speranza che salverò qualcun altro lo scavo.

Esiste un Soluzione MSDN che ti consente di affrontare al meglio lì, ma ci sono un paio di pezzi chiave che ho trovato altrove. Ad esempio, la procedura dettagliata ti dice di inserire la riga [System :: STAThreadAttribute] prima della definizione _tWinMain () ma se stai implementando un'applicazione MFC standard, allora non hai _tWinMain () nel tuo codice sorgente.

Se qualcosa qui non è chiaro, sentiti libero di porre domande e io modificherò la risposta per rendere le cose più chiare.

È stato utile?

Soluzione

Passaggio 1: configura l'applicazione MFC per la compilazione con il supporto CLR

Il modo migliore per ottenere l'interoperabilità tra C ++ nativo e codice .NET gestito è quello di compilare l'applicazione come C ++ gestito anziché C ++ nativo. Questo viene fatto andando su Proprietà di configurazione del progetto. In Generale è presente un'opzione "Supporto Common Language Runtime". Impostalo su " Common Language Runtime Support / clr " ;.

Passaggio 2: aggiungi gli assembly WPF al progetto

Fai clic con il pulsante destro del mouse sul progetto in Esplora soluzioni e scegli " Riferimenti " ;. Fai clic su " Aggiungi nuovo riferimento " ;. Nella scheda .NET, aggiungi WindowsBase, PresentationCore, PresentationFramework e System. Assicurati di ricostruire tutto dopo aver aggiunto i riferimenti affinché possano essere raccolti.

Passaggio 3: imposta STAThreadAttribute sull'applicazione MFC

WPF richiede che STAThreadAttribute sia impostato sul thread dell'interfaccia utente principale. Impostare questo andando su Proprietà di configurazione del progetto. In Linker- > Advanced c'è un'opzione chiamata " Attributo discussione CLR " ;. Impostalo su " Attributo thread STA " ;.

Passaggio 4: crea un'istanza di HwndSource per avvolgere il componente WPF

System :: Windows :: Interop :: HwndSource è una classe .NET che gestisce l'interazione tra i componenti MFC e .NET. Creane uno usando la sintassi seguente:

System::Windows::Interop::HwndSourceParameters^ sourceParams = gcnew     System::Windows::Interop::HwndSourceParameters("MyWindowName");
sourceParams->PositionX = x;
sourceParams->PositionY = y;
sourceParams->ParentWindow = System::IntPtr(hWndParent);
sourceParams->WindowStyle = WS_VISIBLE | WS_CHILD;

System::Windows::Interop::HwndSource^ source = gcnew System::Windows::Interop::HwndSource(*sourceParams);
source->SizeToContent = System::Windows::SizeToContent::WidthAndHeight;

Aggiungi una variabile membro HWND alla classe dialog e quindi assegnala in questo modo: m_hWnd = (HWND) source- > Handle.ToPointer ();

L'oggetto sorgente e il contenuto WPF associato rimarranno in vigore fino a quando non si chiama :: DestroyWindow (m_hWnd).

Passaggio 5: aggiungi il controllo WPF al wrapper HwndSource

System::Windows::Controls::WebBrowser^ browser = gcnew System::Windows::Controls::WebBrowser();

browser->Height = height;
browser->Width = width;
source->RootVisual = browser;

Passaggio 6: mantenere un riferimento all'oggetto WPF

Poiché la variabile del browser uscirà dall'ambito di applicazione dopo aver chiuso la funzione durante la creazione, è necessario in qualche modo mantenere un riferimento ad essa. Gli oggetti gestiti non possono essere membri di oggetti non gestiti ma è possibile utilizzare un modello wrapper chiamato gcroot per completare il lavoro.

Aggiungi una variabile membro alla classe dialog:

#include <vcclr.h>
gcroot<System::Windows::Controls::WebBrowser^> m_webBrowser;

Quindi aggiungere la seguente riga al codice al passaggio 5:

m_webBrowser = browser;

Ora possiamo accedere a proprietà e metodi sul componente WPF tramite m_webBrowser.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top