MFC的基础知识以及文档视图模式
来源:互联网 发布:做广告视频的软件 编辑:程序博客网 时间:2024/05/29 16:31
一、MFC的消息类型以及路由方式
a)消息类型Windows---消息分为3类:
1) WM_开头的消息 ------系统消息--------WM的宏搭建-----直接使用ClassWizard生成比较方便[项目-》类向导-》找到消息双击]--------事件响应函数有输入参数(但是计算机自动生成,不需要记)
2) Command消息 ------ON_COMMAND(控件ID,事件响应函数----------菜单\按钮的点击(直接找到按钮双击或者手动添加【下文有实例】)--------事件响应函数:void XXX()[输入值为空,返回值为空]
3) Notify消息[类似于Command消息] 静态文本Static--》属性---》Notify改为TRUE,将ID改为自己需要的(必须)[ 因为所有的静态文本都是IDC_STATIC ]--》点事件,双击事件函数--》事件响应函数:void XXX()[输入值为空,返回值为空]
b)消息路由方式 2种
WM_开头的消息是完全按照责任链的路径从子类传递给父类的,而Command和Notify消息在基于对话框程序是完全按照责任链的路径从子类传递给父类,在文档视图结构的MFC程序中是虚函数的重载。
c)文档视图架构文档视图模式帮我们做好了序列化操作--》写到磁盘,反序列化--》到磁盘读取]和打印预览,一般情况下都使用基于对话框程序(可以直接拖控件)来写界面程序,除非涉及到多视图模式、打印等操作时才使用文档视图模式。
二、MVC设计模式
MVC模式:M:model-代表程序中所使用的逻辑数据V:view-视图用户界面
C: Contorller-控制器(根据用户的输入调用业务)
在MFC中的MVC模式的实现:
M:---CDocument
V:---CView
C:---完全基于消息响应函数和虚函数完成
三、MFC的文档视图模式框架以及程序运行流程
(1)实现--实例化全局APP--调用构造函数CMFSingleDocApp theApp;----程序员自己写的(全局变量)
CWinApp *app=&theApp; -------MFC
(2)进入WinMain函数(MFC框架隐藏了),
void WinMain()//没有退出
{
app->InitInstance();//通过指针调用虚函数,会判断调用实际的函数
Main---运行消息循环
}
App-->InitInstance()函数中
---构建了模板---CSingleDocTemplate 文档视图模板
App---拥有了--CSingleDocTemplate
放了四样东西:
Document
View
MainFrame 主SDI框架窗口
资源信息 主窗的资源ID
ProcessCommand
App---m_pMainWnd----主窗口显示
一个Doc中可以有多个视图,但是一个视图只能有一个Doc
ProcesShellCommand--new File Command
----CMainFrame
----PreCreateWindow(虚函数)---基础风格设置【设置窗口背景色、光标菜单等等(在win32中窗口模板类中的设置)】
----Create(虚函数)--拓展风格设置
-----OnCreate(消息响应)----创建完毕后设置【用的最多】设置创建子控件(-->Cview(oncreate)--->CDocument(oncreate))
----Cview
----CDocument
在文档视图模式中ON_COMMAND消息的处理顺序:
CView-->CDoucment-->CFrame-->CWinApp(彼此之间没有继承关系),通常情况下所有控件自己的消息全部发往CView
四、添加自定义消息:
1、在Resource中新建自定义消息#define MYMSG 9999(在主线程中运行)
afx_msg void OnBnClickedButton2();//afx_msg说明符,说明后面的函数是消息处理函数。afx应用程序框架
在.h文件中自定义消息
//自定义消息
afx_msg LRESULT OnMyMsg(WPARAM a, LPARAM b);
参数和返回值固定
2、给窗体中的按键添加事件,在事件处理函数中添加处理程序代码
void CMFCStudentDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
SendMessage(MYMSGID, 10, 5);//发送消息
}
3、在.cpp文件中实现函数并且注册
实现:
LRESULT CMFCStudentDlg::OnMyMsg(WPARAM a, LPARAM b)//a、b对应10 、5
{
MessageBox(_T("saghas"),_T("title"));
return 0;
}
注册:在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间添加
ON_MESSAGE(MYMSGID, &CMFCStudentDlg::OnMyMsg)
五、MFC中的定时器:
1、在OnInitDialog函数中:
定时器初始化:
this->SetTimer(WM_TIMER, 1000, NULL);//1000毫秒,每隔一秒钟就像消息循环中塞入WM_TIMER消息。第一个参数为给定时器起一个名字(ID号)
2、项目--》类向导--》消息--》WM_TIMER双击
自己写定时器处理函数
(比如:显示窗口MessageBox(_T("asdfasdf"), _T("asdg"));)
3、在其他的按钮事件处理函数中可以:
this->KillTimer(WM_TIMER);//将定时器删除
六、MFC中序列化的应用
1、添加类MFC类,基类为object,
2、实现IMPLEMENT_SERIAL宏
3、重载Serialize虚函数
项目——》类向导——》找到自己想修改的类,找到虚函数双击,会自动在cpp文件中生成函数
经过以上3个步骤便可以应用序列化了
注意,这里Serialize函数并不会被显示的调用,但是在进行文件读取或者写入时,会用到该函数。
CFile file;file.Open(filePath, CFile::modeReadWrite); CArchive ar(&file, CArchive::Mode::load); //这里便会调用Serialize函数
另外Serialize函数只能处理二进制文件不能处理文本文件。
- MFC的基础知识以及文档视图模式
- mfc 文档/视图框架:一(基础知识)
- MFC基础知识(一)——文档视图类指针获取、逻辑与设备坐标以及OnDraw
- MFC的 文档 视图 框架
- MFC的文档/视图结构
- MVC模式和MFC文档/视图结构
- MFC 文档/视图模式之如何获取文档内数据
- MFC下的文档和视图以及框架之间的访问
- MFC中文档和视图的关系
- 剖析MFC的文档视图结构
- MFC 模板、文档、视图、框架的关系
- 剖析MFC的文档视图结构
- MFC文档、视图、框架的建立
- MFC模板、文档、视图、框架的关系
- MFC视图(单文档)的基本用法
- MFC的文档视图结构分析
- 剖析MFC的文档视图结构
- MFC文档、视图、框架的建立
- Java知识点收集
- UML学习笔记(一):项目沟通的语言
- spring字符编码常用配置
- 理解AsyncTask的工作原理
- Centos 7.3 Install Piwik 3.0.4
- MFC的基础知识以及文档视图模式
- windows下SSD训练自己的数据
- 同时安装了python2和python3,如何使用pip
- 关于XER导入/导出中文问题
- 动态改变StandardShader的RenderingMode让模型透明
- MD5 与 Base64一起使用 加密,计算原理
- Ubuntu通过修改配置文件进行网络配置
- hdu2086
- 1725: [Usaco2006 Nov]Corn Fields牧场的安排