Windows图形界面(GUI)-MFC-C/C++ - MFC项目工程框架解析

  • 公开视频 -> 链接点击跳转公开课程
  • 博客首页 -> e​​​​​​链接点击跳转博客主页

目录

MFC项目

项目选择

配置安装

程序引导

MFC框架

环境设置

程序框架

代码编写

MFC解析

程序入口

执行流程

代码结构

应用程序类

窗口框架类

消息处理

消息类型

消息处理

处理机制


MFC项目

项目选择

配置安装

程序引导

MFC框架

环境设置

  • 创建空项目
  • 源文件必须设置为CPP格式后缀
  • 链接器 - 系统 - 设置窗口
  • 配置属性 - 高级 - 设置MFC使用
程序框架
  • MFC头文件
  • 应用程序对象
    • MFC应用程序是基于CWinApp类(应用程序对象)。
    • CWinApp提供了消息循环来检索消息并将消息调度给应用程序的窗口。
    • MFC程序有且只能有一个应用程序对象,对象必须声明在全局范围内有效。
  • CWinApp::InitInstance
    • InitInstance是CWinApp中的虚函数,默认执行操作为返回真,通过返回值决定程序是否正常执行。
    • InitInstance目的是为应用程序提供一个初始化的入口。
代码编写
#include <afxwin.h>class CMyApp : public CWinApp
{
public:virtual BOOL InitInstance();
};class CMainWindow : public CFrameWnd
{
public:CMainWindow();
};CMyApp myApp;BOOL CMyApp::InitInstance()
{m_pMainWnd = new CMainWindow;m_pMainWnd->ShowWindow(m_nCmdShow);m_pMainWnd->UpdateWindow();return TRUE;
}CMainWindow::CMainWindow()
{Create(NULL, _T("The Hello Application"));
}

MFC解析

程序入口
  • 控制台程序 - main
  • 动态链接库 - DllMain
  • 应用程序类 - WinMain
  • 驱动程序类 - DriverEntry
  • MFC - AfxWinMain
执行流程

  • 全局应用程序类对象实例化初始。
  • 通过afxWinMain完成初始化(InitInstance)。
  • InitInstance中创建窗口类对象触发构成函数完成窗口创建。
  • 创建窗口成功后将数据保存在m_pMainWndz。
  • 通过窗口类显示以及更新窗口。
代码结构

  • 应用程序类
    • 每个MFC应用程序都必须至少有一个派生自CWinApp的类的实例,该实例代表了应用程序本身。
    • CWinApp类处理应用程序的启动、初始化、运行和退出。
    • InitInstance(): 这是一个必须由派生类重写的虚拟函数。它在应用程序启动时被自动调用,并且是初始化应用程序的主要函数。
    • Run(): 开始应用程序的消息循环。
    • ExitInstance(): 在应用程序退出前被调用,用于清理资源。
    • m_pMainWnd: 指向应用程序的主窗口的指针。
  • 窗口框架类
    • CFrameWnd类代表了一个标准的窗口框架,包括标题栏、菜单栏、工具栏以及状态栏等。
    • 在MFC中,大多数应用程序的主窗口都是从CFrameWnd类派生出来的。
    • LoadFrame(): 根据资源ID加载窗口框架并初始化。
    • Create(): 手动创建窗口框架。
    • PreCreateWindow(): 在窗口创建之前调用,可以修改窗口创建的样式。
    • OnCreate(): 在窗口创建时调用,可以在此添加额外的初始化代码,如创建工具栏和状态栏。
