63_MFC其它

作业讲解补充

CAD支持图形化:抽象类五个步骤,图形类五个步骤

不能序列化抽象类的原因:IMPLEMENT_SERIAL宏里面在new对象

    • 可以改成非纯虚函数,不推荐
    • 注释掉两个宏,如果抽象类没有成员需要序列化就不用写实现,如果有就自己把宏实现修改为不new
      • 把图形数据放在CDOC里面,使用MFC框架提供的GetDocument获取数据
      • CDOC里面实现序列化函数

界面和数据分离

CDoc是用来处理数据代码

CView是用来处理界面代码的

CObject是什么类(RTTI)

    • IsKindOf( RUNTIME_CLASS(是否这个的类名)),返回值布尔
    • CRuntimeClass pOj* = CObject->GetRuntimeClass(); MSG(ob->m_lpszClassName) //拿类名
    • 运行时类型识别,Runtime type info(MFC) – Meta Object(QT)

MFC其它

视图分割

作用

      • 把一个窗口划分成不同的显示界面
      • 分为动态视图分割和静态视图分割
      • 动态视图分割在单文档拆分窗口处,默认是动态
        • 最多只能分割成4个视图
        • 所有的窗口是一样
      • 静态分割步骤
        • 首先分割成几行几列的视图
        • 所有视图都要提供视图,不然会崩溃
      • CSplitterWnd类用来分割

参数(父窗口, 行数, 列数)

动态

      • 在CMaintFrame里面分割
      • 创建视图的时机OnCreateClient虚函数里面进行分割
      • CSplitterWnd::Create(参数..)
        • 拆分器父架构窗口指针,
        • 拆分器窗口中的最大行数,这个值不能超过2
        • 拆分器窗口中的最大列数。这个值不能超过2
        • 指定显示窗格的最小大小,
        • 指向CCreateContext结构的指针。在大多数情况下,这可以是传递给父框架窗口的pContext
        • 指定窗口样式
        • 窗口的子窗口ID,除非splitter窗口嵌套在另一个splitter窗口中,否则ID可以是AFX_IDW_PANE_FIRST

静态

      • 在CMaintFrame里面分割
      • 创建视图的时机OnCreateClient虚函数里面进行分割
      • CSplitterWnd:: CreateStatic (参数..)
        • 拆分器窗口的父框架窗口
        • 行数,这个值不能超过16
        • 列的数目,这个值不能超过16
        • 指定窗口样式
        • 窗口的子窗口ID。除非splitter窗口嵌套在另一个splitter窗口中,否则ID可以是AFX_IDW_PANE_FIRST

CSplitterWnd splitter; //放局部遍历出作用域会析构掉,应该写成类成员

splitter.CreateStatic(this, 2, 1);//将窗口分割成两行一列

      • CreateView(行,列,RUNTIME_CLASS(控件名),长和宽结构体,pContext):创建所有分割出来的窗口
      • 如果报错,把默认返回基类创建分割器注释掉

      • CObejct里面有很多MFC框架的控件视图

      • 二次分割

添加类成员,并在创建时指名第一次分割基础上的行和列再次分割

      • 总视图拖动分割的窗口大小不边,响应WM_SIZE消息
        • SetColumnInfo(行, 理想宽度, 最小宽度)
        • SetRowInfo(列,理想宽度, 最小宽度)
        • 应该给个标志判所有初始化分割是否完成
        • RecalcLayout每设置一次,自动计算其余分割窗口的尺寸

控件视图

CEditView

        • 继承基类控件视图
        • 重写虚函数OnInitialUpdate,响应初始化控件视图

        • 可以获取到对应的控件来操作

响应控件视图消息
        • 类向导的消息有等号的是控件本身提供的消息,不带的是属于窗口的,使用控件视图尽量相应控件本身提供的消息

TreeView和CListView差不多

        • 树视图,资源管理器那样
        • 插入根节点

CTreeCtrl.InsertItem(“字符串”);

        • 插入子节点

HTREEITEM hTreeSoft = CTreeCtrl.InsertItem(“父节点”);

CTreeCtrl,insertItem(“子节点”, hTreeSoft);

        • 修改风格

CTreCtrl.ModifyStyle (移出风格, 添加风格, 传递给SetWindowPos的标志,如果不应该调用SetWindowPos,则为零。默认值是零); //给0不添加不删除

        • 响应消息

OnNMDBLCIK实现响应鼠标双击的消息

CString csText = GetItemText(GetSelectedItem()); //获取到鼠标选中的字符串

右键菜单

      • 鼠标右键弹出的菜单,也叫上下文菜单
      • CMenu类操作右键菜单弹出菜单TrackPopupMenu(对齐格式,坐标x,坐标y,响应这个菜单的窗口,默认参)
      • LoadMenu(指定要加载的菜单资源的菜单ID)
      • 响应WM_RBUTTONDOWN消息

CMenu mn;

mn.LoadMenu(资源ID);

ClientToScreen(&point);//转换到视图坐标

mn.TrackPopupMenu(TPM_RIGHTLIGN, point.x, point.y, this);

      • 意外的标记位于分号前面,可能是重复包含机制导致没有头文件,包含一下就行

      • 获取子菜单,CMenu::GetSubMen(菜单的索引值)

      • 响应右键菜单项的消息,类向导添加事件处理程序

视图更新

      • CDocument::UpdateALLviews(NULL)通知所有的视图被修改了

      • OnUpdate虚函数接受这个通知

作业

CAD改成左边为树视图,右边为绘图视图。所有右边画板视图添加的图形,都会显示在左边树视图。通过左边的树视图,可以对图形进行操作,删除、修改画笔画刷

https://github.com/xkkhh/Cracking/tree/master/10CAD07

0 条评论
发表一条评论