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 aLPARAM b)//a、b对应10 、5

{

MessageBox(_T("saghas"),_T("title"));

return 0;

}

注册:BEGIN_MESSAGE_MAPEND_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函数只能处理二进制文件不能处理文本文件。

原创粉丝点击