MFC复习(二)MFC应用程序“生死因果”

安装vs2019时没有安装MFC,如何重新配置MFC 1,点击进入vs2019安装向导 2,选择x86 & x64的应该就可以 3,等待安装,大概10分钟能成功下载安装完成 4,新建mfc项目 在应用程序类型这一项选择基于对话框。其他的别动,点击完成 5,直接点击Ctrl+F5,或者在调试窗口中点击开始执行选项。若未报错直接弹出最后一图对话框则安装成功 6,出现报错了 原因如下图 7,上网搜索是说,要“安装MFC类库”,可是刚刚不... 阅读详情

                       ////////////////////////////////////////////
                          /*    1. Windows 帮忙         */
                          /*         程序诞生!         */
                          //////////////////////////////////////////
    Windows 操作系统为应用程序创建进程核心对象,并为该应用程序分配4GB的进程地址空间,系统加载器
将应用程序可执行文件映像以及一些必要的代码(包括数据和一些应用程序使用的dlls)加载到应用程序的进程地址空间中。

                          /////////////////////////////////////////////
                          /*    2.启动函数是什么?      */
                          /////////////////////////////////////////////
    Windows 操作系统在初始化该应用程序进程的同时,将自动为该应用程序创建一个主线程,该主线程与
C/C++运行时库的启动函数一道开始运行。很多初学者并不知道C/C++运行时库的启动函数是何方神圣,这里我
简单介绍一下:当你的应用程序编译后开始链接时,系统的链接器会根据你的应用程序的设置为你的应用程序
选择一个C/C++运行时库的启动函数(注释:这些函数声明在../Visual Studio.NET/vc7/crt/src/crt0.c中)
一般的ANSI版本的GUI的应用程序的C/C++运行时库的启动函数为:
                           int WinMainCRTStartup(void);

注释:函数定义在../Visual Studio.NET/vc7/crt/src/crtexe.c中
其它版本的C/C++运行时库的启动函数如下:
    ANSI版本的CUI的应用程序:      int mainCRTStartup(void);
    Unicode版本的CUI的应用程序:   int wmainCRTStartup(void);
    Unicode版本的GUI的应用程序:   int wWinMainCRTStartup(void);
    C/C++运行时库的启动函数的主要功能为初始化C/C++运行时库和为所有全局和静态的C++类对象调用构造函数

                         /////////////////////////////////////////////////
                         /*   3.侯捷老师所说的"引爆器" */
                         /////////////////////////////////////////////////
    前面所说的C/C++运行时库的启动函数的主要功能之一是为所有全局和静态的C++类对象调用构造函数。侯捷老师所说的"引爆器"---CMyWinApp theApp这个Application Object就是由启动函数调用其构造函数构造出来的。

                       //////////////////////////////////////////////
                        /*    4. WinMain函数登场了    */
                        //////////////////////////////////////////////
    C/C++运行时库的启动函数int WinMainCRTStartup(void);所调用的WinMain函数---同时也是主线程的入口函数为:
    int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)

    {

          return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);

    }
    注释1:该函数定义在../Visual Studio.NET/vc7/atlmfc/src/mfc/appmodul.cpp中
    注释2:_t 是为了照顾Unicode版本而定义的宏。

                       /////////////////////////////////////////////////
                       /*   5.MFC程序的入口点函数    */
                       //////////////////////////////////////////////////
   MFC作了一个"乾坤大挪移",将WinMain函数的全部责任转移交给了MFC程序的入口点函数---AfxWinMain。
   注释:该函数定义在../Visual Studio.NET/vc7/atlmfc/src/mfc/winmain.cpp中。

AfxWinMain函数主要由四大模块组成,他们分别是AfxWinInit,InitApplication,InitInstance,Run。

下面将分别介绍这四大模块的功能。

                       ///////////////////////////////////////////////
                       /*   5.1  AFX的内部初始化     */
                       ///////////////////////////////////////////////
