MFC的架构方法

MFC的运行过程分析 MFC程序的运行细节剖析        MFC程序也是Windows程序,所以它应该也有一个WinMain,但是在程序中看不到它的踪影。其实在程序进入点之前,还有一个(而且仅有一个)全局对象(theApp),这就是所谓的Application object,当操作系统将程序加载并激活时,这个全局对象获得配置,其构造函数会先执行,比WinMain更早。 一 CWinApp取代WinMain   阅读详情
一、WinMain()函数在哪儿

因为看不到WinMain()函数,许多初学者不知道程序究竟从哪儿开始,编程从哪儿下手,编写的代码何时运行等等,另外,还有很多看不懂的语句,最大的困难恐怕还是MFC的编程思想不太理解。各位既然选择小雅的教程来学习MFC,小雅就有责任将每一个你不明白的地方剖析清楚,因为小雅自己也曾为此而烦恼了几年。不过,饭还得一口一口地吃,最好的办法是先照葫芦画瓢,从容易的入手,再一步一步地深入。

MFC把千篇一律的WinMain()函数写在①crtexec.c中,在编译完后链接时才组装到你的exe程序中。运行时,这个WinMain()函数调用MFC的全局函数AfxWinMain(),这个全局函数AfxWinMain()是写在②appmodul.cpp中的。在AfxWinMain()函数中做三件事,③注册窗口类、④调用应用程序类的初始化函数InitInstance()、⑤调用应用程序类的Run()函数(实际上是父类的父类CWinThread的Run()成员函数)。

上面这个Run()函数中包含消息循环,而InitInstance()函数又将框架类、文档类、视图类结合在一起,于是所有的类全部集成起来了。编程的重点在文档类和视图类,什么样的消息,执行什么样的处理函数,这样就有效地将数据和控制分离开来。

二、消息处理

消息处理的回调函数在mfc70d.dll中的CWnd::WindowProc(...),由上面讲的Run()函数调用,然后在主应用程序类、框架类、文档类、视图类里面接受这些消息并处理。问题是:某一消息究竟在哪个类里面处理?

与窗口有关的消息(即以“WM_”开头的消息),只能在框架类和视图类中处理;来自菜单或工具条的命令事件,则框架类、视图类、主应用程序类、文档类全部可以处理,究竟在哪个类中处理,根据具体情况再决定在哪个类中处理。这其中有优先级别高低的问题,一个类接受到命令消息时,先传给比自己级别高的类,如果未处理再自己处理。如果自己也不处理,则传给比自己级别低的类。

这个优先级别是:视图类>文档类>文档模板类>框架类>主应用程序类。例如,框架类收到“编辑”菜单的“Clear All”命令消息时,首先传给视图类,如果视图类处理便结束,否则就传给文档类。如果文档类处理便结束,否则就传给文档模板类。如果文档模板类处理则结束,否则就回到了框架类。如果框架类处理则结束,否则就传给主应用程序类。如果主应用程序类还不处理,就回到MFC缺省的处理程序中。

三、添加、删除消息处理

添加一个消息处理,一般要改动三个地方,以WM_LBUTTONDOWN消息为例,①在视图类的定义(test2View.h)中添加一个成员函数,②在视图类(test2View.c)中添加一条消息映射,③在视图类(test2View.c)中实现消息处理的成员函数。

// test2View.h : Ctest2View 类的接口

......(省略)

// 生成的消息映射函数
protected:
    DECLARE_MESSAGE_MAP()
public:
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
};

......(省略)
// test2View.cpp : Ctest2View 类的实现
//

#include "stdafx.h"
#include "test2.h"

#include "test2Doc.h"
#include "test2View.h"
#include "./test2view.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// Ctest2View

IMPLEMENT_DYNCREATE(Ctest2View, CView)

BEGIN_MESSAGE_MAP(Ctest2View, CView)
    // 标准打印命令
    ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
    ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
    ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
    ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()

......(省略)

// Ctest2View 消息处理程序

void Ctest2View::OnLButtonDown(UINT nFlags, CPoint point)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    AfxMessageBox("劝学网 http://www.quanxue.cn/", MB_OK);

    CView::OnLButtonDown(nFlags, point);
}

上面虽然很简单,但不建议手动添加,应该在“类视图”中选中“Ctest2View”,再在“属性”工具中选择“WM_LBUTTONDOWN”消息,同时选上“OnLButtonDown”后回车就可以了。

用同样方法在“属性”工具中删除“WM_LBUTTONDOWN”消息时,前面添加的三处代码将被用“//”注释在那儿,成了“垃圾”代码。这时最好手动删除一下这三处“垃圾”代码。

四、程序的入口

学过C++语言或Java语言的人都明白,类相当于自定义的数据类型,如果没有实例,自身是不会运行的。那么,上面一直在解说这4个类,当前生成的5个.cpp文件中,WinMain启动后究竟先运行什么语句,后运行什么语句?

