小白跟踪MFC源码,请大神指路!

本文作者通过跟踪MFC源码,详细描述了从CWnd类的初始化,经过模块状态、线程状态的建立,到窗口创建和消息处理的过程。在探索中,作者发现CWnd并非直接等于Windows窗口,它们的生命周期不同,而CHandleMap类在处理消息时起着关键作用。在MFC程序中,窗口创建涉及多个步骤,包括窗口类注册、字体设置,并通过全局API创建窗口,窗口函数处理OnInitDialog消息。作者指出,MFC的复杂性体现在众多类和成员变量上,但同时也提供了强大的封装和管理机制。
摘要由CSDN通过智能技术生成

我学C++和MFC有一段时间了,由于最近不准出门,在家看书,一直想知道CWnd类怎么初始化,所以建个对话框程序,跑一下F10
在这里插入图片描述
按F10,进入基类构造函数
在这里插入图片描述
先执行1,模块状态实例,AfxGetModulState中,又初始化_AFX_THREAD_STATE类
在这里插入图片描述
模块状态类构造初始化
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
看一下线程类构造函数
在这里插入图片描述
线程类的成员CWnd* m_pWndInit现为0了,后面钩子函数用到它,它的值又变了,中间不知道哪里改变它,看不到!!!
然后执行2,模块线程状态类
在这里插入图片描述
然后进入TheradLocalo类
在这里插入图片描述
进入它的构造函数
在这里插入图片描述
然后又回到基类CWinApp构造中来,
在这里插入图片描述
继续下一步,进入派生(我自己的)App类,什么事也没做,
在这里插入图片描述调用了
如上图,上面有文字介绍,突然调用了C语言的函数,参数是二级指针,里面是个循环,请高手指导 !
然后接着F10
在这里插入图片描述
再继续跟
在这里插入图片描述
哇,进入winMain函数了
再继续跑
在这里插入图片描述
到时 ,知道为什么有人说MFC太“胖”了,看这么多类,类里包括这么多成员变量,都要占空间,我截图时把OLE有关代码都删除了,太多 了。看一下AfxGetThread,进去
在这里插入图片描述
看图片上的文字介绍
继续跑进InitInstance(),由于它是虚函数,基地类的,什么事也没干,我们派生类必须改写
在这里插入图片描述
CDialog基类构造走一下
在这里插入图片描述
再执行我自己的类的构造函数
在这里插入图片描述
然后返回InitInstance()函数,进行下一步,红2,3看之前的图片,
再进入 int nResponse = dlg.DoModal();我们又没改写,执行基类的
在这里插入图片描述
安装钩子
在这里插入图片描述
再回DoModal();
在这里插入图片描述
请看图上文字说明,AFX_MODULE_THREAD_STATE类中成员CHandleMap类必看,因为程序启动后因为每次处理消息都要调用它,而且看MFC源码,经常看到它被调用。另还有几个CHandleMAP类成员,如菜单句柄,窗口绘图hdc,GDI对象句柄等等,所以有时写程序时用到CWnd类的FromHandle,FromHandlePermanent,Attach,Detach等方法,都是此类在背后做基础工作。MFC源码对他们调用很多,可以看一下。
我们还是按红3路线,来跟CreatDlgIndirect
在这里插入图片描述
注册窗口(win32的写程序的必须步骤)后,又设置字体处理,自己看源码,现在我要找到创建窗口代码
在这里插入图片描述
用全局API创建窗口, 注意它的第四个参数AfxDlgProc,这是窗口函数,之前注册窗口时,已经设置窗口函数,这里又用它只截获OnInitDialog消息,它很特殊,要先处理,然后,就进入钩子函数,继续跑在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
afxWndProc函数是在程序启动后,处理消息的第一站,在窗口显示出来后窗口函数是它,窗口显示前有些消息不是它处理(例如:SetFont消息,OnInitDialog消息),若跟踪窗口启动时,系统发哪些消息给窗口,很多很多,感觉挺复杂!!在win32写程序时,在主消息循环前(在MFC中被CWinThread类包装了),就经常hFont=CreateFont()创建字体,然后SendMessage(hText,WM_SETFONT,(WPARAM)hFont,TRUE);此消息不经过消息循环,直接调用窗口函数,说的有点远了……win32的范围,分支线束,再回 DoModal();在这里插入图片描述
由于 我点关闭窗口,一步步退出,退到WinMain
在这里插入图片描述
这是以上我 跟踪对话框程序 MFC初始化过程 ,nReturnCode = pThread->Run();都没有执行,由对话框的消息循环代替了。最后 执行ExitInstance(),我又改写,默认处理。当然中间省略了很多,不然一直写不完,大概就是这 样!我们初学者,以为CWnd==window窗口,其实不是,封装包装关系。CWnd(C+++对象)的生命周期和window窗口的生命周期并不一样,window窗口Destroy了,而且DestroyWindow,程序员发出它,程序员也能截住它,但是最后却由系统DefWinodwProc来处理。CWnd对象的m_hWnd为NULL了,但是CWnd对象并不一定也被销毁了。CWnd对象销毁了,与之相关联的窗口肯定就被销毁了,因为两者之间的纽带(m_hWnd)已经断开了,同时回收相关的资源(MFC回收)。哪位大神写一下MFC回收机制文章?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值