怎么在ATL中动态创建有界面的控件?

时间:2022-02-21 21:01:46
在原有一个ATL工程中加入一个第三方的功能, 第三方提供的SDK是也是一个有界面的组件,我如何才能在原有的ATL中动态的建立任意个组件?
  如果是在MFC 下它会自动创建一个从CWnd继承的包装类,动态生成很方便,但在在ATL中没有生成这样的类.我一开如用的如果方法:

CComPtr<Ixxx> m_pSomething;

m_pSonething.CoCreateInstance(CLSID_xxx);

  用这种方法创建实例成功但是一调用接口函数就出异常,但是没有界面的组件就不会出错.
  在ATL中有有类似MFC的功能吗? 如果没有怎样动态创建这类控件呢?


8 个解决方案

#1


将ActiveX控件加到你的对话框里!
创建一个类来处理对话框
class ATL_NO_VTABLE CXXXDlg : 
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CXXXDlg, &CLSID_XXXDlg>,
public IDispatchImpl<IXXXDlg, &IID_IXXXDlg, &LIBID_YYYYLib>,
public CAxDialogImpl<CXXXDlg>

#2


用这个方法也不能算动态创建,但我用这个方法试了一下用到是可以用,但是还是有问题,显示不太正常,有时能显示,有时又不能显示.但是创建后它还是属于它的窗口,我能不能把这个控件移到客户提供的窗体中,变成这个新窗口的控件.我试了几个方法都不行,如SetWindowPos;
SetParent.不知有没有别的办法.

#3


http://www.fruitfruit.com/vc/atl/createcontrol.cpp

#4


to masterz(www.fruitfruit.com) :
怎样用MFC来实现呢?

#5


学习关注

#6


学习

#7


用MFC就简单了, 选 Project -> Add to project -> Components and controls 
进入 Registered ActiveX Controls 再选择用到的组件, 单击 Insert, 确定生成的类
然后在程序中就可以像普通的窗口一样的使用了.

#8


找到一个函数 AtlAxCreateControlEx 可以动态创建ActiveX, 但不知如何得到他的HWND, 显示还是不正常,有时不能显示出来.

#1


将ActiveX控件加到你的对话框里!
创建一个类来处理对话框
class ATL_NO_VTABLE CXXXDlg : 
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CXXXDlg, &CLSID_XXXDlg>,
public IDispatchImpl<IXXXDlg, &IID_IXXXDlg, &LIBID_YYYYLib>,
public CAxDialogImpl<CXXXDlg>

#2


用这个方法也不能算动态创建,但我用这个方法试了一下用到是可以用,但是还是有问题,显示不太正常,有时能显示,有时又不能显示.但是创建后它还是属于它的窗口,我能不能把这个控件移到客户提供的窗体中,变成这个新窗口的控件.我试了几个方法都不行,如SetWindowPos;
SetParent.不知有没有别的办法.

#3


http://www.fruitfruit.com/vc/atl/createcontrol.cpp

#4


to masterz(www.fruitfruit.com) :
怎样用MFC来实现呢?

#5


学习关注

#6


学习

#7


用MFC就简单了, 选 Project -> Add to project -> Components and controls 
进入 Registered ActiveX Controls 再选择用到的组件, 单击 Insert, 确定生成的类
然后在程序中就可以像普通的窗口一样的使用了.

#8


找到一个函数 AtlAxCreateControlEx 可以动态创建ActiveX, 但不知如何得到他的HWND, 显示还是不正常,有时不能显示出来.