大家好,我是你的MFC编程小伙伴!学MFC就像探险古墓:到处是神秘的“房间”(窗口)和“宝藏”(数据)。今天咱们聊聊核心概念 – 视图、窗口和文档。这些是MFC的“骨架”,懂了它们,你就能轻松搭建Windows应用。别担心,我会用接地气的语言讲解:比喻成家庭成员(框架是爸妈,视图是孩子,文档是家底),专业术语点到为止,还加点小幽默(比如把文档/视图比作厨师和盘子)。读完这篇,你会觉得MFC没那么“高冷”了。准备好?咱们进“古墓”!

(PS: 本文针对MFC新手,基于单文档(SDI)示例。)

视类窗口:显示数据的“舞台”

在这里插入图片描述

想象一下,你的程序跑起来后,那块显示内容的区域 – 比如画图区或文本显示区 – 这就是视类窗口 (View Window)。它像个舞台,负责把数据“表演”给用户看,还能接收鼠标/键盘输入。

  • 对应类:CXXXView(XXX是项目名,比如CSDITestView),它派生自CView,而CView又继承自CWnd(窗口基类)。继承关系?在VS里右键类名,选“查看类定义”,一目了然。
  • 职责:拥有窗口的“客户区”(不包括边框菜单的那块空白),显示文档数据、处理用户交互、连接文档和用户。简单说:视图是“中介”,数据从文档来,用户输入反馈给文档。
  • 有趣比喻:视图像电视屏幕 – 它不存节目(数据),只负责播出和遥控互动。主框架窗口里的“空白画布”,等着你画上内容。

幽默小贴士:如果视图是明星,它绝对是那种“只负责美,不负责赚钱”的类型 – 数据管理交给别人!

主框架窗口:整个界面的“大管家”

现在放大视野:程序运行后,整个界面(包括菜单栏、工具栏、状态栏和中间的空白区)就是主框架窗口 (Main Frame Window)。它像个大房子,包容一切。

  • 对应类:CMainFrame,派生自CFrameWnd,而CFrameWnd继承自CWnd。同样,查定义看继承链。
  • 职责:这是应用程序的“外壳”,包括所有可见部分(如图3-1-1所示)。它管理菜单、工具栏,还嵌套了视类窗口。
  • 关系:主框架窗口是视类窗口的“父窗口”(爸妈级)。视图只是框架里的一个子部分(孩子)。详细关系后面章节深挖,现在记住:框架是大Boss,视图是小弟(如图3-1-1)。

比喻升级:框架像餐厅老板 – 管整体布局、菜单(工具栏),视图是餐桌 – 只管摆盘上菜。

文档:数据管理的“幕后英雄”

别忘了数据!MFC不让窗口类直接存数据,而是用文档 (Document) 来管。它不是窗口(没界面),纯粹是数据仓库。

  • 对应类:CXXXDoc(比如CSDITestDoc),派生自CDocument。CDocument的基类是CCmdTarget(命令目标),再上层是CObject(MFC对象基类)。所以,它不是CWnd的子孙 – 没窗口功能。
  • 职责:维护程序数据(存储、加载、操作),提供方法给视图用。像个数据库管理员,确保数据随时可用。

新建个MFC单文档项目叫SDITest,看项目结构(如图3-1-2):里面就有CSDITestDoc – 它不是窗口,而是文档类。
在这里插入图片描述

MFC的智慧在这里:把数据和显示分开,代码更干净。

文档/视图结构:MFC的“黄金搭档”

为什么这么设计?Microsoft在MFC里发明了文档/视图 (Document/View) 结构,就是为了“分家”:数据管理和显示分离。避免代码乱成一锅粥。

  • 文档 (CDocument):管数据存储/加载(比如读写文件、序列化)。
  • 视图 (CView):管数据显示/修改(绘图、用户编辑)。
  • 好处:数据变了,视图自动更新;一个文档可对应多个视图(多角度看数据)。这是MFC的重点,中级教程会细聊。现在有个初步印象:文档是“厨师”(准备食材),视图是“盘子”(呈现美食)。分开后,厨师专心做饭,盘子专心摆好看。

有趣比喻:文档/视图像夫妻档 – 文档挣钱(管数据),视图花钱(秀出来)。离婚?程序就崩了!

单文档程序如何“组队”:代码剖析

咱们用SDITest项目举例,看MFC怎么把文档、框架、视图“绑”一起。核心在源文件SDITest.cpp的CSDITestApp::InitInstance函数里,有这么一段“魔法代码”:

