MFC应用程序开发教程1

简介: MFC应用程序开发教程1

以下为本人学习笔记
原视频:黑马程序员MFC教程

一、基础概念

  1. SDK:软件开发工具包(Software Development Kit),第三方工具
  2. API:Windows擦欧总系统提供给应用程序编程的接口
  3. 窗口:一个Windows应用程序至少有一个窗口,称为主窗口。是Windows应用程序与用户进行交互的接口。两种窗口:子窗口和父窗口;窗口由两部分构成:客户区和非客户区窗口
  4. 句柄(HANDLE):Windows程序中,有各种各样的资源(窗口、图标、光标、画刷等),系统在创建这些资源时会为他们分配内存,并返回标识这些资源的标识号,即句柄
  5. WinMain函数:当Windows操作系统启动一个程序时,他调用的就是该程序的WinMain函数(实际是由插入到可执行文件中的启动代码调用的)。WinMain是Windows程序的入口点函数,当WinMain函数结束或返回时,Windows应用程序结束
  6. Windows编程模型:

1 WinMain函数的定义
2 创建一个窗口
3 进行消息循环
4 编写窗口的过程函数

二、创建MFC窗口

一个简单的MFC程序:
一个简单的MFC程序

  1. 因为MFC是由C++编写的,编写MFC程序需要包含#include<afxwin.h> 头文件
  2. 自定义类MyApp继承于CWinApp应用程序类;MyApp app应用程序对象,有且仅有一个
  3. 程序入口InitInstance
  4. 入口中创建窗口
  5. 窗口类MyFrame继承于CFrameWnd
  6. MyFrame构造中 Create(NULL, 窗口名称)
  7. 创建窗口对象
  8. 显示和更新
  9. m_pMainWnd=frame保存指向应用程序的主窗口的指针(一种绑定,规定循环监听哪个窗口的消息)
  10. return True

三、消息映射机制

消息映射是一个将消息和成员函数相互关联的表。
将消息映射添加到一个类中的流程:

  1. 在所操作的类中,声明消息映射宏
  2. 通过放置标识消息的宏来执行消息映射,相对的类将在对BEGIN_MESSAGE_MAP和END_MESSAGE_MAP的调用之间处理消息

消息映射机制1、2

  1. 对应消息处理函数分别在类中声明,类外定义

消息映射处理机制的实现3

消息映射机制总结:

  1. 声明宏,写到.h中
  2. 分界宏,写到.cpp中
  3. 消息宏,写到分界宏中间
  4. 消息处理函数原型,声明到.h中
  5. 消息处理函数实现,写到.cpp中

四、MFC框架中一些重要的函数

  1. CtestAPP-InitInstance()

应用程序类的一个虚函数,MFC应用程序入口

  1. CMainFrame-PreCreateWindow()

当框架调用CreateEx函数创建窗口时,会首先调用PreCreateWindow函数。通过修改传递给PreCreateWindow的结构体类型参数CREATESTRUCT,应用程序可以更改用于创建窗口的属性。在产生窗口之前让程序员有机会修改窗口的外观。最后再调用CreateWindowEx函数完成窗口的创建

  1. CMainFrame-OnCreate()

OnCreate是一个消息响应函数,是响应WM_CREATE消息的一个函数,而WM_CREATE消息是由Create函数调用的。一个窗口创建(Create)之后,会向操作系统发送WM_CREATE消息,OnCreate函数主要是用来响应此消息的。OnCreate不产生窗口,只是在窗口显示之前设置窗口的属性,如风格、位置等。

  1. CtestView-OnPaint() vs OnDraw()

View类中,如果OnDraw和OnPaint同时存在,OnPaint会覆盖掉OnDraw
OnPaint是WM_PAINT消息的消息处理函数,在OnPaint中调用;
OnDraw,一般来说,用户自己的绘图代码应该放在OnDraw中。
当视图变得无效时(包括大小的改变、移动、被遮盖等),Windows发送WM_PAINT消息,该视图的OnPaint处理函数通过创建CPaintDC类的DC对象来响应消息并调用视图的OnDraw成员函数。OnPaint最后也要调用OnDraw,因此一般在OnDraw函数中进行绘制。

