问一个activex控件中消息的问题

Allen_zhang 2008-09-23 07:54:49
该控件的父窗口就是主对话框

而activex控件中还有好几个子对话框

在测试的时候发现当焦点在其子对话框中时

一按键盘程序就会死掉。

后来调试发现是在子对话框中处理不了WM_CHAR消息

为什么会这样呢?在控件中的消息泵是怎样的呢?

后来用了一个笨方法,在控件的子窗口中加了一个edit,然后将其SetFocus,这样就不会挂死了。

这是为什么呢?那位牛人解答一下?

在网上找了一个相关的解答:http://support.microsoft.com/kb/q168777/

不过还是不很了解,那位牛人来解答一下呢?

谢谢!




...全文
111 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jameshooo 2008-09-24
  • 打赏
  • 举报
回复
因为你嵌套了一个子对话框,所以要给机会调用子对话框的IsDialogMessage。但是这个函数只能在窗口过程之外调用,也就是说必须在DispatchMessage之前就得调用,通常放在PreTranslateMessage里面。
Allen_zhang 2008-09-24
  • 打赏
  • 举报
回复
to 二楼:
确实是死掉了,占用100%的CPU
我打印了调用控件的主对话框的消息(PreTranslateMessage)才发现
每一次死的时候GetFocus都是在同一个对话框上
并且这个子对话框是派生于CDialog的。
并且都是收到的消息都是0x100(WM_KEYDOWN),0x102(WM_CHAR)的时候就死掉了

to 三四楼
对话框是MFC的

我也是认为MFC的不会有问题

并且我将里面的出问题的模块拿到一个对话框程序下面是不会有问题的

-------------------------------------------------

找了很多资料发现控件中需要重新做一个消息泵的
但是如果控件没有自己的消息泵,控件中的的子对话框的消息应该同样来自于主程序的消息
是主程序的PreTranslateMessage中由IsDialogMessage转发的?

还有就是为什么对话框会处理不了这些消息呢?

如果控件没有建立自己的消息泵,他们的消息是怎样的机制?
如果控件建立了自己的消息泵,他们的消息又是怎样的机制呢?

比较想知道这几个问题,一直对这些问题都不是太了解。

-------------------------------------------------

在网上找了几篇文章:
《DLL/OCX中的MFC对话框不能处理Tab和回车键的问题》
http://dev.csdn.net/develop/article/30/30689.shtm

《Meandering Through the Maze of MFC Message and Command Routing》
http://www.microsoft.com/msj/0795/dilascia/dilascia.aspx

但是看了还不是太了解,可能我的理解能力比较差

那位牛人出来解答一下,用比较通俗的语言
谢谢
Allen_zhang 2008-09-24
  • 打赏
  • 举报
回复
但是现在有一个问题是调用子对话框的ocx没有PreTranslateMessage这个函数
并且我重装其keydown,onchar和keyup这几个函数都没有收到任何消息

那么IsDialogMessage该在哪里调用呢?

暂时不想写钩子来处理
jia_xiaoxin 2008-09-23
  • 打赏
  • 举报
回复
一些消息是依赖于MFC的消息循环的。如果容器的消息循环不是MFC的,那么有些消息循环就不可用,或者引发问题.
jameshooo 2008-09-23
  • 打赏
  • 举报
回复
对话框是MFC的吗?MFC对话框应该不会出现这个问题,非MFC对话框可能比较麻烦一点,要多做点额外的消息预处理
猞猁狲 2008-09-23
  • 打赏
  • 举报
回复
你确定是程序死掉了吗?还是焦点移动到了active内部的某个控件上
Allen_zhang 2008-09-23
  • 打赏
  • 举报
回复
这个active控件不是mfc的,是ATL的。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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