2009-03-13 5 views
1

Ich habe ein Windows-Formular Benutzerkontrolle, die COM sichtbar gemacht wird. Jetzt möchte ich dieses Steuerelement in eine ATL-Dialog-GUI einbetten.Wie Windows Form in nicht verwalteten ATL GUI einbetten?

Das ATL-Projekt (nicht verwaltetes C++) soll nur die progID des winform erhalten und zur Laufzeit dynamisch erstellen und einbetten.

Ist das möglich und wenn ja, wie mache ich das?

Antwort

1

dachte ich, einen Weg aus, um es an die Arbeit.
Der folgende Code verwendet eine CWnd mit dem Namen m_Control, die ein Winform über eine kleine dokumentierte Version von CreateControl hostet. Scheint so gut zu funktionieren. Wenn jemand irgendwelche Nachteile sieht, bitte kommentieren oder antworten.

AfxEnableControlContainer(); 
Microsoft::VisualC::MFC::CControlCreationInfoEx i; 
i.Init(System::Type::GetTypeFromProgID(gcnew System::String(sProgID)), 
     CControlCreationInfo::ReflectionType); 
i.m_clsid = CLSID_WinFormsControl; 
POINT pt; 
pt.x = pt.y = 0; 
SIZE sz; 
sz.cx = sz.cy = 100; 
m_Control.CreateControl(i, WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN, 
         &pt, &sz, CWnd::FromHandle(m_hWnd), ID_CONTROL); 
1

Ich bin nicht sicher über ATL, aber dies kann problemlos in MFC mit CWinFormsView und CWinFormsControl-Klassen durchgeführt werden.

Ich denke, es gibt keine Unterstützung für eine WinForm-Steuerelement in einem ATL-Fenster, aber ich denke, Sie können es tun, indem Sie einfach die HWND von Ihrem Winform-Steuerelement und setzen Sie Ihr ATL-Steuerelement als übergeordnet. Dies könnte jedoch ein schwieriger Weg sein.

Dies scheint eine ähnliche Art von Sache zu sein. Ich habe es selbst nicht getestet.

Link

+0

Der auf der verknüpften Seite beschriebene Ansatz ist nicht anwendbar, da es sich um eine winform und nicht um ein ActiveX handelt. Letzteres wird in .Net nicht wirklich unterstützt. Wenn Winforms auf diese Weise verwendet werden, passieren unerwartete Dinge. –

+0

Bei Verwendung von CWinFormsControl muss ich einen vorhandenen Winform-Klassennamen angeben, da es sich um eine Vorlage handelt. Ich möchte jedoch ein arbitraty winform mit einer bestimmten progID erstellen. Die tatsächliche Klasse ist zur Kompilierzeit nicht bekannt! –

Verwandte Themen