【MFC視圖和窗口基礎:文檔/視圖的“雙胞胎”魔法 + 單文檔程序】

大家好,我是你的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","…