-
2005-12-16
MFC程序框架
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://wolfkiller.blogbus.com/logs/1712327.html
程序的诞生:
1. 生成应用程序对象,进行对象初始化。
CMyWinApp theApp;
2. 进入WinMain程序(WinMain程序由MFC早已准备好并由连接器直接加到应用程序代码中,在WinMain程序中调用MFC函数AfxWinMain)。
3. AfxWinMain执行AfxWinInit,后者又调用了AfxInitThread,把消息对列尽量加大到96。
AfxWinInit(…);
4. AfxWinMain执行InitApplication。这是CWinApp的虚函数,我们通常不改写它。
CwinApp* pApp = AfxGetApp();
pApp->InitApplication();
5. AfxWinMain执行InitInstance,这是这是CWinApp的虚函数,我们必须改写它。
pApp->InitInstance();
(1) AfxWinMain::InitInstance ‘New’了一个CMyFrameWnd对象。
m_pMainWnd = new CMyFrameWnd( );
CMyFrameWnd构造函数调用Create(…), 产生主窗口。Create(…)调用CreateEx(…),后者调用PreCreateWindow(…)与API ::CreateWindowEx(…)。PreCreateWindow(…)完成注册窗口类工作。
(2) 执行CMyFrameWnd类的ShowWindow(…) , 显示窗口。 m_pMainWnd->ShowWindow(m_nCmdShow);
(3) 执行CMyFrameWnd类的UpdateWindow(…), 发出W M_PAINT 消息,调用OnPaint()消息处理虚函数。
6. AfxWinMain执行Run,处理消息循环。
nReturnCode = pApp->Run();
程序的运行:
1. 程序获得 WM_PAINT 消息(藉由 CwinApp::Run 中的 ::GetMessage 循环)。
2. WM_PAINT 经由::DispatchMessage 送到窗口函数CWnd::DefWindowProc 中。
3. CWnd::DefWindowProc 将消息传递过消息映射表格(Message Map)。
4. 传递过程中发现有相符项目,于是调用项目中对应的函数。此函数时应用程序
利用BEGIN_MESSAGE_MAP 和END_MESSAGE_MAP 之间的宏设立起来的。
5. 标准消息的处理常程序亦有标准命名,例如WM_PAINT 必然由OnPaint 处理。
程序的死亡:
1. 使用者单击菜单的【File/Close】,于是发出 WM_CLOSE 消息。
2. CMyFrameWnd 並沒有设置WM_CLOSE 消息处理函数,于是交给基类默认的消息处理函数。
3. 默认消息处理函数对于WM_CLOSE 的处理方式是调用 ::DestroyWindow, 並因而发出 WM_DESTROY 消息。
4. 默认的 WM_DESTROY 消息处理方式是调用 ::PostQuitMessage,因此发出WM_QUIT 消息。
5. CWinApp::Run 收到WM_QUIT 后会退出其內部的消息循环, 然后调用
ExitInstance(),這是CWinApp 的一个虚拟函数。
6. 如果CMyWinApp 改写了ExitInstance , 那么CWinApp::Run 所调用的就是 CMyWinApp::ExitInstance,否则就是CWinApp::ExitInstance。
7. 最后回到 AfxWinMain,执行 AfxWinTerm,结束程序。
随机文章:
Visual C++ .NET编程:托管C++概述 2006-02-07C++字符串完全指引之二 —— 字符串封装类 2005-12-02C++字符串完全指引之一 —— Win32 字符编码 2005-12-02libnet介绍与分析(上) 2006-04-26ACE Streams框架介绍 2006-04-26
收藏到:Del.icio.us
引用地址:







