zoukankan      html  css  js  c++  java
  • 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) 移动记录集后,不要重新查询,重新查询相当于游标重新开始

  • 相关阅读:
    Unity中 mesh生成斜坡
    设计模式
    Go语言高级编程
    Go语言高级编程
    agentzh 的 Nginx 教程(版本 2020.03.19)
    ubuntu18安装mysql5.7并配置远程连接
    创建图库
    交点修改
    显示中文
    浅谈前端水印
  • 原文地址:https://www.cnblogs.com/yeyeye123/p/11032301.html
Copyright © 2011-2022 走看看