还记得我在第三个标题---侯捷老师所说的"引爆器"处 的话么,"CWinApp类的一些主要的数据成员在后面将被重新赋值。",AfxWinInit函数就是这些数据成员被赋值的地方,它重新初始化这些在整个程中都扮演重要角色的成员,并且调用AfxInitThread()为主线程作了一些初始化工作,这些都为以后MFC框架的正常运作铺平了道路。

                       /////////////////////////////////////////////////
                       /* 5.2  应用程序的全局初始化  */
                       /////////////////////////////////////////////////
  InitApplication函数(virtual)为程序进行全局初始化:
  注释1:该函数定义在../Visual Studio.NET/vc7/atlmfc/src/mfc/appcore.cpp中。

InitApplication函数只是调用了CWinApp::LoadSysPolicies();而后者将加载一些注册表的信息用来初始化一些程序定义的结构并为程序注册一些基本信息。

   注释2:在MFC文档中有这么一句话"The CWinApp::InitApplication member function is obsolete in MFC.",所以你大多情况下不用在意这个virtual函数。

                       /////////////////////////////////////////////////
                       /*  5.3 应用程序的标准实例化  */
                       //////////////////////////////////////////////////
   CWinApp::InitInstance()是一个虚函数,大多数应用程序都要override这个函数。

CMyWinApp::InitInstance()先显式调用了基类的InitInstance();
CMyWinApp::InitInstance()在其基类的帮助后,开始执行它自己的一系列代码来完成诸如"初始化 OLE 库","设置注册表主键以使程序能保存信息到注册表中","分析标准外壳命令","生成程序主框架,文档和视图结构","显示程序主窗口"等工作。

                      ////////////////////////////////////////////
                       /*     5.4 "消息泵"启动了     */
                       ////////////////////////////////////////////
    众所周知,Windows是一个以消息为基础,以事件驱动的操作系统,每一个Win32程序也都是如此。那么
MFC应用程序是如何实现消息机制的呢?MFC应用程序框架将这种消息机制包装到了一个"消息泵"中,而这个"消息泵"在CMyWinApp::Run()中被启动了。

  1. int CWinThread::Run()
  2. {
  3.     ...
  4.     // acquire and dispatch messages until a WM_QUIT message is received.
  5.     for (;;)
  6.     {
  7.         // phase1: check to see if we can do idle work
  8.         while (bIdle && !::PeekMessage(&(pState->m_msgCur), NULL, NULL, NULL, PM_NOREMOVE))
  9.         {
  10.             // call OnIdle while in bIdle state
  11.             if (!OnIdle(lIdleCount++))
  12.                 bIdle = FALSE; // assume "no idle" state
  13.         }
  14.         
  15.         // phase2: pump messages while available
  16.         do
  17.         {
  18.             // pump message, but quit on WM_QUIT
  19.             if (!PumpMessage())//消息泵
  20.                 return ExitInstance();
  21.             
  22.             // reset "no idle" state after pumping "normal" message
  23.             //if (IsIdleMessage(&m_msgCur))                                          
  24.             if (IsIdleMessage(&(pState->m_msgCur)))
  25.             {
  26.                 bIdle = TRUE;
  27.                 lIdleCount = 0;
  28.             }
  29.         
  30.         } while (::PeekMessage(&(pState->m_msgCur), NULL, NULL, NULL, PM_NOREMOVE));
  31.     }
  32. }                    
  33.     
  34. //CWinThread implementation helpers
  35. BOOL CWinThread::PumpMessage()
  36. {
  37.     return AfxInternalPumpMessage();
  38. }
  39.     
  40. BOOL AFXAPI AfxInternalPumpMessage()//部分源码
  41. {
  42.     _AFX_THREAD_STATE *pState = AfxGetThreadState();
  43.     if (!::GetMessage(&(pState->m_msgCur), NULL, NULL, NULL))
  44.     {
  45.         ...//
  46.         return FALSE;
  47.     }
  48.               ...//
  49.            // process this message
  50.     
  51.     if (pState->m_msgCur.message != WM_KICKIDLE && !AfxPreTranslateMessage(&(pState->m_msgCur)))
  52.     {
  53.         ::TranslateMessage(&(pState->m_msgCur));
  54.         ::DispatchMessage(&(pState->m_msgCur));
  55.     }
  56.     
  57.     return TRUE;
  58. }

   终于出现了::TranslateMessage和::DispatchMessage,熟悉Win32API编程的人一定会眼睛一亮,终于挖出源头了。

                       /////////////////////////////////////////
                       /*        6. 收尾工作         */
                       ////////////////////////////////////////
    MFC应用程序的主要流程几乎都已被挖掘完了,下面看一下收尾工作是如何进行的。
    当应用程序发现消息队列中出现了WM_QUIT消息时, nReturnCode = pThread->Run();CWinApp::Run()返回,并设置返回值。下面将执行AfxWinTerm函数。

  该函数主要作一些清除工作,将该释放的东西释放,比如卸载钩子等。
  等到AfxWinTerm函数结束,AfxWinMain函数返回nReturnCode值,且该值也将作为_WinMain函数的返回值返回。

 

 

 

