我在OCX中建立了一个FORMVIEW,FORMVIEW中有一个对话框,对话框中建立了一个属性页。程序执行的一切正常。
但是程序中的一切消息处理和响应都和普通MFC程序不一样。我在VIEW中、属性页中的PreTranslateMessage函数中一个消息也捕获不到。只有通过classwizard映射的键盘消息才能捕获。我之所以要用到PreTranslateMessage函数,是因为我需要捕获属性页中的各个控件的消息。
还有,属性页中的EDIT控件只能输入字符,却不能响应上下左右键和回退键。我想这可能也是消息的问题。
我想问问,是不是OCX控件的消息处理有什么特殊步骤?我也看了MSDN的控件事件的文章,但我的英语水平不高,没看明白,按照MSDN说的,为控件添加了键盘事件,可是系统只为键盘事件自动添加了一个事件映射,却没有相应的处理函数,是不是有什么其它步骤?
但是程序中的一切消息处理和响应都和普通MFC程序不一样。我在VIEW中、属性页中的PreTranslateMessage函数中一个消息也捕获不到。只有通过classwizard映射的键盘消息才能捕获。我之所以要用到PreTranslateMessage函数,是因为我需要捕获属性页中的各个控件的消息。
还有,属性页中的EDIT控件只能输入字符,却不能响应上下左右键和回退键。我想这可能也是消息的问题。
我想问问,是不是OCX控件的消息处理有什么特殊步骤?我也看了MSDN的控件事件的文章,但我的英语水平不高,没看明白,按照MSDN说的,为控件添加了键盘事件,可是系统只为键盘事件自动添加了一个事件映射,却没有相应的处理函数,是不是有什么其它步骤?
解决方案 »
- 错误error C2059: syntax error : 'constant'
- 写了一个在DirectDraw页面中加载JPG图片的函数(欢迎大家来找茬)
- 关于List control
- 最新的Platform SDK for Windows Server 2003 SP1 如何支持VC6.0?
- 【不知是复杂还是简单的问题】在unicode程序里SetWindowText无一例外地得到乱码
- 调用函数播放视频
- 拜求高手关于SNMP的详细问题,急急!!!!
- 怎样在对话框中显示位图?
- 求助!急急急
- 急求!
- 几个问题!关于CEdit和CFontDialog的?????
- 那位能给我提供vc1.5版本的编译器?急
void CAXListViewCtrl::OnSetFocus(CWnd* pOldWnd)
{
COleControl::OnSetFocus(pOldWnd); // TODO: 在此处添加消息处理程序代码
m_wndMyReportCtrl.SetFocus();
}不行的话,再试试这个:BOOL CAXListViewCtrl::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
if( pMsg->message == WM_LBUTTONDOWN )
{
m_wndMyReportCtrl.SendMessage(pMsg->message, pMsg->wParam, pMsg->lParam);
return TRUE;
} return COleControl::PreTranslateMessage(pMsg);
}
我重载了OnSetFocus函数,可这个函数根本就没有触发呀?
去看CWinApp的消息处理……
PRB: MFC ActiveX Control in IE Doesn't Detect Keystrokes
This article was previously published under Q168777
PRB: TranslateAccelerator() Not Called for ActiveX Controls
This article was previously published under Q183167
HOWTO: Add Toolbars and Tooltips to ActiveX Controls
This article was previously published under Q194294
PRB: Enabling Menu Mnemonics in an MFC ActiveX Control
This article was previously published under Q199431
PRB: MFC ActiveX Control Ignores ARROW Keys on VB Container
This article was previously published under Q180402
PRB: ActiveX Control Is the Parent Window of Modeless Dialog
This article was previously published under Q187988
怎样适用于不是用MFC的代码创建的窗口呢?
BOOL CMyEditCtrl::PreTranslateMessage(MSG* pMsg)
{
switch (pMsg->message)
{
case WM_KEYDOWN:
case WM_KEYUP:
switch (pMsg->wParam)
{
case VK_UP:
case VK_DOWN:
case VK_LEFT:
case VK_RIGHT:
case VK_HOME:
case VK_END:
SendMessage (pMsg->message, pMsg->wParam, pMsg->lParam);
// Windowless controls won't be able to call SendMessage.
// Instead, just respond to the message here.
return TRUE;
}
break;
}
return COleControl::PreTranslateMessage(pMsg);
}
因为容器处理了一些本来是控件应该处理的消息,所以PreTranslateMessage没有被调用
以上转自
Q180402 PRB: MFC ActiveX Control Ignores ARROW Keys on VB Container
现在的人连MSDN都不看……
我已经在CMyEditCtrl类中重载了PreTranslateMessage,但别说是WM_KEYDOWN消息,
我在调试中,根本就无法进入PreTranslateMessage,也就是说,包括OnPant消息都无法截获。
这是怎么回事呢?
假设在ocx中加入一个对话框m_dlg,作为ocx的child
BOOL CMyCtrl::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class//其实方法很简单,就是ocx控件捕获到消息后,然后手工把消息分发给需要这些消息的控件。
//这里可以进行消息的过滤,比如只要键盘消息等等,还可以加入一些判断,把不同的消息
//发给不同的目的地
SendMessage(m_dlg.GetSafeHwnd(),pMsg->message,pMsg->wParam,pMsg->lParam); return COleControl::PreTranslateMessage(pMsg);
}