关于MFC消息响应

RaphaeL_yb 2014-08-15 03:52:23
频道有个问题,我们知道MFC程序是基于消息响应机制的,具体消息和其响应函数会有个映射关系。然而响应函数也是函数,我们也能在程序中正常调用,所以我想说的是一旦该响应函数被调用,我们如何知道它是因为有对应的消息被激发还是被其它函数调用了,在不用添加逻辑控制变量的情况下。。。。
...全文
117 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
RaphaeL_yb 2014-08-15
  • 打赏
  • 举报
回复
我没事找抽型。。。
阿呆_ 2014-08-15
  • 打赏
  • 举报
回复
引用 楼主 u013656585 的回复:
频道有个问题,我们知道MFC程序是基于消息响应机制的,具体消息和其响应函数会有个映射关系。然而响应函数也是函数,我们也能在程序中正常调用,所以我想说的是一旦该响应函数被调用,我们如何知道它是因为有对应的消息被激发还是被其它函数调用了,在不用添加逻辑控制变量的情况下。。。。
办法是有,而且很简单--比如访问栈中的返回地址就可以追溯调用者的代码地址然后判断出是那个dll中的函数或者是exe中的代码调用的,但是为什么要这么做? 如果是别的进程想调用你这个函数,人家当然可以发消息啊? 对你的函数来说还是被系统消息激发的。 如果是你自己进程中代码来调用的,那么你编写程序时本来就应该知道,需要你函数中判断来源才能相应处理说明你程序的整体设计有问题,那还不如改相应设计呢。
阿源是少年 2014-08-15
  • 打赏
  • 举报
回复
你可以自定义一盒操作系统不冲突的错误码,具体参考百度
阿源是少年 2014-08-15
  • 打赏
  • 举报
回复
还有一个办法,不推荐,每次手动调用时
SetLastError()
设置一个特殊的错误码,函数内部GetLastError()来判断错误码是不是特定的,函数结尾再
SetLastError(ERROR_SUCCESS);
RaphaeL_yb 2014-08-15
  • 打赏
  • 举报
回复
有木有不用另起变量的方法??
阿源是少年 2014-08-15
  • 打赏
  • 举报
回复
引用 3 楼 u013656585 的回复:
引用 2 楼 pcradio 的回复:
大多数消息响应函数是有参数的,如果是你手动调用响应函数,那么可以通过实参来区别是消息触发还是手动调用的,比如手动调的话,你可以传入特定的值,如0, NULL之类的,一次来区分调用者
嗯,这是个好方法,但是由向导添加的消息响应函数比如按钮按下消息,下拉框Change等消息函数都是不带参数的,就连返回都是void。。。
那就搞个全局变量,如果是你手动调用的,就把他设为特定值,响应函数每次都检查它的值就行了,因为只有你手动 调用会改变它的值,框架调用是不会改变它的值的,比如:
BOOL g_bManualCall = FALSE;
当你手动调的时候,
g_bManualCall = TRUE;
响应函数判断它是否为TRUE,若为TRUE就表示手动调的,然后执行响应逻辑,最后再
g_bManualCall = FALSE;
而框架调用每次都是FALSE
RaphaeL_yb 2014-08-15
  • 打赏
  • 举报
回复
引用 2 楼 pcradio 的回复:
大多数消息响应函数是有参数的,如果是你手动调用响应函数,那么可以通过实参来区别是消息触发还是手动调用的,比如手动调的话,你可以传入特定的值,如0, NULL之类的,一次来区分调用者
嗯,这是个好方法,但是由向导添加的消息响应函数比如按钮按下消息,下拉框Change等消息函数都是不带参数的,就连返回都是void。。。
阿源是少年 2014-08-15
  • 打赏
  • 举报
回复
大多数消息响应函数是有参数的,如果是你手动调用响应函数,那么可以通过实参来区别是消息触发还是手动调用的,比如手动调的话,你可以传入特定的值,如0, NULL之类的,一次来区分调用者
RaphaeL_yb 2014-08-15
  • 打赏
  • 举报
回复
看来我真该好好学学语文了,贫道不好意思

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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