23、深入浅出MFC学习笔记,MFC解剖(骨干程序)相关

简介: 1、Document/View是MFC进化为Application Framework的灵魂。在MFC中,可以把Document简单想像成数据,MFC的CDocument已经负责处理数据的类。同时,CDocument搭配了另一个重要的类CView。

1Document/ViewMFC进化为Application Framework的灵魂。在MFC中,可以把Document简单想像成数据,MFCCDocument已经负责处理数据的类。同时,CDocument搭配了另一个重要的类CView

CView为了数据的表现(显示)而设计的。就是如何将你处理的结果显示出来(输出到屏幕或者打印机)。除了负责显示外,View还负责程序与使用者之间的交谈接口。使用者对数据的编辑、修改都需要仰赖窗口上的鼠标与键盘操作才得以完成,这些消息都将由View接受后通知Document

Document/View的价值在于,这些MFC类已经把一个应用程序所需的“数据处理与显示”的函数空壳都设计好了,这些函数都是虚函数,所以你可以也应该在派生类中改写他们。有关文件读写的操作在CDocumentSerialize函数中进行,有关画面显示的操作在CViewOnDrawOnPaint函数中进行。当我们为自己派生两个类CMyDocCMyView时,只要把心思花在CMyDoc::SerializeCMyView::OnDraw上,其他琐事不用管,整个程序会运行的好好的。示例:

1)如果按下【File/Open】,Application Framework会激活对话框,让你指定文件名,然后调用CMyDoc::Serialize读文件。Application Framework还会调用CMyView::OnDraw,把数据显示出来。

2)如果屏幕状态改变,产生了WM_PAINTFrameWork会自动调用你的CMyView::OnDraw,传一个Display DC,让你重新绘制窗口内容。

3)如果按下【File/Print..】,FrameWork会自动调用你CMyView::OnDraw,这次传进去的是一个Printer DC,因此绘图操作的输出对象就变成了打印机。

2、多文档的一个图示

wps_clip_image-16406

3Document Template的意义

程序每打开一份文件(数据),就产生三份对象:

1)一份Document对象

2)一份View对象

3)一份CMDIChildWnd对象(作为外框窗口)

这三份对象由一个所谓的Document Template对象来管理;让这三份对象产生关系的关键在于CMultiDocTemplate:

	// 注册应用程序的文档模板。文档模板
	// 将用作文档、框架窗口和视图之间的连接
	CMultiDocTemplate* pDocTemplate;
	pDocTemplate = new CMultiDocTemplate(IDR_TestMFC_1TYPE,
		RUNTIME_CLASS(CTestMFC_1Doc),
		RUNTIME_CLASS(CChildFrame), // 自定义 MDI 子框架
		RUNTIME_CLASS(CTestMFC_1View));
	if (!pDocTemplate)
		return FALSE;
	AddDocTemplate(pDocTemplate);

如果程序支持不同的数据格式,则需要不同的Document Template:

	// 注册应用程序的文档模板。文档模板
	// 将用作文档、框架窗口和视图之间的连接
	CMultiDocTemplate* pDocTemplate;
	pDocTemplate = new CMultiDocTemplate(IDR_TestMFC_1TYPE1,
		RUNTIME_CLASS(CTestMFC_1Doc),
		RUNTIME_CLASS(CChildFrame), // 自定义 MDI 子框架
		RUNTIME_CLASS(CTestMFC_1View));
	if (!pDocTemplate)
		return FALSE;
	AddDocTemplate(pDocTemplate);

	pDocTemplate = new CMultiDocTemplate(IDR_TestMFC_1TYPE2,
		RUNTIME_CLASS(CTestMFC_2Doc),
		RUNTIME_CLASS(CChildFrame), // 自定义 MDI 子框架
		RUNTIME_CLASS(CTestMFC_2View));
	if (!pDocTemplate)
		return FALSE;
	AddDocTemplate(pDocTemplate);

CMultiDocTemplate的构造函数如下所示:

	CMultiDocTemplate(UINT nIDResource, CRuntimeClass* pDocClass,
		CRuntimeClass* pFrameClass, CRuntimeClass* pViewClass);

说明:CRuntimeClass

它就是“类别型录网”链表中的元素类型,任何一个类只要在声明时使用DECLRAE_DYNCREATEDECLARE_SERIAL宏,就会拥有一个静态的CRuntimeClass内嵌对象。

7、字符串资源的7个字段值[1,P322]

    每一个字符串都可以再程序中取得,通过调用CDocTemplate::GetDocString,并在第二个参数中指定索引(1~7),但最好还是以CDocTempalte所定义的七个常量来代替索引值:

所以你可以这么做:

    // in AFXWIN.h
    Class CDocTempalte :: public CCmdTarget
    {
        ...
        emum DocStringIndex
        {
            windowTitle,
            docName,
            filterName,
            filterExt,
            regFileTypeID,
            regFileTypeName
        }
	}
	
    CString strDefExt,strDocName;
    pDocTemplate->GetDocString(strDefExt, CDocTemplate::filterExt);
    pDocTemplate->GetDocString(strDocName, CDocTemplate::docName);

8、再述Document/View

