创建一个新的工程:
一、包含的类:
CxxxApp类
CxxxDoc类
CxxxView类
二、WinMain
在安装目录下的源代码中:APPMODUL.CPP 中,程序会首先进入WinMain中
#define _tWinMain WinMian
extern "C" int WINAPI
_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
// call shared/exported WinMain
return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
}
//………………………………………………………………1………………………………………………………………………………………………//
1.theApp 全局对象(MFC中的类是如何与WinMain函数关联的呢)
执行顺序???
1.1先定义一个: CxxxApp类实在:xxx.h 和 xxx.cpp 中声明和定义的。
// CTestApp construction CTestApp::CTestApp()//step2:xxxApp构造函数 { //
TODO: add construction code here, // Place all significant
initialization in InitInstance }
/
// The one and only CTestApp object CTestApp
theApp;//step1:theApp全局定义处,
/
// CTestApp initialization
//……………………………………………….补充说明,重点解释执行顺序…………………………………………….//
#include <iostream.h>
//int a = 6;
class CPoint
{
public:
CPoint()//Step2:对一个对象来说就是调用对象的构造函数,构造改对象,并进行初始化操作
{
}
};
CPoint pt;//Step1:无论是全局对象还是全局变量,程序首先为全局变量/对象分配存储空间
void main()//Step3:最后执行main
{
//count << a<< endl;
}
//………………………………………………..end……………………………………………………//
1.2为什么要在WinMain之前定义一个theApp 实例??
CTestApp theApp;//该对象表示了表示了应用程序本身
//theApp 对象的构造函数CTestApp在调用之前,会调用其父类CWinApp的构造函数从而就把我们程序自己创建的类与Microsoft提供的基类观念起来,CWinApp的构造函数完成一些初始化的工程
//………………………………………………………………2……………………………………………………………………………………………..//
2.AfxWinMain 函数(WinMain函数是通过调用AfxWinMain来实现的)
对Test程序来说,pThread 和 pApp所指向的都是CTest类的对象,既theApp 全局对象
//………………………………………………………………3……………………………………………………………………………………………..//
3.InitInstance函数(调用三个函数,完成Win32中的:设计窗口类、注册窗口类、创建窗口、显示窗口、更新窗口、消息循环,以及窗口过程函数)
三、MFC框架窗口
1.设计和注册窗口
有了WinMain函数,接下来应该使设计窗口类和注册窗口类
2.创建窗口
3.显示和更新窗口
四、消息循环
CWinThread 类的Run 函数就是完成消息循环这一任务的,该函数在AfxWinMain函数中调用,调用形式:
nResult = pThread->Run();
/*
该函数主要结构是for ,循环收到一个 WM_QUIT消息是退出
*/
int CWinThread::Run()
{
ASSERT_VALID(this);
// for tracking the idle time state
BOOL bIdle = TRUE;
LONG lIdleCount = 0;
// acquire and dispatch messages until a WM_QUIT message is received.
for (;;)
{
// phase1: check to see if we can do idle work
while (bIdle &&
!::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE))
{
// call OnIdle while in bIdle state
if (!OnIdle(lIdleCount++))
bIdle = FALSE; // assume "no idle" state
}
// phase2: pump messages while available
do
{
// pump message, but quit on WM_QUIT
if (!PumpMessage())
return ExitInstance();
// reset "no idle" state after pumping "normal" message
if (IsIdleMessage(&m_msgCur))
{
bIdle = TRUE;
lIdleCount = 0;
}
} while (::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE));
}
ASSERT(FALSE); // not reachable
}
五、窗口过程函数
现在消息已近进入消息循环,那么MFC 程序是否也把消息路由给一个窗口过程函数处理呢?
并不是所有的消息都交给窗口过程函数DcfWindowProc ,而是采用一种 消息映射机制:
总结:
- 利用全局应用程序对象theApp ,启动应用程序。 创建的类CxxxApp,的基类CWinApp 中的this 指向这个对象;
- 调用全局应用程序对象的构造函数,从而就会调用CWinApp中的构造函数,完成一些应用程序的初始化工作,并将应用程序对象的指针保存起来;
- 进入WinMain函数。在AfxWinMain函数中可以获取子类(就是CxxApp类)的指针,利用此指针调用虚函数。完成一些初始换工作,包括:窗口类的注册、创建、窗口的显示和更新。期间会多次调用CreateEx函数,应为一个单文档MFC应用程序有多个窗口,包括:框架窗口、工具条、状态条等。
- 进入消息循环。虽然也默认的设置了窗口过程函数,但是,MFC应用的实际上采用消息映射机制来处理各种消息。当收到WM_QUIT消息时,退出消息循环,程序结束;