// 注册应用程序的文档模板。文档模板将用作文档、框架窗口和视图之间的连接
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,                  // 资源ID,主菜单等RUNTIME_CLASS(CSDITestDoc),     // 文档类RUNTIME_CLASS(CMainFrame),      // 框架类(主窗口)RUNTIME_CLASS(CSDITestView)     // 视图类
);
if (!pDocTemplate)return FALSE;
AddDocTemplate(pDocTemplate);       // 添加到模板列表,形成有机整体
  • 拆解:创建一个CSingleDocTemplate对象(单文档模板),它像“胶水”把三者粘合:文档管数据、框架管外壳、视图管显示。
  • 过程:程序启动时,这个模板注册好,一切就连起来了。AddDocTemplate把它们加到系统中,形成“铁三角”。
  • 为什么重要?这是MFC的框架机制,让你不用手动new对象 – 自动管理生命周期。单文档(SDI)用这个;多文档(MDI)类似但更复杂。

项目结构图(如图3-1-2)直观显示:App类启动一切,Doc/View/Frame协作无间。

结语:从概念到实践,MFC大门已开

怎么样?视图是舞台、框架是大管家、文档是幕后 – MFC的文档/视图结构是不是挺巧妙的?这些基础概念是搭建程序的基石,理解了,下一步消息处理就轻松了。赶紧在VS新建SDITest项目,运行看效果,改改代码体会关系。后面章节会深挖窗口间互动。

有疑问?评论区吐槽吧!点赞收藏转发,一起征服MFC~

(本文CSDN原创,基于MFC基础知识。欢迎交流,转载请注明出处。敲代码,乐在其中!)

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

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

相关文章

深度学习(六):代价函数的意义

在深度学习的浩瀚世界中,代价函数(Cost Function),又称损失函数(Loss Function)或目标函数(Objective Function),扮演着至关重要的角色,它就像一个导航员&…

Kable使用指南:Android BLE开发的现代化解决方案

概述 Kable(com.juul.kable:core)是一个专为Android蓝牙低功耗(BLE)开发设计的Kotlin协程友好库。它通过提供简洁的API和响应式编程模式,极大地简化了BLE设备交互的复杂性。本文将详细介绍Kable的使用方法,…

Android图案解锁绘制

使用到的库是Pattern Locker,根据示例进行了修改,把默认样式和自定义样式进行了合并调整。 设置密码 布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xm…

Kotlin 协程之 Flow 的理解使用及源码解析

前言 在前面的文章中&#xff0c;我们已经讨论了 Channel 的概念和基本使用以及 Channel 的高阶应用。这篇我们来看日常开发中更常用的Flow。 “冷流” 和 “热流” 的本质 先来梳理一下所谓的 “冷流” 和 “热流”。 核心概念 我们已经知道 Channel 是 “热流”&#xff…

简述ajax、node.js、webpack、git

本系列可作为前端学习系列的笔记&#xff0c;HTML、CSS和JavaScript系列文章 已经收录在前端专栏&#xff0c;有需要的宝宝们可以点击前端专栏查看&#xff01; 点赞关注不迷路&#xff01;您的点赞、关注和收藏是对小编最大的支持和鼓励&#xff01; 系列文章目录 简述ajax、…

经营帮会员经营:全方位助力企业高效发展,解锁商业新可能

在商业竞争愈发激烈的当下&#xff0c;企业若想脱颖而出&#xff0c;高效的经营管理体系至关重要。经营帮的会员经营板块&#xff0c;凭借丰富且实用的功能&#xff0c;为企业打造了一站式的经营助力平台&#xff0c;从多维度赋能企业&#xff0c;让发展之路更顺畅。会员经营与…

Vue 封装Input组件 双向通信

子组件<template><div class"box"><div class"box-left"><input blur"handleBlur" v-model"localInput" class"box-left-input"> </div><div class"box-right"><p style…

伽马(gamma)变换记录

此只记录伽马变换原理及其应用结果&#xff08;文章所有内容基于数字图像处理-冈萨雷斯&#xff09;&#xff0c;和直接用MATLAB代码生成伽马变换代码。一、原理伽马变换的公式很简答 就是一个有规律的幂运算 公式如下&#xff1a;一般在图像中进行应用是 C1 y为不同值时r的输…

电路学习(六)三极管