Document是数据的体,View是数据的面,我们藉CDocument管理数据,藉Collections Classes(MFC中的一组专门用来处理数据的类)处理实际的数据,藉CView显示数据,藉CDCCGdiObject实际绘图。

使用者对Document的任何编辑操作都必须通过Document Frame窗口,消息随后传到CView

9、鼠标拖放(Drag and Drop)

当使用者从Shell中拖放一个文件到程序AShell就配置一块全局内存,填入被拖拽的文件名称(包含路径),然后发出WM_DROPFILES传到程序A的消息队列,程序A取得此消息后,应该把内存的内容取出,再想办法打开、读文件。

只有具备WS_EX_ACCEPTFILES风格的窗口才有收到这一消息。所以在使用CreateWindowEx第一个参数应当指定WS_EX_ACCEPTFILES

10、操作注册表

在传统的Windows程序中操作注册表两种方法:

1)写一个.reg文件,通过regedit.exe来注册。

2::RegCreateKey,::RegSetValue来直接编辑Registry

MFC中则更简单:

只要调用RegisterShellFileTypes即可。

11、消息映射

每一个派生于CCmdTarget的类都可以有自己的Message Map 用于处理消息。首先在类声明中加上DECLARE_MESSAGE_MAP();在.cpp使用BEGIN_MESSAGE_MAPEND_MESSAGE_MAP两个宏,中间就是消息与函数对应关系表。

12、默认的菜单命令项及其处理程序[1,P332]

13CEditView是一个已具备文字编辑能力的类,它所使用的窗口是Windows的标准控件之一Edit,SerializeRaw成员函数可以把Edit控件中的raw text(而不是“对象”所持有的数据)写到文件中。

参考

[1] 深入浅出MFC

[2] MFC Technical Notes

http://msdn.microsoft.com/en-us/library/h6h0eact%28VS.80%29.aspx

[3] http://hi.baidu.com/even_xf/blog/item/2da097f46b7841e57609d787.html

目录
相关文章
|
数据可视化 数据挖掘
【数据分析与可视化】对图像进行SVD分解并重构图像实战(附源码)
【数据分析与可视化】对图像进行SVD分解并重构图像实战(附源码)
443 0
|
vr&ar
检查和修复文件系统错误 - fsck
【1月更文挑战第12天】
715 0
|
JSON 关系型数据库 MySQL
MySQL 5.x和8.0区别
性能:8.0的速度要比5.7快2倍,8.0在以下方面带来了更好的性能:读/写负载、IO密集型工作负载、高竞争("hot spot"热点竞争问题)工作负载。
386 3
|
10月前
|
人工智能 运维 监控
数字孪生与能源管理:优化电网运营
数字孪生技术通过集成物联网、大数据、AI等先进科技,为实体对象创建虚拟模型,实现实时监控、故障预测与资源优化。在能源管理中,特别是电网运营方面,数字孪生能显著提升系统的稳定性、安全性和效率,推动智能电网建设,优化资源配置,加速应急响应,成为未来能源管理的关键技术。
|
移动开发 算法 数据可视化
数据分享|Spss Modeler关联规则Apriori模型、Carma算法分析超市顾客购买商品数据挖掘实例
数据分享|Spss Modeler关联规则Apriori模型、Carma算法分析超市顾客购买商品数据挖掘实例
|
开发框架 前端开发 JavaScript
【专栏】对比分析两种流行的跨平台开发框架——Flutter和React Native,探讨它们的优势、劣势以及适用场景
【4月更文挑战第27天】本文对比分析了Flutter和React Native两大跨平台移动开发框架。Flutter,由Google推出,以其接近原生的性能、快速启动和流畅滚动受青睐,适合高性能和高度定制的项目。React Native,Facebook维护,依赖JavaScript,虽性能受限,但热重载优势和丰富第三方库使其适合快速迭代的项目。两者都在拓展多平台应用,Flutter在桌面和Web,React Native在Windows。选择框架需考虑项目需求、团队技能和性能效率平衡。
730 1
|
监控 网络安全 数据库
IT知识百科:什么是802.1x认证逃生?
【2月更文挑战第20天】
1337 0
IT知识百科:什么是802.1x认证逃生?
|
传感器 vr&ar 计算机视觉
增强现实(AR)技术原理深度解析
【5月更文挑战第5天】本文深度解析了增强现实(AR)技术原理,包括图像识别与跟踪、三维注册技术和显示技术,并探讨了AR在游戏、教育、工业和医疗等领域的广泛应用。尽管面临准确性、成本和隐私等挑战,但随着技术进步,AR将在更多领域发挥关键作用,展现其潜力和价值。
2219 2
|
开发框架 编译器 定位技术
探索游戏开源世界:引擎与框架的宝库
本文介绍了多个开源游戏引擎和框架,如 Bevy(用 Rust 构建)、Mach、Axmol、Cocos、Open 3D Engine、KorGE、Tiled、OpenRA 和 Godot。这些工具降低了游戏开发的门槛,支持跨平台开发,并推动了游戏行业的发展。
|
Java API Spring
Spring Boot + MDC 实现全链路调用日志跟踪,这才叫优雅。。(上)
Spring Boot + MDC 实现全链路调用日志跟踪,这才叫优雅。。(上)
1144 0