《明明白白看MFC之程序框架(二)》

原创 2004年04月05日 23:18:00

 

二、         MFC应用程序结构<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

借助向导,可以快速的生成一个SDIWindows应用程序。在使用向导生成应用程序后,会发现有好几个文件, 其主要代码如下:

 

CHelloWorldApp theApp;

int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

    LPTSTR lpCmdLine, int nCmdShow)

{

   

    CWinThread* pThread = AfxGetThread();

    CWinApp* pApp = AfxGetApp();

 

    // AFX internal initialization

    if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))

       goto InitFailure;

 

    // App global initializations (rare)

    if (pApp != NULL && !pApp->InitApplication())

       goto InitFailure;

 

    // Perform specific initializations

    if (!pThread->InitInstance())

    {

       if (pThread->m_pMainWnd != NULL)

       {

           TRACE0("Warning: Destroying non-NULL m_pMainWnd/n");

           pThread->m_pMainWnd->DestroyWindow();

       }

       nReturnCode = pThread->ExitInstance();

       goto InitFailure;

    }

    nReturnCode = pThread->Run();

 

InitFailure:

……………………

 

    AfxWinTerm();

    return nReturnCode;

}

 

BOOL CWinApp::InitApplication()

{

    if (CDocManager::pStaticDocManager != NULL)

    {

       if (m_pDocManager == NULL)

           m_pDocManager = CDocManager::pStaticDocManager;

       CDocManager::pStaticDocManager = NULL;

    }

 

    if (m_pDocManager != NULL)

       m_pDocManager->AddDocTemplate(NULL);

    else

       CDocManager::bStaticInit = FALSE;

 

    return TRUE;

}

BOOL CHelloWorldApp::InitInstance()

{

    AfxEnableControlContainer();

 

    ………………………………

 

    // Change the registry key under which our settings are stored.

    // TODO: You should modify this string to be something appropriate

    // such as the name of your company or organization.

    SetRegistryKey(_T("Local AppWizard-Generated Applications"));

 

    LoadStdProfileSettings();  // Load standard INI file options (including MRU)

 

    // Register the application's document templates.  Document templates

    //  serve as the connection between documents, frame windows and views.

 

    CSingleDocTemplate* pDocTemplate;

    pDocTemplate = new CSingleDocTemplate(

       IDR_MAINFRAME,

       RUNTIME_CLASS(CHelloWorldDoc),

       RUNTIME_CLASS(CMainFrame),       // main SDI frame window

       RUNTIME_CLASS(CHelloWorldView));

    AddDocTemplate(pDocTemplate);

 

    // Parse command line for standard shell commands, DDE, file open

    CCommandLineInfo cmdInfo;

    ParseCommandLine(cmdInfo);

 

    // Dispatch commands specified on the command line

    if (!ProcessShellCommand(cmdInfo))

       return FALSE;

 

    // The one and only window has been initialized, so show and update it.

    m_pMainWnd->ShowWindow(SW_SHOW);

    m_pMainWnd->UpdateWindow();

 

    return TRUE;

}

BOOL CWinApp::InitInstance()

{

    return TRUE;

}

               

                             MFC应用程序之“Hello  World

 

     咋一眼看上去,好像这个程序无从下手分析,甚至连程序的入口点都找不到。其实,上面的程序还是经过整理后才有如此模样,刚刚入门的我就花了不少功夫才整理出上面的运行脉络,已经较清晰了^_^

在程序的开始处,首先定义了一个全局变量theApp,他代表了整个程序的存在,然后程序开始进入入口点。但是,这里的入口点不再是Cmain()或者是SDK中的WinMain()了,起而代之的是AfxWinMain(),如果不去深究 为什么,那么就当成是第一次到C语言中的main()函数一样,只要知道程序从这里开始执行就可以了!实际上,在AfxWinMain()中为了驱动程序的执行,调用了好几个函数,执行路径为:入口点----AfxGetThread()------AfxGetApp()-------àAfxWinInit()-------àpApp->InitApplication()-----àpThread->InitInstance()------àpThread->Run()。可以看到,程序一样有一个执行的线索可循,但是,相对于SDK来说,如今已经面目全非了,过去的那种清晰的程序结构在这些程序中也有吗?答案是肯定的,只不过他们的具体实现在MFC中都进行了包装而已。

