关于MFC的框架结构
首先是完成了一个实例化对象theApp,然后编译器在链接的时候,链接了一个定义好的WinMain()函数,程序进入此WinMain()函数,在WinMain()中调用全局...
首先是完成了一个实例化对象 theApp,然后编译器在链接的时候,链接了一个定义好的WinMain()函数,程序进入此WinMain()函数,在WinMain()中调用全局函数afxwinmain()函数,然后在afxwinmain函数中,调用theApp对象的InitApplication()初始化,然后再调用theApp的InitInstance()完成窗口的初始化,包括设计,注册,创建,显示,更新,再调用theApp的run函数,完成消息的循环。
现在唯一疑惑的就是这个InitInstance()函数,这个函数,我看了好几遍,就是没找到窗口的注册,显示和更新倒是在
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
这两个函数找到了。
现在是在是迷惑中,难道窗口的注册也是像WinMain函数那样链接的吗?可是程序进行到InitInstance()里面也能链接吗?
本来卡在这里继续看了2章节,但是心里不踏实,所以又返回了VC++6.0深入详解这本书的第三章节,可是弄了2天,还是没明白。能力所致,我已经穷尽了 展开
现在唯一疑惑的就是这个InitInstance()函数,这个函数,我看了好几遍,就是没找到窗口的注册,显示和更新倒是在
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
这两个函数找到了。
现在是在是迷惑中,难道窗口的注册也是像WinMain函数那样链接的吗?可是程序进行到InitInstance()里面也能链接吗?
本来卡在这里继续看了2章节,但是心里不踏实,所以又返回了VC++6.0深入详解这本书的第三章节,可是弄了2天,还是没明白。能力所致,我已经穷尽了 展开
展开全部
1、MFC (Microsoft Foundation Class Library)中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立Windows下的应用程序,这是一种相对SDK来说更为简单的方法。因为总体上,MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓。Microsoft Visual C++提供了相应的工具来完成这个工作:AppWizard可以用来生成初步的框架文件(代码和资源等);资源编辑器用于帮助直观地设计用户接口;ClassWizard用来协助添加代码到框架文件;最后,编译,则通过类库实现了应用程序特定的逻辑。
2、如前所述,MFC实现了对应用程序概念的封装,把类、类的继承、动态约束、类的关系和相互作用等封装起来。这样封装的结果对程序员来说,是一套开发模板(或者说模式)。MFC提供了一个Windows应用程序开发模式,对程序的控制主要是由MFC框架完成的,而且MFC也完成了大部分的功能,预定义或实现了许多事件和消息处理,等等。框架或者由其本身处理事件,不依赖程序员的代码;或者调用程序员的代码来处理应用程序特定的事件。
3、MFC是C++类库,程序员就是通过使用、继承和扩展适当的类来实现特定的目的。例如,继承时,应用程序特定的事件由程序员的派生类来处理,不感兴趣的由基类处理。实现这种功能的基础是C++对继承的支持,对虚拟函数的支持,以及MFC实现的消息映射机制。
2、如前所述,MFC实现了对应用程序概念的封装,把类、类的继承、动态约束、类的关系和相互作用等封装起来。这样封装的结果对程序员来说,是一套开发模板(或者说模式)。MFC提供了一个Windows应用程序开发模式,对程序的控制主要是由MFC框架完成的,而且MFC也完成了大部分的功能,预定义或实现了许多事件和消息处理,等等。框架或者由其本身处理事件,不依赖程序员的代码;或者调用程序员的代码来处理应用程序特定的事件。
3、MFC是C++类库,程序员就是通过使用、继承和扩展适当的类来实现特定的目的。例如,继承时,应用程序特定的事件由程序员的派生类来处理,不感兴趣的由基类处理。实现这种功能的基础是C++对继承的支持,对虚拟函数的支持,以及MFC实现的消息映射机制。
展开全部
你说对了,注册窗口严格的说的却是在InitInstance里完成的。
InitInstance中调用ProcessShellCommand方法,通过CDoc激活一个FileNew事件,
这这个事件的处理过程中,会LoadFrame,
在LoadFrame过程中,最终会在wincore.cpp的AfxCtxRegisterClass调用宏AfxCtxRegisterClass完成窗口注册,看AfxCtxRegisterClass的声明恰好就是调用win32函数:RegisterClass.
这说起来很简单,但从InitInstance到RegisterClass中间经过了10多次函数调用。这也是MFC框剪蛋疼的地方。。。。
孙的书是用vc6讲的,俺是用vc9代码看的,这mfc发展了十几年,变化很大的,,,,其实你只要不像成为一个绝顶高手,根本不用搞这么细,搞了也没用。而且研究MFC源码是浪费时间与青春,令你老婆伤心透顶,因为MFC这个东西是“半开源”的,而且设计文档,版本兼容都是对你透明的,你花半年把MFC6源码看了也白看,明年就变了。还不如去研究QT的源代码呢,。
InitInstance中调用ProcessShellCommand方法,通过CDoc激活一个FileNew事件,
这这个事件的处理过程中,会LoadFrame,
在LoadFrame过程中,最终会在wincore.cpp的AfxCtxRegisterClass调用宏AfxCtxRegisterClass完成窗口注册,看AfxCtxRegisterClass的声明恰好就是调用win32函数:RegisterClass.
这说起来很简单,但从InitInstance到RegisterClass中间经过了10多次函数调用。这也是MFC框剪蛋疼的地方。。。。
孙的书是用vc6讲的,俺是用vc9代码看的,这mfc发展了十几年,变化很大的,,,,其实你只要不像成为一个绝顶高手,根本不用搞这么细,搞了也没用。而且研究MFC源码是浪费时间与青春,令你老婆伤心透顶,因为MFC这个东西是“半开源”的,而且设计文档,版本兼容都是对你透明的,你花半年把MFC6源码看了也白看,明年就变了。还不如去研究QT的源代码呢,。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询