消息处理

  • 消息类型
    • 窗口消息(Window Messages):如WM_LBUTTONDOWNWM_KEYDOWN等,通常由窗口过程处理。

    • 命令消息(Command Messages):如菜单项、工具栏按钮的点击,消息ID以WM_COMMAND形式出现。

    • 控件通知消息(Control Notification Messages):如按钮点击、列表框选择等,通常由父窗口处理。

    • 自定义消息:开发者可以定义自己的消息,并使用SendMessagePostMessage发送。

  • 消息处理
    • MFC的消息处理机制是基于消息映射(Message Map)的,它允许开发者将特定的Windows消息映射到特定的成员函数(称为消息处理函数)上。

  • 处理机制
    • DECLARE_MESSAGE_MAP是一个宏,它必须在MFC类的头文件中声明,以便MFC框架能够识别该类具有消息映射。

    • BEGIN_MESSAGE_MAPEND_MESSAGE_MAP宏来定义消息映射。

      • BEGIN_MESSAGE_MAP宏接受两个参数:当前类的名称和基类的名称。

      • END_MESSAGE_MAP宏标记消息映射的结束。

  • 代码示例
  • #include <afxwin.h>class CMyApp : public CWinApp
    {
    public:virtual BOOL InitInstance();
    };class CMainWindow : public CFrameWnd
    {
    public:CMainWindow();DECLARE_MESSAGE_MAP()afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
    };CMyApp myApp;BOOL CMyApp::InitInstance()
    {m_pMainWnd = new CMainWindow;m_pMainWnd->ShowWindow(m_nCmdShow);m_pMainWnd->UpdateWindow();return TRUE;
    }CMainWindow::CMainWindow()
    {Create(NULL, _T("0xCC"));
    }BEGIN_MESSAGE_MAP(CMainWindow, CFrameWnd)ON_WM_LBUTTONDOWN()
    END_MESSAGE_MAP()void CMainWindow::OnLButtonDown(UINT nFlags, CPoint point)
    {// TODO: 在此添加消息处理程序代码和/或调用默认值}
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/48850.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

异步TCP服务器;异步TCP客户端

目录 1. 异步TCP服务器 2. 异步TCP客户端 3. 其他模块的使用 在Python中,使用os, asyncio, typing, socket, 和 random等模块可以实现很多功能,比如异步网络通信、文件操作、随机数生成等。下面,我将基于这些模块给出一个简单的异步TCP客户端和服务器示例,同时解释这些模…

ML.Net 学习之使用经过训练的模型进行预测

什么是ML.Net&#xff1a;&#xff08;学习文档上摘的一段&#xff1a;ML.NET 文档 - 教程和 API 参考 | Microsoft Learn 【学习入口】&#xff09; 它使你能够在联机或脱机场景中将机器学习添加到 .NET 应用程序中。 借助此功能&#xff0c;可以使用应用程序的可用数据进行自…

【Go程序】爬虫获取豆瓣Top250

之前在网上下载了一个minigame的开源项目&#xff0c;就是电影日历。里面有一项使用了豆瓣的API&#xff0c;获取豆瓣的Top250的电影。但是由于豆瓣的OpenAPI改版了&#xff0c;又不好申请到OpenAPI的资格&#xff0c;想想也不是什么非法的事情&#xff0c;就稍微搞几部电影名字…

Mojo模型魔法:动态定制特征转换的艺术

标题&#xff1a;Mojo模型魔法&#xff1a;动态定制特征转换的艺术 在机器学习领域&#xff0c;模型的灵活性和可扩展性是至关重要的。Mojo模型&#xff08;Model-as-a-Service&#xff09;提供了一种将机器学习模型部署为服务的方式&#xff0c;允许开发者和数据科学家轻松地…

一个简单好用安全的开源交互审计系统,支持SSH,Telnet,Kubernetes协议(带私活)

前言 在当今的企业网络环境中&#xff0c;远程访问和交互审计成为了保障网络安-全的重要组成部分。然而&#xff0c;现有的解-决方案往往存在一些痛点&#xff0c;如复杂的配置、有限的协议支持、以及审计功能的不足。这些问题不仅增加了IT管理员的负担&#xff0c;也为企业的…

【大数据专题】Flink题库

1 . 简述什么是Apache Flink &#xff1f; Apache Flink 是一个开源的基于流的有状态计算框架。它是分布式地执行的&#xff0c;具备低延迟、高吞吐的优秀性能&#xff0c;并且非常擅长处理有状态的复杂计算逻辑场景 2 . 简述Flink 的核心概念 &#xff1f; Flink 的核心概念…

基于R语言复杂数据回归与混合效应模型【多水平/分层/嵌套】技术与代码

回归分析是科学研究特别是生态学领域科学研究和数据分析十分重要的统计工具&#xff0c;可以回答众多科学问题&#xff0c;如环境因素对物种、种群、群落及生态系统或气候变化的影响&#xff1b;物种属性和系统发育对物种分布&#xff08;多度&#xff09;的影响等。纵观涉及数…

HarmonyOS NEXT零基础入门到实战-第四部分

自定义组件: 概念: 由框架直接提供的称为 系统组件&#xff0c; 由开发者定义的称为 自定义组件。 源代码&#xff1a; Component struct MyCom { build() { Column() { Text(我是一个自定义组件) } } } Component struct MyHeader { build() { Row(…

路由器ip地址脱机是什么意思?怎么应对

在数字化时代&#xff0c;路由器作为家庭或企业网络连接的核心设备&#xff0c;其稳定性和连通性对于我们的网络体验至关重要。然而&#xff0c;有时我们可能会遇到路由器IP地址显示脱机的情况&#xff0c;这不仅影响了我们的网络访问&#xff0c;还可能对工作和娱乐造成不便。…

【C语言】 约瑟夫环,循环链表实现

1、循环链表实现约瑟夫环&#xff0c;每次经过特定步数删除一个元素 //looplist.h #ifndef LOOPLIST_H #define LOOPLIST_H #include<stdio.h> #include<string.h> #include<stdlib.h>typedef int datatype;typedef struct Node {union {int len;datatype d…

Elasticsearch:Java ECS 日志记录 - log4j2

ECS 记录器是你最喜欢的日志库的格式化程序/编码器插件。它们可让你轻松将日志格式化为与 ECS 兼容的 JSON。ECS 兼容的 JSON 日志记录可以帮我们简化很多分析&#xff0c;可视化及解析的工作。在今天的文章里&#xff0c;我来详述如何在 Java 应用里生成 ECS 相兼容的日志。 …

tensorflow keras Model.fit returning: ValueError: Unrecognized data type

题意&#xff1a;TensorFlow Keras 的 Model.fit 方法返回了一个 ValueError&#xff0c;提示数据类型无法识别 问题背景&#xff1a; Im trying to train a keras model with 2 inputs: an image part thats a tf.data.Dataset and a nor mal part represented by a pd.DataF…

oracle 两行完全相同怎么比较

在Oracle数据库中&#xff0c;要比较两行数据是否完全相同&#xff0c;即比较这两行在所有列上的值是否都相等&#xff0c;可以通过编写SQL查询语句来实现。以下是一些常用的方法&#xff1a; 方法一&#xff1a;使用子查询和EXISTS 这种方法通过子查询来检查是否存在与当前行…

Mojo模型动态批处理:智能预测的终极武器

标题&#xff1a;Mojo模型动态批处理&#xff1a;智能预测的终极武器 在机器学习领域&#xff0c;模型的灵活性和可扩展性是至关重要的。Mojo模型&#xff08;Model-as-a-Service&#xff09;提供了一种将机器学习模型部署为服务的方式&#xff0c;允许开发者和数据科学家轻松…

ActiViz控件解析及C#实践指南

文章目录 1. vtkSliderWidget2. vtkRotateWidget3. vtkButtonWidget4. vtkTextWidget5. vtkImplicitPlaneWidget26. vtkScalarBarWidget7. vtkImageSliceWidget8. vtkHandleWidget9. vtkPointPickerWidget10. vtkSeedWidget1. vtkSliderWidget 功能介绍 vtkSliderWidget是VTK中…

【中项】系统集成项目管理工程师-第4章 信息系统架构-4.5技术架构

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

数据结构之判断平衡二叉树详解与示例(C,C++)

文章目录 AVL树定义节点定义计算高度获取平衡因子判断是否为平衡二叉树完整示例代码结论 在计算机科学中&#xff0c;二叉树是一种非常重要的数据结构。它们被广泛用于多种算法中&#xff0c;如排序、查找等。然而&#xff0c;普通的二叉树在极端情况下可能退化成链表&#xff…

动态特征转换的艺术:在Mojo模型中实现自定义变换的策略

动态特征转换的艺术&#xff1a;在Mojo模型中实现自定义变换的策略 在机器学习中&#xff0c;特征转换是数据预处理的关键步骤&#xff0c;它直接影响模型的性能和结果的准确性。Mojo模型&#xff0c;作为一种高效的模型部署形式&#xff0c;允许在不同环境中运行模型并进行预…

C#基于SkiaSharp实现印章管理(4)

前几篇文章实现了绘制不同外形印章的功能&#xff0c;印章内部一般包含圆形、线条等形状&#xff0c;有些印章内部还有五角星&#xff0c;然后就是各种样式的文字。本文实现在印章内部绘制圆形、线条、矩形、椭圆等四种形状。   定义FigureType枚举记录印章内部形状&#xff…

图像处理 -- ISP调优(tuning)的步骤整理

ISP调优流程培训文档 1. 硬件准备 选择合适的图像传感器&#xff1a;根据项目需求选择合适的传感器型号。搭建测试环境&#xff1a;包括测试板、光源、色彩卡和分辨率卡等。 2. 初始设置 寄存器配置&#xff1a;初始化传感器的寄存器设置&#xff0c;包括曝光、增益、白平衡…