MFC里让动态创建的ActiveX控件响应Windows消息

碰到的问题:
      我在MFC程序中使用一个由CWnd::CreateControl 创建的WebBrowser控件,这个控件是有CWnd继承下来的,今天我有一个需求是要在当中响应Windows消息去重绘,但是我发现这个控件窗口居然不能够接受父窗口的Windows窗口消息,很是无语。

问题产生的原因:
      导致控件无法接收Windows窗口消息的原因是因为CreateControl 没有子类化子窗口,自然是无法响应了。关于子类化的相关资料请查看参考资料,或者自行搜索。

解决的办法:
      在创建窗口以后调用CWnd::SubclassWindow即可。伪代码如下:

CControlWnd* pWnd;
pWnd->Create();
HWND hWnd = pWnd->Detach();
pWnd->SubclassWindow(hWnd);
      当然,你也可以再重载CWnd::Create()方法将以上代码加入进去,比如:

BOOL CWebBrowser::Create( LPCTSTR lpszClassName,
                         LPCTSTR lpszWindowName, 
                         DWORD dwStyle, 
                         const RECT& rect, 
                         CWnd* pParentWnd, 
                         UINT nID, 
                         CCreateContext* pContext /**//*= NULL*/ )
{
    BOOL bRet = CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID);
    HWND hWnd = Detach();
    SubclassWindow(hWnd);
    return bRet;
}

时间: 2024-12-24 20:11:52

MFC里让动态创建的ActiveX控件响应Windows消息的相关文章

让动态创建的ActiveX控件响应Windows消息

当我们通过 CWnd::CreateControl() 动态创建 ActiveX   控件时, Windows 消息并不会被发送给我 们的由   CWnd 派生得控件类.例如,即使我们为 WM_KILLFOCUS   消息创建了句柄,这个句柄   也是不会被调用的.(不信你试试 :)) 引起这个问题的原因时, CWnd::CreateControl() 并不会使我控件的   HWND 子类化. 知道了原因,要解决问题就不难了.我们只要在控件创建之后使它子类化就行了.通过一下步 骤可以实现: 1.

一个分页跟动态创建列的控件

创建|动态|分页|控件 using System;using System.Web;using System.IO;using System.Drawing;using System.Data;using System.Data.SqlClient;using System.Web.UI;using System.Web.UI.HtmlControls;using System.Web.UI.WebControls;using System.ComponentModel; namespace Y

在VB6中动态创建使用ADO控件访问数据库

ado|创建|动态|访问|控件|数据|数据库 使用ADO控件可以方便的在VB6中访问ODBC数据库,但是通过直接放置ADODS控件来获得ADO的数据连接比较麻烦,我们可以在VB工程中创建一个公共数据模块,将ADO控件的初始化.建立连接.关闭连接等操作都写到函数中,这样就可以在工程的其他模块中共享调用这个ADO连接. 一次完整的ADO调用操作分为如下几个步骤: 打开ADO到数据库的连接,初始化ADO RECORDSET集. 通过写入SQL语句执行查询并返回查询结果RECORDSET集:或者可以通过

用MFC改写的点对点语音通讯ActiveX控件

程序简介 用ActiveX重新改写了一个点对点通讯的DLL文件(该DLL文件是VCKBASE上的一位前辈写的)偶只是把它改成了一个MFC的ActiveX,这样可以方便的在VB,vbs,js等脚本语言,特别是用在IE里面特别方便了. 此程序主要向你说明,其实ActiveX没有多么的神秘.你遵守的它的规则,什么功能都能添加到ActiveX中,并且和写其它的普通的程序没有什么区别! 缺点 因为同时只能有一个程序打开音频设备,所以不能开两个实例进行聊天.本来打算改改好,只发布成品ActiveX,不发布原

动态创建多个控件的问题

问题描述 我动态创建了radionbuttonlist,checkboxlist,textbox并且分别this.Panel1.Controls.Add(rad);this.Panel1.Controls.Add(ch);this.Panel1.Controls.Add(tx);当我要提交这些控件的值的时候出错找到多个具有相同ID"lab0"的控件.FindControl要求控件具有唯一的ID.为什么会这样呢 解决方案 解决方案二:有两个以上的ID="lab0"的控

RFT动态创建并获取控件对象,该怎么做?

问题描述 我请教一下:我用RFT录制javaGUI控件的并操作,但是我想通过自己写的方法只需填写参数就可以drag任意多个控件,并对他们进行操作,这个该怎么去做呢?RFT只有在录制的过程中才会得到控件对象吗?有没有解决的办法?

MFC 对话框中动态创建N级菜单以及响应事件

创建一个基于对话框的工程,工程名为CreateMenu 为该对话框增加一个文件菜单项和测试菜单项,如下图所示   测试菜单项至少要有一个子菜单项 在对话框属性中关联该菜单 在resource.h中增加一个ID_TESTMENU宏 #define ID_TESTMENU          5000   在对话框中添加一个Button按钮,建立消息映射,编辑代码如下 void CCreateMenuDlg::OnButton1() { // TODO: Add your control notifi

基于MFC的ActiveX控件开发

ActiveX 控件是基于组件对象模型 (COM) 的可重用软件组件,广泛应用于桌面及Web应用中.在VC下ActiveX控件的开发可以分为三种,一种是直接用COM的API来开发,这样做显然非常的麻烦,对程序员要求也非常高,因此一般是不予考虑的:一种是基于传统的MFC,采用面向对象的方式将COM的基本功能封装在若干MFC的C++类中,开发者通过继承这些类得到COM支持功能.MFC为广大VC程序员所熟悉,易于上手学习,但缺点是MFC封装的东西比较多,因此用MFC开发出来的控件相对会比较大,因此比较

创建ACTIVEX控件

问题描述 VC2010,需要创建一个ACTIVEX控件,ACTIVEX控件内要插入一个WEBBROWSER控件.在对话框中会插入,但ACTIVEX控件内部不熟悉,不知道怎么写代码动态插入?最好有代码示例,谢谢! 解决方案 解决方案二:webbrowser其实也是一个com组件你的意思是做个activex,对webbrowser进行一些扩展吧?publicclassMyActiveX:IMyActiveX//实现你自己的COM接口{publicMyActiveX(){this.WebBrowser