ActiveX控件包含另一个ActiveX控件时的事件处理问题

devin_zhao 2008-05-22 11:29:53
是这样的,我有一个控件A,它的主类是ClassA,它要包含控件B,对应的类是ClassB,同时又想把控件B的事件全部放到控件A的一个单独的进程中处理,

所以创建了类ClassC,ClassC有一个专门的进程,准备用ClassC来处理控件B的事件,调用控件B的方法。

ClassB的基类是CWnd,所以ClassC的基类我也定义为CWnd。

查了些资料,处理控件的事件,要使用ON_EVENT宏,其参数格式为

ON_EVENT(theClass, id, dispid, pfnHandler, vtsParams )

其中,第二个参数id让我比较郁闷,因为控件A和控件B都没有界面,对于有界面的程序很简单,就是对话框上加入控件后,控件的资源ID,但是没界面的就……

又查了资料,没有界面的话,就使用Create函数来生成控件并指定资源ID。

virtual BOOL Create(LPCTSTR lpszClassName,LPCTSTR lpszWindowName,DWORD dwStyle,const RECT & rect,CWnd* pParentWnd,UINT nID,CCreateContext * pContext=NULL);

于是在ClassA定义了一个类型为ClassC的成员变量m_ClassC,然后使用

m_ClassC.Create(NULL, NULL, WS_CHILD, CRECT(0,0,0,0), this, IDC_CLASSC_CTRL);

Create成功。然后故技重施,在ClassC中定义了一个类型为ClassB的成员变量m_ClassB,再在ClassC的函数中使用

m_ClassB.Create(NULL, NULL, WS_CHILD, CRECT(0,0,0,0), this, IDC_CLASSB_CTRL);

程序执行到这一句却发生了异常。观察发现 this 指针(因为m_ClassB是ClassC的成员变量,所以这个this是指向ClassC的)中的 m_hWnd 为 0,

但是m_ClassC已经Create过了啊,为什么 m_hWnd 还是零呢?

求各位ActiveX大佬帮忙啊!!!

如果有更简单的无界面ActiveX控件包含另一个无界面的ActiveX控件的事件处理方法也望告知!
...全文
168 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
快乐鹦鹉 2008-05-23
  • 打赏
  • 举报
回复
解决就好
devin_zhao 2008-05-23
  • 打赏
  • 举报
回复
解决了,晕,原来是 InitInstance 函数里面需要调用 AfxEnableControlContainer()

之后Create就成功了。

属于基本问题,谢谢楼上的热心回复。
jiqing_gao 2008-05-23
  • 打赏
  • 举报
回复
gz
快乐鹦鹉 2008-05-23
  • 打赏
  • 举报
回复
你要确保这句调用前,m_ClassC对象已经成功创建。就是注意一下先后。
devin_zhao 2008-05-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 happyparrot 的回复:]
m_ClassB.Create(NULL, NULL, WS_CHILD, CRECT(0,0,0,0), this, IDC_CLASSB_CTRL);
这一句是在ClassC的哪个函数中调用的?
[/Quote]

是另外写的一个新函数,由ClassA来手动调用,不是MFC的标准函数

莫非应该放在ClassC的OnCreate函数里面?
快乐鹦鹉 2008-05-23
  • 打赏
  • 举报
回复
m_ClassB.Create(NULL, NULL, WS_CHILD, CRECT(0,0,0,0), this, IDC_CLASSB_CTRL);
这一句是在ClassC的哪个函数中调用的?
devin_zhao 2008-05-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 happyparrot 的回复:]
m_ClassC.Create(NULL, NULL, WS_CHILD, CRECT(0,0,0,0), this, IDC_CLASSC_CTRL);

Create成功。
====此时你看到m_ClassC的m_hWnd不为空吗?
[/Quote]

不为空的,跟踪了一下,触发OnCreate事件后,m_ClassC的m_hWnd就不为空了。
快乐鹦鹉 2008-05-23
  • 打赏
  • 举报
回复
m_ClassC.Create(NULL, NULL, WS_CHILD, CRECT(0,0,0,0), this, IDC_CLASSC_CTRL);

Create成功。
====此时你看到m_ClassC的m_hWnd不为空吗?

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