现在讨论MFC应用程序如何启动。
WinMain函数是MFC提供的应用程序入口。进入WinMain前,全局应用程序对象已经生成。WinMain流程如图5-3所示。图中,灰色框是对被调用的虚拟函数的注释,程序员可以或必须覆盖它以实现MFC要求的或用户希望的功能;大括号所包含的图示是相应函数流程的细化,有应用程序对象App的初始化、Run函数的实现、PumpMessage的流程,等等。
从图中可以看出:
(1)一些虚拟函数被调用的时机
对应用程序类(线程类)的InitIntance、ExitInstance、Run、ProcessMessageFilter、OnIdle、PreTranslateMessage来说,InitInstance在应用程序初始化时调用,ExitInstance在程序退出时调用,Run在程序初始化之后调用导致程序进入消息循环,ProcessMessageFilter、OnIdle、PreTranslateMessage在消息循环时被调用,分别用来过滤消息、进行Idle处理、让窗口预处理消息。
(2)应用程序对象的角色
首先,应用程序对象的成员函数InitInstance被WinMain调用。对程序员来说,它就是程序的入口点(真正的入口点是WinMain,但MFC向程序员隐藏了WinMain的存在)。由于MFC没有提供InitInstance的缺省实现,用户必须自己实现它。稍后将讨论该函数的实现。
其次,通过应用程序对象的Run函数,程序进入消息循环。实际上,消息循环的实现是通过CWinThread::Run来实现的,图中所示的是CWinThread::Run的实现,因为CWinApp没有覆盖Run的实现,程序员的应用程序类一般也不用覆盖该函数。
(3)Run所实现的消息循环
它调用PumpMessage来实现消息循环,如果没消息,则进行空闲(Idle)处理。如果是WM_QUIT消息,则调用ExitInstance后退出消息循环。
(4)CWinThread::PumpMessage
该函数在MFC函数文档里没有描述,但是MFC建议用户使用。它实现获取消息,转换(Translate)消息,发送消息的消息循环。在转换消息之前,调用虚拟函数PreTranslateMessage对消息进行预处理,该函数得到消息目的窗口对象之后,使用CWnd的WalkPreTranslateTree让目的窗口及其所有父窗口得到一个预处理当前消息的机会。关于消息预处理,见消息映射的有关章节。如果是WM_QUIT消息,PumpMessage返回FALSE;否则返回TRUE。
相关推荐
inMain在MFC程序中是如何从源程序中被隐藏的,theApp全局变量是如何被分配的,MFC框架中的几个类的作用与相互关系,MFC框架窗口是如何产生和销毁的,对窗口类的PreCreateWidow和OnCreate两个函数的着重分析,Windows...
主要针对vc++课程中的WinMain函数进行了举例说明,并给出了相应的实现代码。
vc中的winmain函数的用法与理解 int WINAPI WinMain( HINSTANCE hInstance, // handle to current instance HINSTANCE hPrevInstance, // handle to previous instance LPSTR lpCmdLine, // command line int ...
自己写的带有菜单的WinMain函。代码清晰,简单。知识单一。
WinMain函数的输入,窗口的设计,建立,注册,显示以及更新等等
(2) WinMain函数的使用(Win32下程序的入口) (3) 完成Windows窗口产生的四个步骤: A.设计窗口类,即WNDCLASS结构体的填充, 其中注意窗口 函数的指定和类名的命名 B.注册窗口类,即RegisterClass(…) 函数的使用 C....
11
11
程序中隐藏WinMain函数,当成是头文件包含进来,我们开发就不需要改动WinMain函数, CWinApp 和CDialog类在SDK中模拟实现,程序会进入我写的InitInstance,该函数里面负责显示窗口,窗口类里面有窗口过程...
入口函数( main、WinMain) 在C/C++中,我们知道有一个如下格式的函数: int main(int argc, _TCHAR* argv[]) { return 0; } 该函数是C/C++中的入口函数,而在WindowsAPI中也有自己的入口函数,该函数的格式...
应用WinAPI函数修饰程序窗体实例
WINMAIN函数是所有函数的入口函数。代码中虽没有winmain函数,但可以在编译器链接的时候将这个函数链接进去。 CTestApp theApp(应用程序对象)(全局对象,在winmain之前执行);为应用程序对象,每一个MFC程序只能...
main和WinMain函数到底是怎么回事,以及QT是怎么创建窗口和消息循环的,我们已经非常清楚了
(1)对于Win32 SDK程序,应用程序的实例是由实例句柄(WinMain函数的hInstance参数)来标识的 (2)对于MFC程序,应用程序的实例是由全局对象(每一个MFC程序有且仅有一个从应用程序类CWinApp派生的类, 如CTestApp,它...
c++窗体程序设计必备winmain函数
有C++代码编写的界面,适于初学者研究。有关于Windows下的WinMain函数。 适于初学者研究。有关于Windows下的WinMain函数。
本人根据教程编写的Win32项目模板,把winproc函数分解成多个函数,使用消息映射的方法来处理消息(具体操作请模仿我... WinMain函数写在头文件里了。在源文件里的BuildProc()函数和BuileEvent()函数是这个模板的关键。
我们知道在WIN32API程序当中,程序的入口为WinMain函数,在这个函数当中我们完成注册窗口类,创建窗口,进入消息循环,最后由操作系统根据发送到程序窗口的消息调用程序的窗口函数。而在MFC程序当中我们不再能找到...
VC++ winmain函数使用调用方法,和hook类似
Windows程序中必须要有WinMain函数,因为该函数最重要的任务是创建该应用程序的主窗口。Windows程序与基于MS-DOS程序的最大差别就在于:MS-DOS程序是通过调用操作系统的功能来获得用户输入的,而Windows程序是通过...