2009-03-13 10 views
1

J'ai un contrôle utilisateur de formulaire Windows qui est rendu COM visible. Maintenant, je veux intégrer ce contrôle dans une interface de dialogue ATL.Comment intégrer Windows Form dans une interface graphique ATL non gérée?

Le projet ATL (C++ non géré) doit uniquement obtenir le progID du winform et le créer et l'incorporer de manière dynamique lors de l'exécution.

Est-ce possible et si oui, comment le faire?

Répondre

1

J'ai trouvé un moyen de le faire fonctionner.
Le code suivant utilise un CWnd appelé m_Control qui est conçu pour héberger un winform via une petite version documentée de CreateControl. Semble fonctionner correctement jusqu'à présent. Si quelqu'un voit des inconvénients, veuillez commenter ou répondre.

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

Je ne suis pas sûr de ATL mais cela peut être fait facilement dans MFC en utilisant les classes CWinFormsView et CWinFormsControl. Je pense qu'il n'y a pas de support de bulitin pour héberger un contrôle WinForm dans une fenêtre ATL mais je pense que vous pouvez le faire en obtenant simplement le HWND de votre contrôle winform et en définissant votre contrôle ATL comme parent. Cela pourrait être une route difficile cependant.

Cela semble être un type de chose similaire. Je n'ai pas testé moi-même.

Link

+0

L'approche décrite dans la page liée n'est pas applicable, car il s'agit d'une forme winform et non d'un ActiveX. Ce dernier n'est pas vraiment pris en charge dans .Net. Lorsque vous utilisez Winforms de cette façon, des choses inattendues se produisent. –

+0

Lors de l'utilisation de CWinFormsControl, je dois fournir un nom de classe winform existant, car il s'agit d'un modèle. Cependant, je veux créer un winform arbitraire avec un progID donné. La classe réelle n'est pas connue au moment de la compilation! –

Questions connexes