MFC 主类说明

Windows程序设计26:MFC对话框工程 Windows程序设计26:MFC对话框工程。 阅读详情
1.CObject类为MFC总类,该类下面有一个重要的类CCmdTarget。
而CCmdTarget类下面又有四个重要的继承类,分别为:CWinThread、CDocument、CDocTemplate、
       CWnd类。所以,可以得出一个大概继承图,如图所示:

                    
CObject--->CCmdTarget ---->CWinThread ---->CWinApp 
                                                       ----->CDocTemplate 
                                                       ----->CDocument 
                                                       ----->CWnd 

      
其中CWnd类下属又有几个重要的继承类,分别为CFrameWnd、CDialog、CView、Controls、
                    
CWnd---->CFrameWnd 
                                                   ---->CDialog 
                                                   ---->CView 
                                                   ---->Controls 

   
归纳一下,CCmdTarget类为MFC主要类的总钢。应用程序(CWinApp)间接继承于它,文档模板(CDocTemplate)继承于它,文档类(CDocument)继承于它,还有一个非常重要的类窗口类(CWnd)继承于它。
       窗口类是一切Windows可见窗口,(包括主窗口,子框窗口,对话框,控件,View窗口)的父类。凡是能可见的,基本上是继承于CWnd,而抽象于其中的(即不可见的)则不继承于它。

 

2.MFC头文件:
       ■STDAFX.H:该文件用来作为Precompiled header file,其内只是载入其它的MFC头文件。

■AFXWIN.H:每个MFC程序都必须载入它,因为它以及它所载入的文件声明了所有的MFC类。此文件内包含AFX.H,后者又包含AFXVER_.H,后者又包含AFXV_W32.H,后者又包含WINDOWS.H

■AFXEXT.H:凡使用工具栏、状态栏的程序必须载入此文件。

■AFXDLGS.H:凡使用通用型对话框(Common Dialog)的MFC程序要载入此文件。

■AFXCMN.H:凡使用Windows9x新增的通用型控件(Common Control)之MFC程序需载入此文件。

■AFXCOLL.H:凡使用Collections Class(处理数据结构如数据,链表类等)之程序需载入此文件。

■AFXDLLX.H:凡MFC extension DLLs需载入此文件。

■AFXRES.H:MFC程序的RC文件必须载入此文件。MFC对于标准Windows资源(如File,Edit等)的ID均有默认定义,这此定义在该头文件内。

 

 

3.什么是Precompiled Header:
       一个应用程序在发展过程中需不断的编译,而Windows程序载入的.H头文件非常巨大且内容不变,编译器如果不Precompiled的话,每次需要编译的时间非常多,所以Precompiled Header就是将.H文件一次编译后的结果存储起来,第二次编译时就可以直接从磁盘中读取。



 

4.关于应用程序的进入点WinMain和窗口过程WndProc:
       MFC代码由于类封装了API,所以,根本就看不到程序的进入WinMain和窗口处理函数WndProc,但是,由于这两个函数有相当程序的不变性,所以,MFC就把有着相当固定行为的WinMain内部操作封装在WinApp中,把有着相当固定行为的WndProc内部操作封装在CFrameWnd中。也就是说:

        ■ CWinApp代表程序本体        

    ■CFrameWnd代表一个主框窗口(Frame Window)

 

 

 

 

5.CWinApp类取代了SDK中的WinMain地位:
    CWinApp本身就代表一个程序本体,程序本体是指与程序本身有关而不与窗口有关的数据或动作。比如,WinMain传递的四个参数,注册窗口类,分派消息等。比如,CWinApp类中就定义了WinMain函数的四个参数(m_hInstance,m_hPrevInstance,m_lpCmdLine,m_nCmdShow)。还定义了一些重要的如 InitApplication(),InitInstance(),Run()等函数。传统的WinMain函数就是由此三个函数完成。
    另外,CWinApp中还应该有个主窗口的handle,是的,但它不在CWinApp类中,而是在CWinThread类中实现,在CWinThread类中,有一个指向窗口类的指针的成员变量。如下所示 CWnd* m_pMainWnd

 

6.CFrameWnd类取代了SDK中的WndProc地位
    众所周知,WndProc是用来处理窗口(包括初始化,处理消息,显示等)的函数,那么CFrameWnd也是,首先在头文件中,我们要继承一个CFrameWnd的类,并在此定义要处理的消息(DECLARE_MESSAGE_MAP),然后,在源文件中,定义该类的消息实现(BEGIN_MESSAGE_MAP,END_MESSAGE_MAP)

 

