nullnullMFC文档视图null- * -本章目标熟悉文档、视图对象的创建过程
熟悉文档/视图结构的消息传递过程
熟悉程序框架中的主要类及相互关系
熟悉文档类、视图类核心函数及作用
熟悉新建、保存和打开的实现的原理
掌握文档/视图程序的界面
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
方法, 包括,菜单栏、工具栏、状态栏
掌握文档/视图程序消息处理的方法
掌握文档/视图的文本编程方法,包括插入符创建、显示
掌握通过串行化的方法保存加载对象文档/视图框架- * -文档/视图框架文档/视图结构是MFC中结构最复杂、体系最庞大而又最富有特色的部分。
在文档/视图结构里,文档是一个应用程序基本数据元素的集合,它构成应用程序所使用的数据单元;视图是应用程序数据显示部分。
使用MFC的程序向导(AppWizard)可以方便的创建文档/视图框架程序。文档/视图框架—文档/视图结构概述- * -文档/视图框架—文档/视图结构概述文档和视图的关系文档/视图框架—文档/视图结构概述- * -文档/视图框架—文档/视图结构概述使用文档/视图结构的意义:
将数据操作、数据显示和用户界面分离开。这是一种“分而治之”的思想,这种思想使得模块划分更加合理、模块独立性更强。
MFC在文档/视图结构上提供了许多
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
操作。如新建文件、打开文件、保存文件、打印等操作,它们被框架自动完成,减轻了程序员的工作量。文档/视图框架—文档/视图结构概述- * -文档/视图框架—文档/视图结构概述不宜采用文档/视图结构的情况:
不是面向数据的或数据量很少的应用程序。典型的是一些工具程序,例如磁盘扫描程序、时钟程序。
不使用标准的窗口用户界面的程序。比如游戏程序。文档/视图框架—文档/视图结构概述- * -文档/视图框架—文档/视图结构概述单文档与多文档:
SDI程序中,用户在同一时刻只能操作一个文档 。
典型应用为Windows下的Notepad记事本程序。在这些应用中,打开新文档时需要关闭当前已打开的活动文档。
MDI程序中,允许用户同时操作多个文档 。
如VS2008就是多文档程序。在MDI程序中,用户可以通过切换活动窗口激活相应的文档进行操作。 文档/视图框架—单文档主要类- * -文档/视图框架—单文档主要类单文档应用程序框架中,主要包含5个类:
SDICWinApp(应用程序类)
CFrameWnd(框架窗口类)
CView(视图类)
CDocument(文档类)
CDocTemplate(类文档
模板
个人简介word模板免费下载关于员工迟到处罚通告模板康奈尔office模板下载康奈尔 笔记本 模板 下载软件方案模板免费下载
)文档/视图框架—单文档主要类- * -文档/视图框架—单文档主要类单文档程序框架中的类对象之间的关系 :文档/视图框架—单文档主要类- * -文档/视图框架—单文档主要类SDI框架程序中各对象之间的访问:文档/视图框架—文档视图对象的创建过程- * -文档/视图框架—文档视图对象的创建过程......
//注册应用程序的文档模板。
//文档模板将用作文档、框架窗口和视图之间的连接
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CMytestDoc),
RUNTIME_CLASS(CMainFrame), // 主 SDI 框架窗口
RUNTIME_CLASS(CMytestView));
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);
//分析标准外壳命令、DDE、打开文件操作的命令行
......
//根据命令行中的信息启动程序
......
//唯一的一个窗口已初始化,因此显示它并对其进行更新
......文档/视图框架—文档视图核心函数 - * -文档/视图框架—文档视图核心函数 文档类核心函数 :文档/视图框架—文档视图核心函数 - * -文档/视图框架—文档视图核心函数 视图类核心函数 :文档/视图框架—文档视图界面设计 - * -文档/视图框架—文档视图界面设计 在MFC编程中,可以通过三种方法设计界面:
手工代码编程:功能最强大,可以实现几乎所有Windows支持的界面功能;
AppWizard:指在用向导生成程序时,通过向导提供的“用户界面功能”初步选择界面元素;
资源编辑器:设计界面更加直观,能实现大部分Windows支持的界面功能,也是最常见的设计界面的一种方法。菜单编程—菜单的概念 - * -菜单编程—菜单的概念 菜单编程—菜单的开发步骤 - * -菜单编程—菜单的开发步骤 简单的菜单编程一般可分为下面三个步骤 :
编辑菜单资源,设置菜单属性(包括菜单名和ID);
通过类的属性化编程自动映射菜单消息;
手工编辑消息映射函数,加入菜单消息处理代码。菜单编程—菜单的创建与编辑 - * -菜单编程—菜单的创建与编辑 菜单编程—菜单消息 - * -菜单编程—菜单消息 MFC程序可以处理两种菜单消息 :
WM_COMMAND:菜单命令消息。
UPDATE_COMMAND_UI:在菜单显示前,框架将发送该命令,以方便处理菜单状态的动态变化(例如是否要被设置选中标志、禁止菜单项等)。菜单编程—菜单消息 - * -菜单编程—菜单消息 添加消息映射函数 :菜单编程—菜单消息 - * -菜单编程—菜单消息 添加菜单更新消息:菜单编程—为菜单项设置快捷键- * -菜单编程—为菜单项设置快捷键有两种菜单快捷键 :
ALT快捷键:在填写菜单的“Caption”属性时用“&”标示的快捷键字符。
程序全局快捷键:在程序运行的时候,不打开菜单,而是直接使用快捷键执行相应的菜单项 菜单编程—为菜单项设置快捷键- * -菜单编程—为菜单项设置快捷键菜单编程—弹出菜单- * -菜单编程—弹出菜单1. 创建弹出菜单资源 :菜单编程—弹出菜单- * -菜单编程—弹出菜单2. 弹出菜单的加载 void CMyNotepadView::OnRButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CMenu menu; //使用CMenu类实例化菜单对象
menu.LoadMenu(IDR_MYPOP_MENU); //加载菜单资源
CMenu* pMenu = menu.GetSubMenu(0); //0是索引值,这里指顶层菜单的第一项子菜单
ClientToScreen(&point); //将以客户区坐标转换成屏幕坐标
pMenu->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this); //弹出菜单
CView::OnRButtonUp(nFlags, point);
}工具栏编程—工具栏CToolBar简介- * -工具栏编程—工具栏CToolBar简介CToolBar类中常用的函数及用途 :工具栏编程—栏编辑和创建工具栏- * -工具栏编程—栏编辑和创建工具栏工具栏编程—加载工具栏- * -工具栏编程—加载工具栏工具栏的创建工作是在CMainFrame::OnCreate()函数中完成的:int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
......
//为窗口创建工具栏
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD |
WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("未能创建工具栏\n");
return -1; // 未能创建
}
......
// TODO: 如果不需要可停靠工具栏,则删除这三行
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
return 0;
}工具栏编程—工具栏命令处理- * -工具栏编程—工具栏命令处理与菜单命令相同,MFC程序可以处理两种工具栏按钮消息:命令消息WM_COMMAND和更新命令消息UPDATE_COMMAND_UI。
通过类的属性窗口可以方便地为工具按钮添加这两种消息的映射函数,其实现过程与菜单项完全相同 状态栏编程—CStatusBar类 - * -状态栏编程—CStatusBar类 状态栏编程—状态栏创建 - * -状态栏编程—状态栏创建 CStatusBar m_wndStatusBar;1. 在CMainFrame类中定义状态栏对象2.在CMainFrame::OnCreate()函数中创建状态栏int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
......
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("未能创建状态栏\n");
return -1; // 未能创建
}
......
}状态栏编程—状态栏编程 - * -状态栏编程—状态栏编程 //状态栏窗格数组
static UINT indicators[] =
{
ID_SEPARATOR, //状态行指示器
ID_INDICATOR_CAPS, //显示Caps Lock键状态
ID_INDICATOR_NUM, //显示Num Lock键状态
ID_INDICATOR_SCRL, //显示Scroll Lock键状态
ID_INICATOR_CLOCK, //自定义,用于显示时间
};状态栏窗格文本编程—创建插入符 - * -文本编程—创建插入符 void CreateSolidCaret (int nWidth,int nHeight);1. 创建插入符 2.显示插入符 ShowCaret() ;3.改变插入符的位置 static void PASCAL SetCaretPos(POINT point);文本编程—字符输入 - * -文本编程—字符输入 void CMyNotepadView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//存储用户输入的字符
CString str((TCHAR)nChar);
GetDocument()->m_strText += str;
.......
//显示字符
dc.TextOut(GetDocument()->m_ptCaretPos.x,
GetDocument()->m_ptCaretPos.y,GetDocument()->m_strText);
CView::OnChar(nChar, nRepCnt, nFlags);
}窗体响应字符输入的消息是WM_CHAR,消息映射函数的参数nChar即是来自键盘的字符。 串行化—串行化概述- * -串行化—串行化概述串行化是从应用程序中将数据对象写入文件,或从文件中读入到应用程序的数据对象的过程。
串行化的基本思想是将一个类对象成员变量中的当前状态存储,之后也可以通过串行化的读取操作重新创建对象。
在MFC中,能够支持串行化操作的类必须从CObject派生,并且必须重新改写(覆盖)继承自父类CObject的Serialize()函数。 串行化—文档/视图结构对串行化的支持- * -串行化—文档/视图结构对串行化的支持串行化—文档/视图结构对串行化的支持- * -串行化—文档/视图结构对串行化的支持串行化—CArchive类- * -串行化—CArchive类CArchive类没有基类,它提供了一种串行化对象从文件中进行读/写的类型安全的缓冲机制。
使用CArchive对象之前,必须先创建一个CFile对象,同时保证CArchive的读写标志设置(见CArchive构造函数说明)和文件打开方式相一致。
对于一个CArchive对象,可以进行存储操作,也可以读取,但二者不能同时进行。实际的读写操作由与CArchive对象相关联的CFile或派生类对象来执行。
可以把CArchive对象想象成一种二进制流,就像C++中的输入/输出流一样,可以顺序高效的处理二进制对象数据 。串行化—CArchive类- * -串行化—CArchive类1. 构造CArchive对象CArchive(CFile* pFile,UINT nMode,int nBufSize = 4096,void* lpBuf = NULL);串行化—CArchive类- * -串行化—CArchive类2. >>和<<操作符 BYTE bSomeByte;
WORD wSomeWord;
int iSomeint;
......
//将数据写入ar对象相关联的文件
ar<< bSomeByte<< wSomeWord<< iSomeint; 串行化—CArchive类- * -串行化—CArchive类3.通过CArchive类串行化CObject派生类对象//用>>和<<操作符对CObject派生类对象进行操作时,需要使用指针类型:
CTestClass obj; //CTestClass类是可串行化的类,声明对象
......
ar<<&obj; //对obj地址进行操作,将obj写入ar对象相关联的文件
......
CTestClass* pObj; //CTestClass类是可串行化的类,声明指针
ar>>pObj; //当对可串行化的类进行串行化操作时,也可以直接调用Serialize()函数进行 :
CTestClass obj; //CTestClass类是可串行化的类,声明对象
......
obj.Serialize(ar); //对obj的地址进行操作,将obj写入ar对象相关联的文件
......
CTestClass* pObj=new CTestClass; //CTestClass类是可串行化的类,声明指针
//从ar所关联的文件中读取数据信息,并动态创建CTestClass对象给pObj指针
pObj->Serialize(ar);串行化—CArchive类- * -串行化—CArchive类4.判断CArchive读写状态 // CMyNotepadDoc 序列化
void CMyNotepadDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: 在此添加存储代码
}
else
{
// TODO: 在此添加加载代码
}
}串行化—CArchive类- * -串行化—CArchive类5.当不再使用CArchive对象时,需要调用CArchive的Close()成员函数关闭CArchive。Close()函数会将缓冲区的所有数据写到文件中,终止和文件的关联。串行化—可串行化的类- * -串行化—可串行化的类使一个类支持可串行化需要经过以下5个步骤:
从CObject类派生,或从CObject派生的某个类派生;
定义不带参数的构造函数;
重写Serialize()成员函数;
使用DECLARE_SERIAL宏,该宏要写在类的定义文件中(一般是在.h文件);
使用IMPLEMENT_SERIAL宏,该宏要写在类的实现文件中(一般是在.cpp文件)。串行化—CObArray和CObList- * -串行化—CObArray和CObListMFC中的CObArray和CObList类结合了DECLARE_SERIAL和IMPLEMENT_SERIAL宏支持串行化,以转储该集合类中的元素。
这两个集合类都有一个Serialize()函数,要对CObArray和CObList类对象进行串行化,直接在文档类内的Serialize()函数内调用集合类的Serialize()函数即可。 void CDemoDoc::Serialize(CArchive& ar)
{
if(ar.IsStoring())
{
......
}
else
{
......
}
m_obList.Serialize(ar);
}null- * -小结文档/视图框架是开发基于文档应用程序的基本框架
文档/视图框架中的文档是数据容器,视图是数据显示的窗口
文档/视图框架主要包括5个类:CWinApp、CFrameWnd、CView、CDocument、CDocTemplate
文档/视图框架中的框架窗口、文档、视图的创建是在InitInstance()函数内完成的
文档/视图框架的命令消息遵循MFC规定的路径进行循环处理
利用VS2008提供的属性化编程方法可以方便的给类添加消息映射函数和虚函数覆盖
串行化是MFC提供的一种将对象保存到文件或从文件读入到程序中的机制null- * -