2011-03-29 14:53 ActiveX控件中接收并处理Windows消息的问题

问题描述:

新建一个MFC ActiveX工程,添加一对话框资源,上面有一些标准控件,如按钮、编辑框、树形列表等,并生成一个类CCtrlPanel。
在CXXXXCtrl类中:
int   CXXXXCtrl::OnCreate(LPCREATESTRUCT   lpCreateStruct)  
{
if   (COleControl::OnCreate(lpCreateStruct)   ==   -1)
return   -1;
m_CtrlPanel.Create(IDD_CTRLPANEL,this);
//m_CtrlPanel在.h文件中申明为:CCtrlPanel   m_CtrlPanel;
OnActivateInPlace(TRUE,NULL);
return   0;
}
这样一来,的确做了个带界面的ActiveX控件,可是用于网页中的时候,控件的子窗口,就是CCtrlPanel类收不到tab键、回车键和方向键,这样控件显得很不专业。本想使用 BOOL   CSluiceCtrl::PreTranslateMessage(MSG*   pMsg) 来实现,但没成功。

问题分析:

引用蒋晟:“PretranslateMessage依赖于MFC的消息循环。如果容器的消息循环不是MFC的,那么PretranslateMessage不会被调用。
MFC对话框相应的键盘处理依赖于MFC的消息循环。如果容器的消息循环没有调用IsDialogMessage,那么相应的键盘处理不会被调用
。”

PreTranslateMessage是在CWinThread::PumpMessage内调用的,而ocx内本就没有CWinThread线程,所以ocx内是不会调用PreTranslateMessage的。 但ocx是窗口的话,它会来窗口消息,重载DefWindowProc,直接在内处理就行了。

解决方法:

1、重载DefWindowProc函数CXXXXCtrl::DefWindowProc(),在其中增加处理过程如下:
if (message == WM_KEYDOWN)
{
AfxMessageBox("Hey");
OnBtnMakecall();
return 0L;
}
//AfxMessageBox("Hey1");

return CDialog::DefWindowProc(message, wParam, lParam);

2、重载OnCommand函数CCtrlPanel::OnCommand(WPARAM wParam, LPARAM lParam),在其中添加发送消息,如下:

SendMessage (hwnd, WM_LBUTTONDOWN, SB_TOP, 0) ;

时间: 2024-10-30 03:03:25

2011-03-29 14:53 ActiveX控件中接收并处理Windows消息的问题的相关文章

如何在ActiveX控件中使用字体

字体的使用是ActiveX控件制作过程中不可缺少的部分.本文将深入浅出地介绍在ActiveX控件中制作过程中如何使用字体.本文所提及的ActiveX控件制作是指利用VC++6.0的MFC ActiveX ControlWizard 工具,用其它方法制作 ActiveX 控件本文不作讨论. 本文专门设置了一些例程,以便您能够更好地掌握这些内容.这些例程都是完整的ActiveX控件制作源代码.为了突出重点,本文仅对字体使用相关部分的源代码作较详细的介绍,其余部分的代码本文不作过多讨论.字体作为一种属

在ActiveX控件中检测IE中STOP按钮的按下

许多ActiveX控件,比如:ActiveMovie, IE工具条中的Stop按钮对于他们来说有特殊的意义.当Stop按钮下按时这些控件可以停止播放背景音乐或动画.这篇文章将告诉你在ActiveX控件中添加IOleCommandTarget接口来捕捉Stop 按钮的动作. 详细内容 为了支持IOleCommandTarget接口你必须手工在COleControl派生类的.h 和.cpp文件中添加如下代码.然后,你可以在IOleCommandTarget::Exec()函数中捕获OLECMDID_

在ActiveX控件中引入窗体技术

一.引入Dialog技术 下面介绍在制作ActiveX控件时引入有模式对话框技术,制作步骤如下: 创建一新的MFC ActiveX ControlWizard项目,取名为Hello,其他用缺省选项: 在ResourceView页中新增一对话框资源,命名为IDD_HELLODIALOG,可以在对话框上放自己的控件: 为对话框资源IDD_HELLODIALOG创建新类CHelloDialog,从CDialog继承: 确认在HelloCtrl.h中已加入语句#include "HelloDialog.

