分享

MFC中五个初始类的作用

 清风明月0391 2014-06-05

一个最基本的单文档视图的MFC程序,包含CxxApp、CxxDoc、CMainFrame、CxxView和CAboutDlg五个类。
  它们在程序开始运行时被创建的顺序是:CxxApp 、CxxDoc 、CMainFrame 、CxxView 、CAboutDlg

       C**App()定义了窗体加载之前需要做的预处理。比如一个加密的软件,打开后提示用户输入密码。这个事件的处理程序就要写在C**App()的InitInstance(中。                                      

    CMainFrame()包含了对工具栏、状态栏、窗口的定义。
    C**View包含了最主要的处理功能,如菜单操作、快捷键、用户交互操作等。
    CAboutDlg定义了ABOUT对话框。

    其中,前四个都是在程序主窗口出现之前被创建的,CAboutDlg是在“关于”对话框弹出时被创建的

1CAboutDlg   //这个是关于对话框 里面是构造和析构2CMainFrame //主框架`是在窗口生成之前准备工作全在这吗  ?3CTestApp//这个是什么`initlnstance()在这里也是初始化什么对象   ? 4CTestDoc//这是文档`是管理哪些文档`对初学者来说很少用呐       ?5CTestView视图`这个常用     OnDraw我了解一些`我想知道`是不是默认就调用一次 ? 还有个问题啊`我想加个音乐`虽然加成功了`但是`我一直不明白加在哪个函数里`运行就有音乐   ?看过孙鑫的教程后来忘了`各位高手各抒已见,互相学习
 
LZ需要系统地学习一下。
CTestApp是基于WinApp的,WinApp封装了程序的主入口WinMain,WinMain就和c语言的main函数地位一样,是Win32程序的入口。在MFC的封装中,一个程序启动,Windows调用WinMain,这个WinMain函数现在由MFC事先写好藏好了,你不能也不需要修改,在这个预定义的WinMain里面会调用CWinApp的InitInstrance函数。你仔细看你CTestApp::InitInstrance函数,在这里一个CMainFrame的对象被创建,文档模板被创建,主窗口通过ShowWindow(SW_SHOW)被显示出来。
 
CMainFrame是个框架,是你整个应用程序的主窗口,他负责管理应用程序的菜单,工具栏,状态栏等。中间的区域,成为客户区,由View类来管理,View类也是一个窗口,他是MainFrame的子窗口。OnDraw函数负责绘制客户区的内容,该函数会被多次调用,他可以被你自己调用,比如你调用View类的UpdateWindow,或者在Document类中调用UpdateAllViews等等,MFC自动会调用OnDraw。他还会被Windows调用,Windows在需要刷新窗口的时候发送给窗口WM_PAINT消息,MFC事先已经预定义了,在响应WM_PAINT消息的时候会调用OnDraw。何时Windows会发送WM_PAINT呢,比如窗口从最小化还原,比如窗口被用户改变了大小等等。这部分内容最好看看Windows GDI,Windows GDI是Windows操作系统整个可视化界面的基础。
 
然后你最后一个问题,何时才能被播放音乐。你仔细想想就容易得到答案了,整个程序从App类的InitInstrance开始,在InitInstranc
学过PE文件格式,你就明白,程序在进入WinMain之前要做很多事情,比如初始Dos头,分配函数表,初始化全局变量。之后才进入程序入口(WinMain)

MFC对WindowsAPI进行了封装。在用向导编译成的二进时代码,MFC编译器链接器把源文件编译成PE文件格式存储在磁盘上。

程序执行的时候,从PE文件头开始执行,在进入Winmain函数之前,进行一系列的必备的初始化。

MFC对这一系列的过程进行了封装。提供给编程人员的第一个裸露程序入口就是CWinApp的InitInstance(),其实程序的入口依然是WinMain()函数。

大家都知道,每个程序都有拥有一个进程,每个进程至少有一个线程就是主线程。CWinThread类是MFC用来封装线程的,这个主线程就是在WinMain函数中创建的,包括UI线程和工作者线程。因此每个MFC程序至少使用一个CWinThread派生类。被MFC程序员熟知的CWinApp应用类就从这里派生。

InitInstance是CWinThread的一个虚函数,InitInstance就是“初始化实例”的意思,可见,它是在实例创建时首先被调用的。应用程序总要重载这个虚函数,进行系统设置,创建运行环境。例如,主窗口一定要在InitInstance()中创建,因为该函数退出后就进入该线程的消息循环。

MFC执行流程。

_tWinMain(WinMain的别名,用define替换的)-》AfxWinMain->初始化线程,调用InitInstance初始化窗口,调用Run函数进入消息循环。

希望对你有用。

看看MSDN的解释:实际上windows允许一个程序同时运行多次,每一次都称为一个“实例”(instance)。在每一个实例开始的时候系统都会调用initinstance()这个函数进行初始化。


MFC中dodataexchange的作用:
将界面上的控件与一个变量或者一个类对象相关联!
数据交换

例如文本框控件 当关联了一个变量的时候 就需要在这个控件和这个变量之间通过DoDataExchange建立联系

然后通过调用UpdateData选择当用户更改了输入的时候 是否更新变量值
或更改程序变量值后是否更新界面


操作注意问题:.
1.调用UpdateData选择当用户更改了输入的时候 是否更新变量值
2.当在按钮中,引入另一个类时,必须在未设置按钮函数时候,就已经创建好将要引入的类,否则会造成无法读取要引入的类,!!!
我的理解是主函数的入口函数

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多