五、其他

  1. MFC中后缀名为Ex的函数都是扩展函数
  2. MFC中,以Afx为前缀的函数都是全局函数,可以在程序的任何地方调用
目录
相关文章
|
3月前
|
数据采集 存储 人工智能
智能体(AI Agent)开发实战之【LangChain】(二)结合大模型基于RAG实现本地知识库问答
智能体(AI Agent)开发实战之【LangChain】(二)结合大模型基于RAG实现本地知识库问答
|
Kubernetes 负载均衡 网络安全
Kubernetes 网络模型与实践
【8月更文第29天】Kubernetes(K8s)是当今容器编排领域的佼佼者,它提供了一种高效的方式来管理容器化应用的部署、扩展和运行。Kubernetes 的网络模型是其成功的关键因素之一,它支持服务发现、负载均衡和集群内外通信等功能。本文将深入探讨 Kubernetes 的网络模型,并通过实际代码示例来展示服务发现和服务网格的基本概念及其实现。
475 2
|
机器学习/深度学习 计算机视觉
一文弄懂空间金字塔池化网络
一文弄懂空间金字塔池化网络
|
Dart API C语言
Dart ffi 使用问题之想在C/C++中创建异步线程来调用Dart方法,如何操作
Dart ffi 使用问题之想在C/C++中创建异步线程来调用Dart方法,如何操作
|
弹性计算 安全 Linux
幻兽帕鲁在阿里云上的快速部署教程(持续更新)
幻兽帕鲁在阿里云上的快速部署教程(持续更新)如何自建幻兽帕鲁服务器?基于阿里云服务器搭建幻兽帕鲁palworld服务器教程来了,一看就懂系列。本文是利用OOS中幻兽帕鲁扩展程序来一键部署幻兽帕鲁服务器,阿里云百科分享官方基于阿里云服务器快速创建幻兽帕鲁服务器教程:
477 1
|
缓存 自然语言处理 JavaScript
Web服务器的动态内容生成与处理
【8月更文第28天】在Web开发领域,动态内容生成是指根据用户请求实时生成页面内容的过程。这与静态内容生成不同,后者的内容在部署时就已经确定,不会随用户的请求而改变。动态内容生成通常依赖于服务器端脚本语言,例如PHP、Node.js等,它们能够根据不同的请求参数生成特定的响应数据。本文将探讨几种流行的服务器端脚本语言在动态网页生成中的作用及其优化方法,并提供相应的代码示例。
356 0
|
机器学习/深度学习 人工智能 数据可视化
多模态数据的应用痛点
【2月更文挑战第22天】多模态数据的应用痛点
641 1
多模态数据的应用痛点
|
算法 Java API
在VC++中使用CxImage库读写图像实现像素操作
在VC++中使用CxImage库读写图像实现像素操作
155 0
|
算法 Java
Java【算法分享 01】道格拉斯-普克 Douglas-Peucker 抽稀算法(算法流程图解+使用JDK8方法实现+详细注解源码)
Java【算法分享 01】道格拉斯-普克 Douglas-Peucker 抽稀算法(算法流程图解+使用JDK8方法实现+详细注解源码)
804 0
|
存储 NoSQL 搜索推荐
图数据库有哪些:知名图数据库产品和应用场景介绍
图数据库是一种专门用于存储和处理图数据模型的数据库管理系统。图数据模型以节点和边的形式组织数据,用于表示实体之间的关系。相比传统的关系型数据库,图数据库更加适合处理复杂的关联关系,如社交网络、推荐系统、地理信息系统等领域的数据。图数据库的兴起,得益于现代应用场景对于数据处理和分析能力的不断增强需求。