VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 963|回复: 7

[已解决]萌新提问,关于MFC消息的问题

[复制链接]
39_avatar_middle
最佳答案
2 
在线会员 发表于 2021-8-13 14:09:47 | 显示全部楼层 |阅读模式
MFC中所有的窗口都是从一条消息队列中获取消息的,假如我点击鼠标左键,操作系统感应到事件发生,往消息队列中投入一条WM_LBUTTONDOWN消息,那么这条消息由谁处理是怎样决定的呢,还有子类窗口不处理那么由父类窗口处理这句话怎么理解,消息是一层层传递下去的吗,不是都是从消息队列中获得的吗,求大佬答疑,大佬跳广场舞必得C位萌新提问,关于MFC消息的问题
最佳答案
87_avatar_small
2021-8-13 20:45:32
控件属于子窗口,不管是主窗口和子窗口都是继承于CWnd这个类 ,而且基本都遵循下面这根线
AfxWndProc->AfxCallWndProc->CWnd::WindowProc->CWnd::OnWndMsg 消息都是基本循着这个线下来的,这个自己都要牢记!当然这个线只是处理窗口消息和控件命令消息。说多了,说深了。初学者不易理解!详细情况还是看看侯捷的深入浅出MFC这本书或者李进久的MFC深入浅出这本书!




上一篇:该怎么使用CButtonST呀
下一篇:c++27课作业
87_avatar_middle
最佳答案
16 
在线会员 发表于 2021-8-13 18:32:44 | 显示全部楼层
如果是SDK编程,在WNDCLASS 结构里进行消息回调函数关联:
    WNDCLASS wndcls;
    wndcls.lpfnWndProc=WndProc;
    然后再把这个结构体向系统进行注册
    RegisterClass(&wndclass);
  就可以使用了,以上为伪代码!
而在 MFC里  是以 AfxWndProc进行处理了,所有的窗口的队列消息都用这个处理,如果要细讲就很长了!
74_avatar_middle
最佳答案
7 
在线会员 发表于 2021-8-13 19:02:32 | 显示全部楼层
楼上说的真的不错,这方面我还没太深入,也只能解释到这了。你如果有兴趣可以自己钻研一下,但是有必要做好心理准备,这方面的知识挺底层的,会牵扯很多,你会发现你自己写很长一段代码只能实现一点功能。正因为如此,微软才把它封装成MFC(虽然MFC仍旧很庞大),但是你至少能较为清楚地理解消息这东西。

萌新提问,关于MFC消息的问题 Win32.zip (6.09 KB, 下载次数: 1)
74_avatar_middle
最佳答案
7 
在线会员 发表于 2021-8-13 14:24:28 | 显示全部楼层
你写过手动注册窗体的程序吗,那里面就有一个,在注册一个窗口时候要提供一个消息处理函数,窗口的消息是由窗口处理的,不是说所有的消息都由某个对象处理,比如说你在MFC程序里面处理的一些消息,在MFC程序外边是没用的,因为外边产生的消息不会交给程序。

怎么理解,相当于有一个MFC程序,处于正常界面(就是不是最大化的情况下),你重载了处理点击的事件,然后点击后弹出对话框,那么你只有在这个程序的窗口里面点击才有效,你在其他的程序界面或者桌面上点击是无效的

然后关于子类父类窗口消息的话,你看这篇文章吧。
https://www.cnblogs.com/zhuluqing/p/8670686.html
39_avatar_middle
最佳答案
2 
ico_lz  楼主| 发表于 2021-8-13 15:12:07 | 显示全部楼层
本帖最后由 取名难 于 2021-8-13 15:18 编辑
User_Ghost 发表于 2021-8-13 14:24
你写过手动注册窗体的程序吗,那里面就有一个,在注册一个窗口时候要提供一个消息处理函数,窗口的消息是由 ...


还没试过手动创建窗口,但是懂你的意思,您说的是windowproc()函数(等于消息映射表中的那些消息处理函数吗?)是吧,我的意思是消息循环GetMessage()后解析和分发,分发消息他是根据什么逻辑,分发到给对应窗口的再由对应窗口的windowproc()处理,是根据你当前的鼠标焦点?活动的窗口?
74_avatar_middle
最佳答案
7 
在线会员 发表于 2021-8-13 17:34:09 | 显示全部楼层
取名难 发表于 2021-8-13 15:12
还没试过手动创建窗口,但是懂你的意思,您说的是windowproc()函数(等于消息映射表中的那些消息处理 ...

怎么说,就是每一个应用程序,系统都会给它分一个消息队列,把程序触发的消息放进去,但是触发的消息只是放进队列,需要自己去读,所以就需要消息循环,每次GetMessage从队列里获取一个消息,解析一下,再分发出去,注意分发给自己的WindowProc函数处理,而不是分发给其他应用程序(相当于拿着消息给函数处理,消息循环自己不处理,只是翻译一下)。

然后就是关于WindowProc,这个函数处理消息其实跟鼠标焦点和窗口是否活动没太大关系,你只要在合适的情况下能触发消息,程序就会处理消息。在程序窗口点击、右键、选中后输入字符什么的都是触发消息,然后系统判断你这触发的消息该放在哪个程序,在哪里触发就放到那个程序里

分发消息的逻辑的话这个有点东西,你可以尝试深入了解一下。
39_avatar_middle
最佳答案
2 
ico_lz  楼主| 发表于 2021-8-13 18:08:21 | 显示全部楼层
User_Ghost 发表于 2021-8-13 17:34
怎么说,就是每一个应用程序,系统都会给它分一个消息队列,把程序触发的消息放进去,但是触发的消息只是 ...

这大概了解了,但还是有点问题,就是你说焦点是与消息分发无关,那么一个对话框有两个按钮,(对话框是主窗口,按钮是子窗口,没说错吧?)
当我按下其中一个,他是怎么分辨我按下的是哪个按钮,而触发对应的消息处理函数的,
转发的消息结构体中的句柄HWnd是对话框的还是具体到那个按钮的。
typedef struct tagMSG {
    HWND        hwnd;
    UINT        message;
    WPARAM      wParam;
    LPARAM      lParam;
    DWORD       time;
    POINT       pt;
#ifdef _MAC
    DWORD       lPrivate;
#endif
} MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG;
87_avatar_middle
最佳答案
16 
在线会员 发表于 2021-8-13 20:45:32 | 显示全部楼层    本楼为最佳答案   
bestAnswer
控件属于子窗口,不管是主窗口和子窗口都是继承于CWnd这个类 ,而且基本都遵循下面这根线
AfxWndProc->AfxCallWndProc->CWnd::WindowProc->CWnd::OnWndMsg 消息都是基本循着这个线下来的,这个自己都要牢记!当然这个线只是处理窗口消息和控件命令消息。说多了,说深了。初学者不易理解!详细情况还是看看侯捷的深入浅出MFC这本书或者李进久的MFC深入浅出这本书!
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2023-12-3 19:39

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表