MFC进阶教程深入浅出版.笔记第4天
平时也没机会接触到MFC的代码,这次也是项目使然,手上项目涉及到MFC,感觉有点意思,所以在b站找了视频学习,没有上手操作过,只是走马观花,大致了解了这个代码的流程,现在奉上b站的视频链接:MFC进阶教程深入浅出版
以下是课程笔记:
【根据向导,创建单文档的工程】
第四天(文档和视图、数据库编程):
1、文档视图结构介绍
2、CArchive类的使用
3、MFC odbc操作数据库
open database connect
一、文档视图结构
文档类(CDocument):存储加载(读写)数据
视图类(CView):显示和修改数据
1)单文档
a)文档模板: app中Initinstance文档模板把框架窗口、文档、视图关联在一起
b)文档类(CDocument):
OnNewDocument(),第一次新建窗口调用,后面每次按“新建",自动调用此函数
DeleteContents(),做一些释放资源的操作,每次按”新建",新建前先调用此函数
c)框架类可以认为是视图类的容器
2)各类相关访问
a)在视图类view,如何访问文档对象指针 CView::GetDocument
CDocument* GetDocument() const;
如:
void xxx_View::OnDraw(CDC* /*pDC*/)
{
xxx_Doc* pDoc = GetDocument();
}
CFile:
write-store
read-load
MFC中文手册CFile::Open
CArchive 没有基类,直接MSDN查
二、文档序列化(二进制操作文件CArchive) 相当于Qt QDataStream
序列化:序列化实际就是文件读写
序列化:以二进制方式写文件
反序列化:以二进制方式读文件
1)写文件
a) 创建文件对象CFile
b) 以写方式打开文件 CFile::Open
c) 创建序列化对象,并且和文件关联在一起 CArchive
CArchive::store 把数据保存到归档文件中。允许CFile写操作。
d) 往数据流写数据(相当于往文件写数据,按顺序)
ar << a << b << c
e) 断开数据流和文件的关联 CArchive::Close
f) 关闭文件 CFile::Close
2)读文件
a) 创建文件对象 CFile
b) 以读方式打开文件 CFile::Open
c) 创建序列化对象,并且和文件关联在一起 CArchive
CArchive::load 从归档文件加载数据。CFile只读。
三、文档视图案例
1)文档类自带序列化操作函数 Serialize()
void CMy01_ CArchiveDoc::Serialize(CArchive&
ar)
{
if(ar.IsStoring())
{
//TODO:在此添加存储代码
//按保存按钮时调用
//点击保存时,系统自动把生成的那个文件和ar绑定
}
else
{
//TODO:在此添加加载代码
//按打开按钮调用
}
}
2)学生管理系统
a) 定义一个学生类Stu
CList <Stu *> list;
b) 文档类doc存储数据,视图类view修改和显示数据
1) 从尾部添加元素 CList::AddTail
2) 获取列表尾部元素的位置 CList::GetTailPosition
3) 获取上一个元素 CList::GetPrev
4) 获取下一个元素 CList::GetNext
5) 获取首元素位置 CList::GetHeadPosition
6) 获取最后一个元素位置 CList::GetTailPosition
7) 获取指定位置的元素 CList::GetAt
8) 移除头结点元素(并没有释放空间) CList::RemoveHead
c)视图的基类是 CFormView
d)重写文档类 DeleteContents(),做一些释放资源的操作,每次按“新建”,新建前先调用此函数
四、数据库编程
1) 准备工作
a) 安装MySQL服务器
b) MySQL odbc驱动
2) odbc层次图
a) odbc 一套标准接口(内部通过sql语句操作数据库,用户就算不懂sql语句也可以借助odbc操作数据库)
b) 数据源
3)如何创建数据源(MySql只能是快照)
a)快照(Snapshot)记录集:每次操作重新查询后才更新
b)动态(Dynaset)记录集:每次操作自动更新(添加记录外)
4)应用程序框架
a) CRecordset的子类,主要是对数据库进行相应操作
1) DoFieldExchange() 自动把数据库的字段和变量相关联
2) GetDefaultConnect() 获取数据库连接信息
3) GetDefaultSQL() 获取数据库连接的表
b) CFormView的子类,显示数据库内容的视图
1) OnInitialUpdate() 主要作初始化功能
5)通过 CRecordset类对数据库进行相应操作
a) 视图类头文件创建 CRecordset的子类对象
b) 视图类做 增删改查 操作
1) 打开数据库 CRecordset::Open
2) 查询记录 CRecordset::Requery
3) 移动上一个记录集 CRecordset::MovePrev
4) 移动下一个记录集 CRecordset::MoveNext
5) 是否为最后一个记录的下一个 CRecordset::IsEOF
6) 是否为第一个记录的上一个 CRecordset::IsBOF
7) 移动到第一个记录 CRecordset::MoveFirst
8) 移动到最后一个记录 CRecordset::MoveLast
9) 添加空记录 CRecordset::AddNew
10) 如果记录集可修改 CRecordset::CanUpdate
11) 更新记录集 CRecordset::Update
12) 删除当前记录 CRecordset::Delete
13) 编辑当前记录 CRecordset::Edit
14) 过滤 CRecordset::m_strFilter
15) 排序 CRecordset::m_strSort(默认升序,降序加desc)
c)注意点
1) 移动记录集,注意越界处理
2) 移动记录集后,不要重新查询,重新查询相当于游标重新开始