要明白MFC的细节,除了C++的基础之外,最好学一点SDK编程,了解Win32编程中的基本内容。小雅在SDK教程中的第1章到第3章的内容请参考。MFC生成的4个类中,主应用程序类是从CWinApp类继承的,作用相当于WinMain程序;CMainFrame是从CFrameWnd类继承的,其作用相当于WndProc程序。也就是说,消息首先由框架类接受,然后按优先顺序传给其它的类。文档类和视图类由消息来驱动(视图类的PreCreateWindow()除外)。

主应用程序类的程序test2.cpp中,跳过消息映射以及类的构造函数、成员函数后,实际只剩下1条语句,即“Ctest2App theApp;”,这便是整个应用程序的总入口。MFC的crtexec.c的WinMain()函数调用test2.cpp中的“Ctest2App theApp;”。theApp是类的实例,自然也是必然要调用主应用程序类的构造函数,包括父类的构造函数,之后再调用MFC的appmodul.cpp中的AfxWinMain()函数,由AfxWinMain()函数调用主应用程序类的InitInstance()成员函数。

在主应用程序类的InitInstance()成员函数中,定义了框架类、文档类、视图类的实例,从而间接地调用了框架类的PreCreateWindow()和OnCreate()成员函数,由OnCreate()函数再调用视图类的PreCreateWindow()成员函数。然后再回到主应用程序类的InitInstance()成员函数中,执行“m_pMainWnd->ShowWindow(SW_SHOW);”和“m_pMainWnd->UpdateWindow();”。

MFC多语言实现的两种方法 前不久由于工作需要,用新工具Passolo制作软件的英文版,顺便回顾了一下以前一直用的老方法--动态加载英文资源的DLL。今天有空整理了一下,与大家分享两种方法是如何实现软件多语言的。 方法一:动态加载英文资源的DLL 首先我们的把工程属性下的“MFC的使用”设置成为“在共享DLL中使用MFC”,如下图所示: 这样我们待会就可以把英文资源的DLL给动态加载进来了,不然后面DLL是不能动态 阅读详情

相关推荐

MFC有三个选项:MFC ActiveX控件、MFC应用程序、MFC DLL,如何选择?

标准控件:这些是由操作系统或开发框架预定义的控件,如按钮、文本框等。它们通常是现成的,可以直接使用并提供基本的用户界面功能。自定义控件:这些是开发人员根据特定需求创建的控件,可以扩展标准控件的功能或提供全新的功能和外观。MFC ActiveX控件:选择这个选项如果您需要创建一个可嵌入到其他应用程序中的控件。MFC应用程序:选择这个选项如果您需要创建一个独立的Windows桌面应用程序。MFC DLL:选择这个选项如果您需要创建一个动态链接库以便其他应用程序调用,或者实现插件功能。

深耕CV 2785

MFC 程序执行流程

MFC 程序执行流程分析

qq_61553520的博客 2090

MFC中实现数据与界面分离的架构设计

在现代软件工程中,数据与界面分离已成为构建可维护、可扩展应用程序的核心设计理念之一。这一思想通过将业务逻辑(数据处理)与用户交互(界面展示)解耦,显著提升系统的模块化程度。传统MFC开发中常将数据存取、状态管理与控件操作混杂于对话框类中,导致代码臃肿、难以测试与复用。采用分离架构后,如文档/视图模式或MVC变体,可实现模型独立演化,视图按需更新。该设计不仅支持并行开发——前端专注UI体验,后端聚焦数据一致性,还为自动化单元测试和跨平台迁移提供便利。本章为后续深入探讨MFC框架内的具体实现机制奠定理论基础。

weixin_36303807的博客 805

MFC程序运行流程

MFC程序运行流程1.0 程序启动,CXXApp中的全局变量定义:CXXApp theApp,调用CWinApp()构造函数(将theApp对象的地址分别保存到线程状态信息和模块状态信息中);调用CXXApp()构造函数  1.1 进入WinMain函数,调用AfxWinMain(_tWinMain为宏,值为WinMain)  1.2 AfxWinMain函数的执行      1.2.1 获取th...

yuanxue_vaq的博客 800

易语言程序中MFC图标的替换方法

本文还有配套的精品资源,点击获取 简介:易语言是一种支持中文的编程工具,旨在简化编程过程。易语言程序默认图标易于识别,但可替换为更具个性的MFC图标。MFC是微软的面向对象的C++类库,用于创建Windows应用程序,图标作为界面重要元素,对程序的美感和用户体验有直接影响。本文介绍如何使用MFC图标替换易语言程序中的默认图标,包括准备图标资源、修改易语言项目设置、保存、编译...

weixin_42584586的博客 1494