7.MFC中阴晦的WinMain:
    首先,我们必须在源文件中定义了一个CMyWinApp的实体①它是第一步操作。(如: CMyWinApp MyWinApp;注:代码详见:G:/Program/MyMFC/Hello/Hello.dsw),

CMyWinApp继承自CWinApp,CMyWinApp无构造函数,但需调用CWinApp构造函数。

配置好MyWinApp实体的一些信息,包括获得该线程的句柄,线程的ID,该实体的句柄等。

 

配置完后,_tWinMain登场,注意,我们没有撰写WinMain的代码,WinMain是MFC早已准备好并由链接器直接加到应用程序代码中的。_tWinMain是为了支持Unicode而准备的一个宏,实质还是WinMain。好,_tWinMain函数做了什么工作呢?它只是在里面调用AfxWinMain函数。如下:return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow); AfxWinMain是一个全局的函数,并不属于任一个类。
    下面让我们来看一看AfxWinMain函数做了些什么工作?

 

第一、它会获得Application Object的指针(亦CWinApp派生对象的指针),在此是获得MyWinApp的指针,以备后用。它是通过下面这句来实现的:
            CWinApp* pApp = AfxGetApp(); //AfxGetApp为全局函数,不属于任何类,详见第8条... 注:凡是函数前有Afx字样的都是全局函数。

 

第二、调用AfxWinInit(...)函数,用作MFC GUI程序初始化的一部分,这个函数详见后解...

 

第三、用上面获得的pApp调用InitApplication()函数,如下:pApp->InitApplication(); InitApplication函数详见后解...

 

第四、用pApp调用InitInstance()函数,如下:pApp->InitInstance(); InitInstance函数详见后解...

 

第五、用pApp调用Run()函数,如下: nReturnCode = pApp->Run(); Run函数详见后解...

 

第六、最后调有AfxWinTerm函数,结束该应用程序。 


    所以,主要的AfxWinMain做的工作就应该如下代码所示:
   
int AFXAPI AfxWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)

{

int nReturnCode = -1;

CWinApp* pApp = AfxGetApp();   //详见第8条

AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow); //详见第9条

pApp->InitApplication();     //详见第10条

pApp->InitInstance();        //详见第11条

nReturnCode = pApp->Run();   //详见第12条

AfxWinTerm();

return nReturnCode;

}  

 

 

 

8.AfxGetApp是如何获得CWinApp继承类(在此即CMyWinApp)的实体的指针的?
       AfxGetApp是一个全局函数,定义于AFXWIN1.INL中,如下:

      
_AFXWIN_INLINE CWinApp* AFXAPI AfxGetApp() { return afxCurrentWinApp; }
    而afxCurrentWinApp则又是一个宏,定于AFXWIN.H中:

    #define afxCurrentWinApp AfxGetModuleState()->m_pCurrentWinApp
    而在CWinApp类的构造函数中,有一段代码是这样定义的:

    AFX_MODULE_STATE* pModuleState = AfxGetModuleState();

       pModuleState->m_pCurrentWinApp = this;

       这样,应该看清楚他是如何获得CWinApp继承类(在此是指CMyWinApp类)的实体的指针了吧?
       那么,pApp->InitApplication() / pApp->InitInstance() / pApp->Run()就可以理解成这样:

       CMyWinApp::InitApplication(); / CMyWinApp::InitInstance(); / CMyWinApp::Run() 因为CMyWinApp只继承了InitInstance的实现,所以,就导致调用:

       CMyApp::InitApplication(); / CMyWinApp::InitInstance(); / CWinApp::Run()

9.AfxWinInit ----AFX内部的初始化操作:②
       AfxWinInit是CWinApp构造函数后的第一个操作,也就是第二步操作,以下是它的操作摘要:

       BOOL AFXAPI AfxWinInit(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPTSTR lpCmdLine, int nCmdShow)

    {

ASSERT(hPrevInstance == NULL);

AFX_MODULE_STATE* pState = AfxGetModuleState();

pState->m_hCurrentInstanceHandle = hInstance;

pState->m_hCurrentResourceHandle = hInstance;

// fill in the initial state for the application

CWinApp* pApp = AfxGetApp(); //还是获得CMyWinApp实体的指针。

if (pApp != NULL)

{

// Windows specific initialization (not done if no CWinApp)

pApp->m_hInstance = hInstance;   //设定WinMain四个参数的初始值。

pApp->m_hPrevInstance = hPrevInstance;

pApp->m_lpCmdLine = lpCmdLine;

pApp->m_nCmdShow = nCmdShow;

pApp->SetCurrentHandles();

}

if (!afxContextIsDLL)

AfxInitThread();

return TRUE;

}