程序由AfxWinMain()开始运行后,首先调用了AfxGetApp()来获取应用程序的对象指针pApp,然后通过这个指针调用有关的成员函数来完成初始化和启动工作,最后就调用了Run()函数,在这里,Run()函数就是代表了SDK中的消息循环。 (待续)

明明白白看MFC之程序框架(二)

二、 MFC应用程序结构 在《明明白白看MFC之程序框架(一)》中我分析了一个经典的SDK应用程序的结构,现在可是要进入主题“MFC应用程序结构”了。MFC应用程序有好多种,为了能够更清楚地与前面的文...
  • sxslyy
  • sxslyy
  • 2007年08月17日 09:40
  • 504

《明明白白看MFC之程序框架(三)》

三、MFC程序结构分析 在前面分别列出了SDK和MFC应用程序的框架,并且稍微理了一下它们之间的对应关系。但是对于MFC程序来说,要想真正搞懂它的框架的话,还是不够的。  首先就是看一下应用向导生成的...
  • eliner
  • eliner
  • 2004年04月05日 23:18
  • 2143

明明白白看MFC之程序框架

对于程序员来说,如果要提高编程效率,一个好用的,功能强大的并且可以得心应手使用的编程工具往往会给我们程序员带来莫大的方便。其实对于现在的编程工具来说,使用哪一种工具都不是问题的关键,重要的是你能够使用...
  • fxpopboy
  • fxpopboy
  • 2007年01月11日 21:21
  • 895

《明明白白看MFC之程序框架(一)》

  最近一直在学习VC,因为是自学,有许多问题都是在经过一番辛苦的查找资料才得以解决的,现在,把这些学习VC入门刚刚弄懂得问题贴出来,希望可以得到更多的指教,如果能够帮助到跟我有过同样困惑的人,那就是...
  • eliner
  • eliner
  • 2004年04月05日 23:14
  • 1388

明明白白看MFC之程序框架(一)

对于程序员来说,如果要提高编程效率,一个好用的,功能强大的并且可以得心应手使用的编程工具往往会给我们程序员带来莫大的方便。其实对于现在的编程工具来说,使用哪一种工具都不是问题的关键,重要的是你能够使用...
  • sxslyy
  • sxslyy
  • 2007年08月17日 09:46
  • 480

明明白白看MFC之程序框架(三)

三、MFC程序结构大剖析 在前面我分别给出了SDK和MFC应用程序的框架,并且稍微理了一下它们之间的对应关系。但是对于MFC程序来说,要想真正搞懂它的框架的话,还是不够的。现在我要做的事就是继续去分析...
  • sxslyy
  • sxslyy
  • 2007年08月17日 09:39
  • 608

明明白白看MFC之程序框架(一)

导读:   对于程序员来说,如果要提高编程效率,一个好用的,功能强大的并且可以得心应手使用的编程工具往往会给我们程序员带来莫大的方便。其实对于现在的编程工具来说,使用哪   一种工具都不是问题的关键...
  • yingfox
  • yingfox
  • 2007年12月06日 20:05
  • 401

MFC截图程序的实现(二)

上一篇文章
  • wwkaven
  • wwkaven
  • 2014年06月11日 22:10
  • 729

Windows-MFC框架程序剖析

MFC框架程序剖析 1.MFC Microsoft Foundation Class,微软基础类库,是微软开发的C++集合,方便我们使用它来编写Windows程序。 下面是4个基本的类,我们的V...
  • qq_22075977
  • qq_22075977
  • 2016年04月22日 16:56
  • 3095

深入理解MFC中程序框架

新建一个Example单文档工程,应用向导可以自动地生成MFC应用的各个C++类。 1. 应用类及全局对象(CExampleApp) theApp 是唯一一个在程序形成的时候就存在的全局变量,C...
  • liulianglin
  • liulianglin
  • 2014年01月09日 16:49
  • 1373
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《明明白白看MFC之程序框架(二)》
举报原因:
原因补充:

(最多只允许输入30个字)