智能解决装箱问题:使用优化算法实现高效包装

装箱问题(Bin Packing Problem)是组合优化领域中的一个经典问题,主要涉及如何将一系列对象高效地装入有限数量的容器(或“箱”)中,同时满足特定的约束条件。这个问题的目标是最小化所需使用的箱子数量或者最大化箱子的装载效率,以减少空间或资源的浪费。

MindOpt_003的博客 5548

MFC程序的启动过程

我们在Win32中知道一个Windows窗口程序需要在主函数中经过注册窗口、创建窗口、显示窗口、消息循环、窗口的消息处理函数进行消息处理五个部分进行实现的。但是在MFC生成的的函数中我们没有见到主函数,但我们却能够创建窗口、处理消息。那么,它是如何执行的呢。接下类让我们揭盖MFC的神秘面纱,了解MFC的启动过程。...

qq_43725310的博客 1857

安信可TB蓝牙模组系列 实战Ble Mesh智能照明系统搭建

本文详细介绍了如何使用安信可TB蓝牙模组系列搭建Ble Mesh智能照明系统。从硬件准备、固件烧录到手机APP组网全流程,提供了实战步骤和优化建议,特别适合智能家居开发者入门。Ble Mesh的自组网能力解决了蓝牙传输距离限制,实现全屋灯光智能控制。

weixin_30856725的博客 353

《MFC编程》:MFC程序执行流程

《MFC编程》:MFC程序执行流程

ProgramNovice的博客 784

PCIe设备内存访问实战:从ioremap到DMA映射的完整流程解析

本文深入解析了PCIe设备内存访问的完整流程,涵盖从CPU通过ioremap访问设备寄存器,到设备通过DMA映射高效读写主机内存的核心机制。详细探讨了虚拟地址、物理地址与总线地址的转换关系,对比了一致性与流式DMA映射的适用场景及同步要点,并阐述了IOMMU在安全与效率中的作用,为驱动开发者提供了实战代码与关键陷阱分析。

weixin_29201933的博客 506

ADS笔记,新旧两组仿真数据进行绘图和列表对比

原理图器件参数的不同,怎么进行对比观看,操作如下。

彭辉荣的博客 3869

MFC框架各部分指针获取方式

MFC框架各部分指针获取方式                                        摘自:http://www.cnblogs.com/duguguiyu/archive/2007/06/22/792511.html前人在优快云总结的,曾经帮助过我,整理总结一下,希望也能帮助一下别人。      获得CWinApp

270

[dprecated]第五章:TTM分析: 5.1 TTM设计目标和核心概念

TTM是Linux DRM框架下的通用显存管理模块,其复杂性源于需要满足多样化的显存管理需求。该文解析了TTM的核心结构体及其关系:ttm_device作为顶层管理者,包含多个ttm_resource_manager处理不同类型内存;ttm_buffer_object为核心对象,通过ttm_resource关联物理资源;其他组件如ttm_tt管理页表、ttm_pool优化分配效率。文章强调理解这些结构体关系是掌握TTM机制的基础,并建议国产芯片开发者参考这些功能需求。

图形/计算GPU的驱动与虚拟化技术分享园地 2128

MFC单文档程序架构解析

原文在这里:http://www.cnblogs.com/HappyXie/archive/2011/05/06/mfc.html   这里我以科院杨老师的单文档程序来分析一下MFC单文档的程序架构,纯属个人见解,不当之处烦请指教! 首先我们了解到的是   图(一) theApp 是唯一一个在程序形成的时候就存在的全局变量,它属于CstockAppApp类,而C

ylluo_hust的专栏 752

YOLOv8-Pose 姿态识别 RK3588 实战:从模型训练到 RKNN 部署,精度与推理速度双提升

本教程从YOLOv8-pose模型的姿态识别训练,到RK3588的边缘量化部署,为你打造了一套“高精度+高实时性+低成本”的人体姿态分析解决方案。无论是健身动作纠正、智能安防行为检测,还是工业人员姿态监控,这套技术都能直接复用——你只需替换数据集与业务逻辑,即可快速落地专属的边缘AI姿态识别系统。如果你在实践中遇到任何卡点,欢迎随时交流。记住,人体姿态识别的价值在于“关键点准、推理快、部署易”,而这三者的平衡,正是你通过本教程能掌握的核心能力。

FJN110的博客 364

【即插即用模块】注意力篇 | ECCV 2024 | DPB:高低频动态分离+双提示融合,PSNR直冲40+!

本文提出了一种基于频率提示的图像恢复方法FPro,通过动态滤波器分离输入特征的高低频分量,并采用双提示块(DPB)进行频域专属提示生成与调制。DPB包含低频提示调制器(LPM)和高频提示调制器(HPM),分别处理不同频段信号,通过生成提示组件并融合解码器特征来优化恢复效果。实验表明,该方法在U型结构中表现优异,尤其适用于分割、底层视觉和多模态任务。模块通过动态无监督频率分离、频域专属提示生成和适配性融合机制,有效解决了传统方法对频域信息关注不足的问题,显著提升了图像恢复质量。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 147