10.CWinApp::InitApplication()函数:③
       AfxWinInit函数对内部初始化之后,进入第三步操作:InitApplication,由于CMyWinApp继承自CWinApp,而InitApplication又是CWinApp的一个虚拟函数,我们在CMyWinApp中没有改写它(大部分情况下也不需要改写它),所以我们调用的是CWinApp::InitApplication(),下面我们来看看InitApplication在MFC中做了什么动作?

       BOOL CWinApp::InitApplication()

{

if (CDocManager::pStaticDocManager != NULL)

{

if (m_pDocManager == NULL)

CDocManager::pStaticDocManager = NULL;

}

if (m_pDocManager != NULL)

m_pDocManager->AddDocTemplate(NULL);

else

CDocManager::bStaticInit = FALSE;

return TRUE;

}

 

 

       这些操作都是MFC为内部管理而做的。只要记住一点,我们的派生类无需改写它,它是关于CDocManager的类.
[MFC]使用ChartCtrl类绘图 MFC(MicrosoftFoundationClasses)是微软基础类库的简称,是微软公司实现的一个C++类库,主要封装了大部分的windows API函数,vc++是微软公司开发的c/c++的集成开发环境,所谓集成开发环境,就是说利用它可以编辑,编译,调试,而不是使用多种工具轮换操作,灵活性较大。vc也指它的内部编译器,集成开发环境必须有一个编译器内核,例如DevC++其中一个编译器内核就是gcc。... 阅读详情

相关推荐

深入解析MFC类源代码项目

MFC(Microsoft Foundation Classes)类库是微软提供的一套用于简化Windows应用程序开发的C++类库。它将Windows API的复杂性封装在面向对象的接口中,从而让开发者能够更加专注于业务逻辑的实现。本章将对MFC类库进行一个基础概述,从它的起源与设计哲学谈起,概述核心类及它们在应用程序中的作用,为后续章节的深入学习打下坚实的基础。在探讨MFC之前,理解Windows应用程序的工作原理是很有必要的。

weixin_31659095的博客 764

MFC类的组织结构及主要的类简介

8.2.1 MFC类的组织结构     目前的MFC版本中包含了100多个类,不同的类实现不同的功能,类之间既有区别又有联系。MFC同时还是一个应用程序框架,它帮助定义应用程序的结构以及为应用程序处理许多杂务,事实上,MFC封装了一个程序操作的每一个方面。在MFC程序中,程序员很少需要直接调用Windows API函数,而是通过定义MFC类的对象并通过调用对象成员函数来实现相应的功能。    

gongzhitank的博客 6980

VC++ MFC 实现 MDI 静态切分窗口实例

MDI(Multiple Document Interface,多文档界面)是一种用户界面设计范式,允许在同一应用程序窗口内打开和管理多个文档窗口。这在需要同时查看或编辑多个文件的软件中非常常见,如文本编辑器、图像编辑器以及各种办公应用程序。MFC是Microsoft公司为简化Windows应用程序开发而提供的一个类库框架。它首次发布于1992年,作为Visual C++开发环境的一部分,起源于C++和Win32 API的直接封装。

weixin_34163588的博客 1265

MFC 获取 主程序所在目录

CString sPath; CFileFind Cfind; GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH); sPath.ReleaseBuffer(); int nPos; nPos = sPath.ReverseFind ('\\'); sPath = sPath.Left (nPos); /...

mengqingbin5219的博客 872

应用程序的M F C类、支持窗口

在第2章中,我们将全面地讨论M F C提供的强大的功能。大多数M F C类是从三个M F C基 类( C O b j e c t、C W n d和C C m d Ta rg e t )派生来的。并讨论构成一个应用程序的M F C类、支持窗口 界面的M F C类、用来绘图的类、访问文件的类、维护数据和数据库的类和访问因特网 ( I n t e r n e t )的M F C类。 消息处理 在第3章中,我们将讨论一个M F C应用程序是怎样通过消息与外界及应用程序进行通信的。 还将讨论四种消息类型,并跟踪一个消息通过接收消息的类。最后将探讨该路径上的重定向 消息。 绘图 在第4章中,我们将讨论在窗口中绘图的方法,包括绘图工具、绘图用的颜色、在屏幕或 打印机上绘图、绘制位图和图标、绘制矩形和圆、绘制动画。

Comsol超声空化气泡仿真:从基础理论到工业应用实践

本文详细介绍了Comsol超声空化气泡仿真的基础理论及工业应用实践。通过解析超声空化现象、Comsol模型搭建流程及求解器优化技巧,帮助工程师掌握气泡仿真技术,提升超声波清洗和乳液制备等工业应用的效率与质量。

