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) 移动记录集后,不要重新查询,重新查询相当于游标重新开始

posted on 2019-06-16 17:48  yeyeye123  阅读(228)  评论(0编辑  收藏  举报

导航