MFC创建、调用Dll的方法

1. MFC创建DLL 1. 打开VS,新建项目,选择“MFC动态链接库”,点击“下一步”。 2. 设置项目名,路径等参数,点击“创建”。 3. 选择“静态链接到MFC的规则DLL”->“完成”。 4. 以上步骤就将MFC Dll动态库的编译环境配置好了, 然后编写需要导出的函数,在MyDll.cpp中写入函数的实现: extern "C" __declspec(dllexport) int MyAdd (int a, int b) { return (a + b); }..

qq_35522310的博客 1万+

yolov5直接调用zed相机实现三维测距(python)

zed代码比较简洁,但是一定要把环境配置好,后续自己会把他当做普通双目标定,去对比分析效果,并完善相关功能。

积极向上的mr.d的博客 1万+

VS2017编写MFC库以及使用Qt调用MFC库方法

若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.youkuaiyun.com/qq21497936 本文章博客地址:https://blog.youkuaiyun.com/qq21497936/article/details/95052025 目录 前言 Demo 使用VS7建立MFC动态链接库 前提:需要安装VS中的MFC环境 建立MFC动态链接库 编写测试函数 动态库所需...

长沙红胖子 Qt・西安|省级科研团队从业背景,深耕双一流体系高精尖技术配套研发|剥离高精尖机理,沉淀高端特种行业领域 Qt 工程化落地经验|博文仅分享通用技术总结,输出公开普适工程思路。 5万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

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

MFC中创建和使用线程的方法

有关创建线程的问题有三种方法: 1.C语言函数,调用_beginthread(); 2.API函数,调用CreateThread(); 3.MFC函数,调用AfxBeginThread(); 推荐使用MFC函数AfxBeginThread(); 利用MFC里的AfxBeginThread函数能很方便地创建线程以及对线程进行等待、唤醒等操作。 1、函数原型 CWinThread* AfxBeg...

u011555996的博客 1万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

采集MFC软件的数据方法记录

本文记录了通过MFC程序与C#控制台实现数据采集和串口通信的技术方案。MFC部分详细说明了应用程序创建、窗口框架和消息映射机制,并实现Socket客户端功能与C#通信;C#控制台程序采用多线程方式,同时处理MFC数据接收和Modbus RTU串口通讯。方案整体实现了跨语言数据采集与传输,为工业控制系统开发提供参考。

qq_46057792的博客 1303

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

MFC之画线方法

MFC之画线方法: 1新建一个单文档MFC,默认设置 2认识类文件 新类有 CDLine,:画线时的线类,线要素:起点,终点,线宽,颜色的三原色 Cline:全局变量存储类,可用可不用ClAttribute:设置属性对话框类,设置属性对话框对应的类,一个对话框就要绑定一个类,设置宽、颜色,4个成员变量,公有的,int型 认识本身有的类,其他的类,这里不会用只讲DrawV

cnhk3921的博客 1万+

MFC线程退出方法

MFC使用AfxBeginThread创建线程退出方法: CWinThread * myThread; //线程 bool isThreadBegin = false; //线程退出/执行控制 //创建线程 void CDlg::OnButtonCreateThread() { isThreadBegin = thue; //运行线程...

zhangyao7751的博客 8770

MFC 获得各类指针、句柄的方法

最近有些人在问MFC编程一些要点,有一些句柄的获取、指针的获取是常见的问题,本文将对这些问题做以解释,参考了前人的笔录(见reference),希望能够帮助大家更方便地进行MFC程序开发。        一般我们使用的框架是VC提供的Wizard生成的MFC App Wizard(exe)框架,无论是多文档还是单文档,都存在指针和句柄获取和操作问题。本文中将针对各类句柄的获得、指针的获得以及M

Rachel Zhang的专栏 4万+

用openCV在MFC窗口显示图像的方法总结

openCV是一个专业的开源图像处理和显示库,用起来非常方便,但界面设计功能一般。OpenCV与MFC结合进行图像显示是一个不错的选择。 OpenCV与MFC结合绘图的方法主要有: 1)将OpenCV窗口附着到MFC窗口 基本方法是,独立创建openCV显示窗口,并在MFC的窗口界面上设置一个与之对应的绘图控件,设置该控件为opwnCV显示窗口的父窗口,并使它们的位置、大小相同。代码如下: ...

lixuejun2008的博客 2649
上一篇: 指令使用规则
下一篇: 关于windows服务的编程方法
tomorrowsprogress
博客等级 码龄20年 16粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值