weixin_27966471的博客 253

CWinThread类用法详解+实例

转自:CWinThread类用法详解+实例_C的技术博客_51CTO博客

wwq222的专栏 1130

【智慧城市】GIS数据获取-获取道路/水路数据

【GIS数据获取】获取道路/水路数据

qq_16599281的博客 4751

MFC CWinThread Class成员变量及成员函数

一、概要        CWinThread类封装了对线程的操作,一个CWinThread对象代表在应用程序中一个线程的执行。在MFC应用程序中,主执行线程是CWinThread派生类CWinApp的派生类对象。由CWinApp类派生的新类都是用户界面线程。 二、类图位置          三、多线程的实现方法 四、CWinThread头文件 class CWinT

海纳百川,有容乃大。 1708

QT编程系列1--QT学习前需知

本周学习了一些QT编程方面的知识,学写了几个程序,这里把记录下来。一方面对前面学习的知识做一个总结,便于以后复习、再学习和应用;另一方面也和大家做个交流,有不足的地方请各位看官多指点。   首先是做一些学习之前的交代:一,学习QT需要哪些基础;二,学习QT有哪些用途,QT较其他的开发工具有哪些特点;三,学习QT的思路。

霜月孤鸟&RTEMS&TinyOS 1115

EC20模块实战:5步搞定MQTT连接阿里云IoT(附常见错误排查)

本文详细介绍了使用EC20 4G模块通过AT指令连接阿里云IoT平台的完整实战流程。文章以智能农业项目为背景,从硬件接线、网络注册、PDP激活,到MQTT连接配置、一型一密动态注册及数据收发,提供了清晰的5步操作指南,并重点附上了常见错误排查方法,帮助开发者快速实现稳定可靠的物联网设备上云。

weixin_29209801的博客 196

MFC主类说明[转]

1.CObject类为MFC总类,该类下面有一个重要的类CCmdTarget。而CCmdTarget类下面又有四个重要的继承类,分别为:CWinThread、CDocument、CDocTemplate、        CWnd类。所以,可以得出一个大概继承图,如图所示:               CObject--->CCmdTarget ---->CWinThread ---->CWin

狂人山庄 1517

从泛光成像到可寻址扫描:Flash激光雷达的车规级优势与技术演进

Flash激光雷达凭借固态架构优势成为自动驾驶感知技术的重要发展方向。该方案无机械部件,具备抗振动、长寿命等特点,同时CMOS工艺带来显著成本优势。但传统泛光式存在能量弥散问题,难以兼顾大视场和远距离探测。可寻址扫描技术通过分区点亮VCSEL阵列,有效提升局部能量密度,在保持固态可靠性的同时突破性能瓶颈。这种"电子扫描+分区点亮"的混合架构,使Flash激光雷达有望实现大视场、远距离、高可靠和低成本的多重突破,推动自动驾驶技术发展。

致力于lidar应用开发 235

C++ MFC视图和窗口的基本概念

视类窗口 视类窗口是指程序运行后,显示信息的那一部分。对应的类是CXXXView(XXX表示项目名称)类,CXXXView类是派生于CView类,而CView类又派生于CWnd类。他们的继承关系可以通过查找类的定义来查看继承关系。视图类CView,拥有窗口的客户区域,负责显示文档数据,接受用户的输入,提供文档与用户的通信。视类窗口只是主框架窗口中空白的部分。 主框架窗口 主框架窗口是指程序运...

Vermont_的博客 3476

实战避坑:基恩士KV8000 PLC与C#上位机链路通讯全流程实现(含ST代码+上位机源码)

本文详细讲解了基恩士KV8000 PLC与C#上位机的TCP链路通讯实现,从PLC端的ST代码编写、通讯配置,到上位机的通讯类封装、界面实现,再到实战避坑和性能优化,提供了完整的可复用方案。该方案已在实际产线项目中验证,支持实时数据采集和控制指令下发,稳定性和可靠性满足工业场景需求。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1177

【SpringBoot 3.x 第51节】带你玩转 GraalVM Native Image:启动快到飞起,内存省到心疼,你还不试试?

🏆本文收录于《滚雪球学SpringBoot 3》,专门攻坚指数提升,本年度国内最系统+最专业+最详细(永久更新)。    本专栏致力打造最硬核 SpringBoot3 从零基础到进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。 如果想快速定位学习,可以看这篇【SpringBoot3教程导航帖】,你想学习的都被收集在内,快速投入学习!!两不误。    若还想学习更多,可直接前往《滚雪球学SpringBoot(全版本合集)》,涵盖SpringBoot所有版本教学文章