在C#中,在windows窗体控件中添加了个windows media player 播放器控件,怎样可以选择哪一首旧播放哪一首??

问题描述 在windows窗体中还有个listview控件显示从数据库显示的歌曲名称等信息,在listview控件中显示歌曲列表,并设置了右键快捷播放按钮,怎样可以选择一首歌就播放哪首歌?歌曲从数据库查询得到歌名等信息,添加到listview控件中,在里面显示歌曲列表.然后设置了个右键播放快捷键,选中一首个旧播放它.怎么绑定选择那首歌旧播放哪首歌.privatevoid播放ToolStripMenuItem_Click(objectsender,EventArgse){stringpath=En

ASP与ActiveX控件交互实战

active|activex|交互|控件 关键字:ASP,ActiveX控件,数字签名,安全 ActiveX控件运行在客户端.我们可以获得客户端的一些信息,如IC卡的信息,客户端的验证等等.但是ActiveX控件也有许多缺点:客户端的部署很困难,如客户端不能正确下载,下载了以后不能正确执行,下载的时候需要设置IE的安全级别等等. 更多的时候,我都在使用COM组件来扩展ASP的功能.准确地说,是服务端运行的Activex Dll组件.使用Server.CreateObject("工程名.类名&qu

ASP与ActiveX控件交互实战(一)

active|activex|交互|控件 龙卷风 关键字:ASP,ActiveX控件,数字签名,安全 ActiveX控件运行在客户端.我们可以获得客户端的一些信息,如IC卡的信息,客户端的验证等等.但是ActiveX控件也有许多缺点:客户端的部署很困难,如客户端不能正确下载,下载了以后不能正确执行,下载的时候需要设置IE的安全级别等等. 更多的时候,我都在使用COM组件来扩展ASP的功能.准确地说,是服务端运行的Activex Dll组件.使用Server.CreateObject("工程名.类

ASP与ActiveX控件交互实战(二)

active|activex|交互|控件 龙卷风 关键字:ASP,ActiveX控件,数字签名,安全 我们来看看如何从服务端获取数据,传递到ActiveX控件中. 1) 初始化时使用参数绑定 2) 运行时得到数据 打开vb6,新建ActiveX控件工程. 工程名:fOcx,用户控件名:UC2 为了方便,我们使用ActiveX控件接口向导-,菜单->外接程序->外接程序管理器->VB 6 ActiveX控件接口向导.确定即可. 打开ActiveX控件接口向导,下一步,对于可用名称和选定名称

VC写的ActiveX控件能不能被ASP.NET引用

active|activex|asp.net|控件   1.尊敬的合作伙伴:您好!   非常感谢您使用微软新闻组技术支持!关于您提到的ASP.NET无法引用VC写的控件的问题,我想请问您是想在服务器端引用VC控件中的一些功能,还是VC写了一个ActiveX的控件而无法在网页中使用.请您能否详细描述一下您目前遇到的错误.或者是您引用VC控件时遇到的具体错误信息,这样以方便我们能够更好的来帮助您解决问题,谢谢! 2.关于您提到C#与VC写的ActiveX控件进行交互的问题,从您的描述来看,根据我的理

COM组件开发实践(八)---多线程ActiveX控件和自动调整ActiveX控件大小(下)

声明:本文代码基于CodeProject的文章<A Complete ActiveX Web Control Tutorial>修改而来,因此同样遵循Code Project Open License (CPOL). 在上一篇文章<COM组件开发实践(七)---多线程ActiveX控件和自动调整ActiveX控件大小(上)>中介绍了ActiveX控件中使用多线程的基本需求,并提出了一个简单的线程模型,但却出现了意想不到的问题,本文将尝试给出问题的一个可行的解法,并同时解决上文中提出