摘自

http://www.chinaitpower.com/A/2001-10-06/878.html

什么是 MFC AppWizard? 先来复习两个单词吧: witch     : 女巫 wizard  : 男巫              下面看看维基百科对计算机中的wizard的描述:        A software wizard or setup assistant is auser interface type that presents auser with a sequence of dia 阅读详情

相关推荐

VC++深入详解(1):MFC框架程序剖析

学了一段Win32SDK应用程序以后,因为种种杂七杂八的事情,让windows程序设计的内容停滞了很长一段时间。但是我今天还是鼓足了勇气,继续开始后面的内容。(不过后面的笔记不再是跟着杨力祥老师的上课内容了,因为他对MFC的讲解似乎课程剩下的不是很足,所以我换了孙鑫老师的听)。 咱们直接从第三节课讲起吧。第一节课讲的是用Win32SDK应用程序写“hello world”,我们之前已经做过很多遍

thefutureisour的专栏 7031

VS2019创建MFC程序

为VS2019安装MFC开发环境 打开Visual Studio Installer(在电脑应用里找就行,安装vs2019肯定少不了它),得到如下界面,点击修改(如果提示你需要更新vs,你只能更新完vs才有修改选项) 找到使用使用C++的桌面开发选项,便能找到如图所示的MFC组件,安装它 安装完成。。。。 创建MFC应用 1、打开VS,点击创建新项目,得到下图,选择MFC应用(找不到的话可以...

weixin_44144733的博客 3万+

深入解析AndroidManifest.xml与device_admin.xml:打造完美DeviceOwner应用配置

本文深入解析了Android企业级开发中DeviceOwner应用的核心配置文件AndroidManifest.xml与device_admin.xml。详细阐述了如何精准声明DeviceAdminReceiver、定义管理策略,并提供了通过ADB命令进行设置与验证的实战指南,帮助开发者构建权限完整、配置正确的设备所有者应用。

ice55的博客 680

mfc的一些复习资料

 1-1 什么是Windows SDK程序?答:使用软件开发工具包开发出来的Windows应用程序叫做Windows SDK程序。1-3 打开windows.h文件,看一下Windows系统的句柄是什么数据类型的?答:整型。1-5 什么是事件?答:能触发程序做出相应反应的因素或动作叫做“事件”。1-6 如何显示和更新窗口?答:调用函数ShowWindow显示窗口,调用函

leishuanghui的专栏 1465

VSCode + ESP-IDF 项目搭建及配置

VSCode 搭建 ESP-IDF 开发环境

weixin_51358957的博客 2万+

DeepSeek + 番茄小说:AI辅助小说开发最全指南

DeepSeek与番茄小说合作推出AI辅助小说创作系统,通过DeepSeek的文本生成能力(包括情节构建、角色塑造等)结合番茄小说的市场数据,为作者提供从创意到发布的全流程支持。系统包含智能创意生成器、角色设计、章节自动生成等核心模块,采用数据驱动优化策略,支持128K长文本处理和多风格模仿。开发架构采用Python+FastAPI技术栈,提供分层审核机制确保质量。该系统可帮助作者突破创作瓶颈,提升效率,同时提供订阅制、内容分成等多元变现模式。需注意版权问题和原创性保证。

weixin_41445009的博客 1678

创建一个单文档MFC应用程序的那些事儿

从大一注册博客到现在还没发表过一篇文章,趁着复习的机会整理一下所得,这次不要再半途而废了~ --------------------------------------------------------------------------我 是 一 条 安 静 的 分 割 线----------------------------------------------------------

baixue0729的博客 1万+

基于Python大数据的智能交通分析系统

该系统能够实时监测交通状况,分析交通流量,预测交通趋势,为交通管理部门提供决策支持,帮助缓解交通拥堵,提高交通运行效率,减少交通事故发生率,改善市民出行体验。它能够为交通管理部门提供决策支持,帮助缓解交通拥堵,提高交通运行效率,减少交通事故发生率,改善市民出行体验,促进交通产业的健康发展。数据采集层:通过传感器、GPS设备、交通摄像头等数据源,实时采集交通数据,如车辆速度、位置、道路拥堵情况等。数据分析层:运用统计学方法、机器学习算法等,对处理后的数据进行深入分析,挖掘交通规律,预测交通趋势。

qq3828614760的博客 2969

复习下MFC SOCKET的操作

看到这个文章的 基于MFC平台实现SOCKET通信 ,觉得不错。但是代码不完整,于是发了点时间实现全部代码。Cline 为服务器代码,负责接收客户端。lineClient 为客户端代码,负责连接服务器。1、上线通知2、客户端下线通知3、sokcet通信.........

HiZhanYue的博客 566

GEE案例教程:融合Sentinel-1 SAR数据、Sentinel-2光学影像和WorldPop人口数据,构建完整的洪水监测与影响评估工作流

本文介绍了一个专为巴基斯坦哈扎拉分区设计的洪水监测系统,该系统整合了Sentinel-1 SAR数据、Sentinel-2光学影像和WorldPop人口数据等多源遥感数据。系统通过VV极化SAR数据的水体提取算法(阈值-13dB)实现洪水范围监测,结合10米分辨率的光学影像进行可视化验证,并利用100米分辨率人口数据评估受灾人口。系统提供完整的技术实现,包括研究区加载、遥感数据处理、日期选择界面和洪水变化检测等功能模块,为灾害应急响应提供科学依据。

此星光明博客 191

移位寄存器——用Verilog实现串入串出、串并和并串转换并进行Modelsim仿真

用Verilog实现串并转换 首先我们先要了并串和串并转换的原理 并串转换:先将八位数据暂存于一个八位寄存器器中,然后左移输出到一位输出端口,这里可以通过一个“移位”来实现,相当于实现了移位寄存器的功能。 串并转换:新输入的位值成为原来数据的最低位,将原来数据的最高位舍去,这里可以通过一个简单的“连接符”来实现。 我们这里采用两种方式来进行串并转换 一:lsb优先 Least Significant Bit,最低比特,最低位优先 二:msb优先 Most Significant Bit,最高比特,

H19981118的博客 2万+

Visual C++ MFC 简明教程

Visual C++ MFC 简明教程 原著:Marshall Brain 编译:张圣华 第一部分:MFC导论  Visual C++ 不仅仅是一个编译器。它是一个全面的应用程序开发环境,使用它你充分利用具有面向对象特性的 C++ 来开发出专业级的 Windows 应用程序。为了能充分利用这些特性,你必须理解 C++ 程序设计语言。掌握了C++,你就必须掌握 Microsoft

skyremember的专栏 2924

Android 13 灭屏音乐播放问题解决与优化建议

通过在中增加对音乐播放状态的检测,我们成功解决了客户应用在灭屏状态下音乐播放被中断的问题。

m0_60898338的博客 1157

MFC复习和学习 第一章 MFC基础窗口构建 MFC应用程序启动机制 MFC

/************************************************************************/ /*本程序用来演示使用MFC构建一个最基本的窗口程序,并且在上面显示出一行文字*/ /************************************************************************/ #inclu

学峰的学习笔记 572

智慧城市中的CV:交通流量监控与行人检测

智慧城市中的CV:交通流量监控与行人检测 ,人工智能,计算机视觉,大模型,AI,计算机视觉作为人工智能的重要分支,通过分析和理解图像或视频数据,为智慧城市提供了强大的感知能力。在交通管理领域,计算机视觉技术可实现交通流量监控、行人检测、违章行为识别等功能,助力构建高效、安全、绿色的城市交通系统。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 5万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

windows考试复习题“填空+简答”

一、填空 1、MFC库中负责应用程序管理的类是CWinApp而负责管理各种窗口的类是CWnd 2、Windows的所谓事件驱动的核心是消息 3、移动鼠标会产生的消息是WM_MOUSEMOVE 4、Windows系统中对各种对象(窗口、文件、资源等)的标识是句柄 5、用VC编写基于窗口的典型应用程序,可以使用的工具库有MFC和API函数库。 二、简答 1、MFC中产生消息映射表结构的宏

ganjiang520的专栏 878

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Visual C++ MFC 简明教程1

原著:Marshall Brain 编译:张圣华第一部分:MFC导论  Visual C++ 不仅仅是一个编译器。它是一个全面的应用程序开发环境,使用它你充分利用具有面向对象特性的 C++ 来开发出专业级的 Windows 应用程序。为了能充分利用这些特性,你必须理解 C++ 程序设计语言。掌握了C++,你就必须掌握 Microsoft 基本类库 (MFC) 的层次结构。该层次 结构包

bitzi的专栏 669

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

MFC导论

原著:Marshall Brain 编译:张圣华   第一部分:MFC导论   Visual C++ 不仅仅是一个编译器。它是一个全面的应用程序开发环境,使用它你充分利用具有面向对象特性的 C++ 来开发出专业级的 Windows 应用程序。为了能充分利用这些特性,你必须理解 C++ 程序设计语言。掌握了C++,你就必须掌握 Microsoft 基本类库 (MFC) 的层次结构。该层

远有青山 1916

c++ mfc程序 屏幕只显示部分内容_Visual C++ MFC 简明教程

原著:Marshall Brain 编译:张圣华第一部分:MFC导论Visual C++ 不仅仅是一个编译器。它是一个全面的应用程序开发环境,使用它你充分利用具有面向对象特性的 C++ 来开发出专业级的 Windows 应用程序。为了能充分利用这些特性,你必须理解 C++ 程序设计语言。掌握了C++,你就必须掌握 Microsoft 基本类库 (MFC) 的层次结构。该层次 结构包容了 Windo...

weixin_39608680的博客 975

Windows程序设计的基础知识以及MFC初探

Windows 程序需要一个模块定义文件,将模块名称、程序节区和资料节区的内存特性、模块堆积(heap)大小、堆栈(stack)大小、所有callback 函数名称…等等登记下来。.def文件。在集成开发环境中不在需要特别准备。

静下心来,做好每一件事 1464

MFC复习(一)

大家都知道,windows API编程以及其消息处理,其过程都清晰可见,大体步骤如下:1)声明消息窗口类2)注册窗口类3)createwindows4)消息获得以及分派(windows procedure)。但是,对于MFC同样是Windows程序,其流程却显得灰暗不明。现具体分析如下:在MFC中有两个重要的类,CWinApp,CFrameWnd,它们两个的存在在某种意义上来说代替了WinMa

人在旅途/章鸽 的专栏 702

MFC 多线程编程总结

MFC 多线程编程总结

小黄的博客 1万+
上一篇: MFC命令行及CCommandLineInfo类
下一篇: MFC复习(三)MFC文档视图结构
geeeeeeee
博客等级 码龄23年 36粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值