**My Coding Family** 1305

duilib对MFC的支持

关注duilib很久了,前段时间刚好有个MFC项目,对UI要求比较高,苦于duilib是基于win32开发的,而我对win32只有皮毛的了解,只好试着看源代码,发现里面有MFC的一个Demo,但是编译通不过,无奈只好试着看作者的思路,经过几天的摸索,终于成功运用到MFC项目中。先上效果图,再解释: 上代码: 1.编写duilib的CWindowWnd类 class C

田群的专栏 4205

6.4 直流无刷电机(BLDC):测试与性能评估

本文系统阐述了直流无刷电机(BLDC)的测试与性能评估方法,涵盖参数测量、性能测试、测试平台设计及可靠性评估。详细介绍了绕组电阻、电感和反电动势的测量原理与修正方法,以及转矩-转速特性、效率分析和动态响应测试的技术要点。通过搭建高精度测功机系统,结合自动化数据处理,实现对电机性能的全面评估。最后讨论了温升、振动、EMC等特殊测试方法,为BLDC电机的设计验证和质量控制提供了完整的技术路径。

技术工作者 444

MFC编程入门之六(对话框:创建对话框模板和修改对话框属性)

本节开始为大家讲解偏向应用的知识——创建对话框。   对话框,大家应该很熟悉了,在我们常用的软件中大多都有对话框界面,例如,360安全卫士的主界面其实就是对话框,知识它做了很多美工 方面的工作,将其大大美化了。   创建对话框主要分为两大步:   第一,创建对话框资源,主要包括创建新的对话框模板、设置对话框属性和为对话框添加各种控件;   第二,生成对话框类,主要包括新建对话框类、添加控件...

acoolgiser的博客 3273

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

框架、文档、视图类之间的调用关系

在多文档MFC应用程序执行过程中,创建了多于一个的文档类、视图类、子框架类对象和一个主框架类、应用类对象。这些对象之间是通过一定的方式联系在一起的,在应用程序设计中,时常需要通过这些对象之间的关系来实现在文档、视图、框架类对象、应用程序类对象间相互引用和调用。如下: 1,视图类对文档类的使用 视图类对象的作用是在客户区显示文档类对象的内容,两者...

weixin_34119545的博客 127

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

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

【MFC】模拟采集系统——图形按钮(18)

MFC扩展、图形按钮、动态添加窗口资源对象

yixiaobo2001的博客 842

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

MFC解压zip类使用说明

MFC解压zip类使用说明 去发现同类优质开源项目:https://gitcode.com/ 简介 本仓库提供了用于MFC(Microsoft Foundation Class)环境下解压zip格式文件的类。资源文件包含两个主要的类:zip和unzip。这两个类可以方便地在Visual Studio 2013环境下编译和运行。 文件说明 MFC解压zip类.rar:包含了用于解压zip文件的MF...

gitblog_06732的博客 715

MFC类中获得其他类指针

当用visual   c++的Application   Wizard生成除了以外的应用程序时,将自动产生视图类,文档类,主帧窗口类,应用程序类等等. 一般说来,程序的核心数据及操作在文档类中实现.跟界面有关的数据及操作在视图类中实现.当需要 在某个类中使用不属于该类的数据时,必须要取得概述据所属的类的指针.从视图类获得文档类的指针 是很容易的,用GetDocument()即可,这在一般的MFC文...

weixin_34019929的博客 152

MFC类说明

①CObject类:CObject是MFC的根类,绝大多数MFC类是其派生的,CObject 实现了一些重要的特性,包括动态类信息、动态创建、对象序列化、对程序调试的支持,等等。CObject定义了一个CRuntimeClass类型的静态成员变量:CRuntimeClass classCObject,还定义了几组函数:构造函数析构函数类,诊断函数,与运行时类信息相关的函数,与串行化相关的函数。其中...

mxdxm8899的专栏 189

MFC笔记(一):一个对话框类调用(访问)另一个对话框类的成员变量

MFC笔记(一):一个对话框类调用(访问)另一个对话框类的成员变量 MFC中一个对话框类CDailog1要访问另外一个对话框类CDailog2对象的成员变量,这就需要获得对话框类CDailog2的对象的指针,有好几种方法可以实现,如维护一个单例模式、设置静态变量等。 本文设置以静态变量的方法为例,实现对两个对话框之间数据访问。 一、创建MFC对话框程序 1.首先创建一个MFC对话框应用程序,命名为...

闫小亘的博客 8387
上一篇: MIDI 音乐不出声的原因
下一篇: 对HTTP协议的头信息详解
DavidHsing
博客等级 码龄19年 782粉丝 127原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值