三极管是一种电流驱动元器件&#xff08;MOS管为电压驱动&#xff09;&#xff0c;在电路中可以充当开关&#xff0c;放大电流等作用。本文章参考了尚硅谷的视频资料。1. 什么是三极管&#xff1f;三极管又被称为晶体三极管&#xff08;Bipolar Junction Transistor&#xff0c…

配置docker常见问题

输入sudo yum install -y yum-utils device-mapper-persistent-data lvm2出现Cannot find a valid baseurl for repo: base/7/x86_64一、检查网络输入ping www.baidu.com出现PING www.a.shifen.com (220.181.111.1) 56(84) bytes of data. 64 bytes from 220.181.111.1 (220.18…

Python 实战:票据图像自动矫正技术拆解与落地教程

在日常办公自动化&#xff08;OA&#xff09;或财务数字化场景中&#xff0c;拍摄的票据常因角度问题出现倾斜、变形&#xff0c;不仅影响视觉呈现&#xff0c;更会导致 OCR 文字识别准确率大幅下降。本文将从技术原理到代码实现&#xff0c;手把手教你用 Python 打造票据图像自…

vue3+TS项目配置unocss

配置unocss &#xff08;1&#xff09;安装依赖 npm i unocss unocss/preset-uno unocss/preset-attributify -D npm install unocss/transformer-directives&#xff08;2&#xff09;根目录新建uno.config.ts文件 import { defineConfig } from "unocss"; impor…

嵌入式硬件工程师的每日提问

一、LDO与DC-DC的对比1&#xff09;同&#xff1a;两者都是将不稳定的直流输入电压转换为稳定的直流输出电压。2&#xff09;异&#xff1a;LDO&#xff1a;线性调节&#xff0c;通过内部功率晶体管&#xff0c;工作在线性区&#xff0c;稳定输出电压。类比&#xff1a;将湍急的…

从零到一使用Linux+Nginx+MySQL+PHP搭建的Web网站服务器架构环境——LNMP(下)

从零到一使用LinuxNginxMySQLPHP搭建的Web网站服务器架构环境——LNMP&#xff08;上&#xff09;https://coffeemilk.blog.csdn.net/article/details/151350565 一、Nginx与PHP-FPM整合原理 1.1、PHP-FPM配置文件 Nginx与PHP-FPM整合原理序号说明1 PHP-FPM是一个第三方的Fast…

论文阅读-Correlate and Excite

文章目录1 背景2 创新点3 方法3.1 总体结构3.2 代价体计算3.3 引导式代价体激励&#xff08;GCE&#xff09;3.4 TopK视差回归4 效果参考资料1 背景 在IGEV中构建几何编码体CGC_GCG​时用到了本文将要描述的CoEx&#xff0c;IGEV中没有说明为什么要这样做&#xff0c;本文就是…

探索大语言模型(LLM):Open-WebUI的安装

前言 Open-WebUI 是一款专为大模型设计的开源可视化交互工具&#xff0c;它通过类 ChatGPT 的直观界面&#xff0c;让用户无需代码即可管理、调试和调用本地或云端的大语言模型&#xff08;LLMs&#xff09;&#xff0c;成为私有化部署的便捷工具&#xff0c;本文将介绍如何部…

企业远程访问方案选择:何时选内网穿透,何时需要反向代理?

企业远程访问需求日益增长&#xff0c;无论是远程办公、分支互联还是服务发布&#xff0c;选择合适的网络方案都至关重要。内网穿透和反向代理是两种常见的技术手段&#xff0c;但它们的设计目标和适用场景截然不同。本文将客观分析两者的特点&#xff0c;帮助企业做出更合理的…

ARM指令集(Instruction Set)细节

ARM指令集(Instruction Set)细节 本文旨在深入探讨 ARM 指令集(Instruction Set)的细节。这是一个非常广泛的主题&#xff0c;我会将其分解为关键概念、不同版本的区别以及核心特性&#xff0c;并提供一些示例。 ARM 指令集的核心在于 RISC&#xff08;精简指令集计算机&#x…

Vue基础知识-Vue集成 Element UI全量引入与按需引入

一、方式一&#xff1a;全量引入 Element UI全量引入即一次性加载 Element UI 所有组件和样式&#xff0c;优点是配置简单&#xff0c;适合快速开发&#xff1b;缺点是打包体积较大&#xff0c;生产环境可能存在冗余。1. 安装 Element UI全量引入只需安装 Element UI 核心依赖&…

leetcode26(字母异位词分组)

给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。示例 1:输入: strs ["eat", "tea", "tan", "ate", "nat", "bat"]输出: [["bat"],["nat","…