MFC单文档及其简介(3)

2019-07-27 10:15

// App global initializations (rare) APP全局初始化 dxq if (pApp != NULL && !pApp->InitApplication()) goto InitFailure; // Perform specific initializations if (!pThread->InitInstance()) { if (pThread->m_pMainWnd != NULL) { TRACE0(\ pThread->m_pMainWnd->DestroyWindow(); } nReturnCode = pThread->ExitInstance(); goto InitFailure; } nReturnCode = pThread->Run(); //dxq 进入Run状态

InitFailure:

#ifdef _DEBUG // Check for missing AfxLockTempMap calls if (AfxGetModuleThreadState()->m_nTempMapLock != 0) { TRACE1(\ AfxGetModuleThreadState()->m_nTempMapLock); } AfxLockTempMaps(); AfxUnlockTempMaps(-1); #endif AfxWinTerm(); //dxq终止应用运行并注销环境 return nReturnCode; }

从代码看出,该函数主要调用了4个关键的函数:AfxWinInit(),InitApplication(), InitInstance(),Run(),

在此就不详细的介绍这几个函数,有兴趣的学生可以自己区看看。 AfxWinInit():-初始化MFC环境,

主要完成两个任务:其1:初始化全局对象的数据成员,其2,初始化线程指定的数据。

InitApplication():内部管理 InitInstance():应用的初始化

讲解:每当应用程序启动一个新的实例时,WinMain就调用InitInstance,从概念上讲,应用

的初始化过程可分为两个部分,程序第一次运行时,将进行应用级的初始化,当程序的一个副本或“实例”运行时,它将进行实例的初始化。此函数时虚函数,而且在CWinApp中是一个空函数,因此,在派生类中必须对此函数进行重载,应用向导会完成这个任务。下面是它的函数体:

BOOL CCExcmpleApp::InitInstance() { 。。。。。。。 CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CCExcmpleDoc), RUNTIME_CLASS(CMainFrame), // main SDI frame window RUNTIME_CLASS(CCExcmpleView)); AddDocTemplate(pDocTemplate); //dxq 解析命令行为标准的外壳命令 CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); // 发送指定的命令 if (!ProcessShellCommand(cmdInfo)) return FALSE; // 惟一的窗口已经被初始化,显示并更新 m_pMainWnd->ShowWindow(SW_SHOW); //更新窗口发送WM_PAINT 消息 m_pMainWnd->UpdateWindow(); return TRUE; }

主框架创建

此函数完成了MFC程序的大部分任务,如命令解析,框架,视图乃至文档的生成等,但是,这些过程对开发人员来说时不透明的,他们被MFC封装起来。

在应用程序开始执行时,由APP类辅助解析命令行,执行下面两行代码,接着执行ProcessShellCommand函数,,在这个函数里面调用了一系列封装的函数,主要完成创建一个主框架窗口,学员可以进入函数了解一下。再次略去。至此,主框架就创建好了,主框架的显示以及更新也在InitInstance函数中。在主框架产生之际会发出WM_CREATE消息,因此CMainFrame::OnCreate会被执行,哪里将进行工具栏和状态栏的建立,及如下代码: int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { TRACE0(\ return -1; // fail to create } if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) { TRACE0(\ return -1; // fail to create } // TODO: Delete these three lines if you don't want the toolbar to // be dockable m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar); return 0; }

工具栏和状态栏分别由CToolBar和CStatusBar创建,两个对象属于主窗口。为了拦截WM_CREATE,首先需要在MessageMap中设定“映射项目”; BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code ! ON_WM_CREATE() //}}AFX_MSG_MAP END_MESSAGE_MAP()

ON_WM_CREATE这个宏表示,只要WM_CREATE发生,OnCreate就会调用,就会创建工具栏和状态栏。

至此,程序就已经启动起来了,启动完毕后,程序进入挂起状态。

3.对象的创建

CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CCExcmpleDoc), RUNTIME_CLASS(CMainFrame), // main SDI frame window RUNTIME_CLASS(CCExcmpleView)); AddDocTemplate(pDocTemplate); //dxq 解析命令行为标准的外壳命令 CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); // 发送指定的命令 if (!ProcessShellCommand(cmdInfo)) return FALSE; // 惟一的窗口已经被初始化,显示并更新 m_pMainWnd->ShowWindow(SW_SHOW); //更新窗口发送WM_PAINT 消息 m_pMainWnd->UpdateWindow(); 此段代码显示了对象的创建 SDI应用通常包括几个重要的对象:文档模板,文档,框架窗口以及视图等。应用对象负责创建文档模板,而文档模板负责创建文档和框架窗口,框架窗口负责创建视图对象,其先后顺序为:文档模板->文档->框架窗口->视图。 对象创建完成之后,

4.程序的挂起:

Run():程序挂起。

Run()函数通过消息循环,检查消息队列中是否有需要处理的消息,如果有消息需要处理,则Run()就获取-翻译—分发它,如果没有任何消息需要处理,则Run调用OnIdle以便执行用户或框架需要完成的空闲时间处理如果没有任何消息,也没有任何可执行的空闲处理,则应用程序一直等待消息产生,应用也就被挂起。 下面时函数定义: int CWinApp::Run() { if (m_pMainWnd == NULL && AfxOleGetUserCtrl()) { // Not launched /Embedding or /Automation, but has no main window! TRACE0(\m_pMainWnd is NULL in CWinApp::Run - quitting application.\\n\ AfxPostQuitMessage(0); } } return CWinThread::Run(); 该函数没有做处理,主要调用基类的CWinThread::Run();

int CWinThread::Run() { ASSERT_VALID(this); // for tracking the idle time state BOOL bIdle = TRUE; LONG lIdleCount = 0; // dxq 获取并分发消息直到收到一个WM_QUIT消息 for (;;) { // dxq 第一阶段:检查是否可以在空闲做一些工作 while (bIdle && !::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE)) { // 当为空闲时调用OnIdle if (!OnIdle(lIdleCount++)) bIdle = FALSE; // assume \ } // 第二阶段:当可以从队列中得到消息时提取消息 do { // 提取消息当为WM_QUIT时退出 if (!PumpMessage()) return ExitInstance(); // 提取正常消息,重置空闲状态 if (IsIdleMessage(&m_msgCur)) { bIdle = TRUE; lIdleCount = 0; } } while (::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE)); } ASSERT(FALSE); // not reachable


MFC单文档及其简介(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2014版最新人教版四年级上册数学教案 - 图文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: