当前位置: 首页 > news >正文

MFC - CFormView类学习1

CFormView简介

MFC提供了一个名为CFormView的特殊视图类,我们称其为表单视图。表单视图是指用控件来输入和输出数据的视图,用户可以方便地在表单视图中使用控件。表单视图具有对话框和滚动视图的特性,它使程序看起来象是一个具有滚动条的对话框.在有些情况下,用表单视图比用普通视图更符合用户的需要,例如,在向数据库输入数据时,显然用表单的形式可以更习惯些.

用AppWizard可以方便地创建基于表单视图的应用程序,只要在MFC AppWizard对话框的第六步先选择CView,然后在Base class栏中选择CFormView,AppWizard就会创建一个基于CFormView的应用程序.

读者可以按上述方法建立一个名为Test的应用程序.在Test工程的资源中,读者会发现一个ID为IDD_TEST_FORM的对话框模板,该对话框模板可供用户放置和安排控件.在程序运行时,框架根据该对话框模板创建CFormView对象,并根据模板的信息在表单视图中自动创建控件.与设计对话框类相类似,用户可以用ClassWizard为表单视图类加入与控件对应的成员变量,可以调用UpdateData在控件和成员变量之间交换数据,但对控件的初始化工作是在OnInitialUpdate函数而不是在OnInitDialog函数中进行的.

基于表单视图的应用程序基于对话框的应用程序都是在应用程序中直接使用控件,但二者有很多不同之处。基于对话框的应用程序是用一个对话框来作为程序的主窗口的,因而程序的主窗口的特性与对话框类似,如窗口的大小不能改变,程序没有菜单条、工具条和状态栏等.基于表单视图的应用程序仍然是基于 Doc/View 框架结构的,只是视图被换成了表单视图,也就是说,应用程序的窗口可以改变大小,程序有菜单条、工具条和状态栏,且程序仍然可以 Dov/View 运行机制来处理文档.

在单文档视图应用程序中创建CFormView的两种方法.

方法1. MFC AppWizard创建项目时,选择CFormView

创建单文档应用程序过程中直接将派生于CView类的CXXXView类的基类修改为CFormView,除了经典的文档视类结构之外,MFC将额外生成一个对话框资源,ID为"IDD_XXX_FORM".同时,该对话框通过枚举与"CXXXView"类关联.
在这里插入图片描述

//View类派生于CFormView
class CSDITestView : public CFormView
{
protected: // 仅从序列化创建CSDITestView();DECLARE_DYNCREATE(CSDITestView)public://主对话框与类关联enum{ IDD = IDD_SDITEST_FORM };

方法2. 手动创建一个CFormView类的对话框

已经按照默认流程创建完单文档应用程序了之后再创建基于CFormView类的对话框时最好不要手动修改CXXXView的基类为CFormView,再手动添加一个对话框.

而是要通过以下步骤实现:

  1. 新建一个单文档应用程序.
  2. 资源管理器 - Dialog - 添加一个对话框A
  3. 在对话框A上”选择”类向导”,在”添加类”弹出式对话框中输入类名,”基类”选择为”CFormView.
  4. 在单文档应用程序的CXXXApp的实现文件顶部添加”#include ‘新类的头文件名’”.
  5. 在CXXXApp类的”InitInstance()”函数的”CSingleDocTemplate”类型(注册应用程序的文档模板,文档模板将用作文档,框架窗口和视图之间的连接)连接视类时,将视类替换为我们新添加的CFormView类派生的对话框类(看下文代码)
	// 注册应用程序的文档模板。文档模板// 将用作文档、框架窗口和视图之间的连接CSingleDocTemplate* pDocTemplate;//pDocTemplate = new CSingleDocTemplate(//	IDR_MAINFRAME,//	RUNTIME_CLASS(CSDITestDoc),//	RUNTIME_CLASS(CMainFrame),       // 主 SDI 框架窗口//	RUNTIME_CLASS(CSDITestView));pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CSDITestDoc),RUNTIME_CLASS(CMainFrame),       // 主 SDI 框架窗口RUNTIME_CLASS(CSDIFormDlg));	 // 手动创建的CFormView类
  1. 编译通过运行之后发现对话框可以在单文档一启动就显示了.

接下来就可以像操作对话框应用程序一样直接操作单文档应用程序了.
需要注意的是CFormView派生类没有"OnInitDialog"函数.对话框的初始化(或者说习惯开始函数)可以放在"OnInitialUpdate"中完成.

方法3. 多文档应用程序中实现两个对话框以选项卡的方式显示.

  1. 按照上述方法创建两个派生于CFormView的对话框.
  2. 为了让不同的选项卡显示不同的名字,可以在字符串表(string table)里新建一个字符串资源以备使用.如下图所示.
  3. 将"CXXXApp"类的CMDITestApp::InitInstance()函数中的pDocTemplate修改为该类的成员变量.并且新加一个相同类型的成员变量.
public:CMultiDocTemplate* pDocTemplate;CMultiDocTemplate* pChildDocTemplate;
  1. 新增的文档模板将第二个对话框与框架和文档连接起来.与pDocTemplate连接方法一致.函数的第一个参数可以设置为步骤2新建的那个字符串资源.
  2. 测试此时还是不能同时打开两个对话框.需要注释掉程序自动生成的新建文件函数,重载本类的新建文件函数
	//注释掉默认的文件新建函数//ON_COMMAND(ID_FILE_NEW, &CWinAppEx::OnFileNew)ON_COMMAND(ID_FILE_OPEN, &CWinAppEx::OnFileOpen)//重载使用自己的文件新建函数ON_COMMAND(ID_FILE_NEW, &CMDITestApp::OnFileNew)
  1. 重载的文件新建函数中内容如下.
void CMDITestApp::OnFileNew()
{// TODO: 在此添加命令处理程序代码pDocTemplate->OpenDocumentFile(NULL);pChildDocTemplate->OpenDocumentFile(NULL);}

notes:

1.在单文档应用程序的CXXXApp中新加入的头文件中,需要加入:#include “Resource.h”,才可以使用ID

2.可以选择新建对话框类型

在这里插入图片描述

http://www.lryc.cn/news/55907.html

相关文章:

  • 图像预处理方法
  • 【蓝桥杯C/C++】专题六:动态规划
  • 图的定义和基本术语
  • 041:cesium加载Blue Marble地图
  • 【概念梳理】激活函数
  • 【python】@property 和 @staticmethod
  • Spring题集 - Spring AOP相关面试题总结
  • 分考场
  • BI技巧丨DAX Studio
  • Java 8常用时间 API
  • C++运算符
  • 低/无代码赋能企业,IT与业务的角色正在悄然改变
  • SpringCloud学习2(Spring Cloud Netflix)负载均衡Ribbon、Feign负载均衡、Hystix服务熔断
  • Spring 源码解析 - @Async 注解下的循环依赖问题原理
  • 8个全球性编程比赛,天才程序员的梦想舞台
  • 2023年中国海洋大学计算机及电子信息考研分析
  • 【C++笔试强训】第六天
  • Redission 中的 RedLock 原理实现, springboot 你造吗?
  • 【沐风老师】3dMax一键房屋创建者插件使用方法详解
  • C/C++ 变量详解
  • 新SSD盘安装操作系统启动不了
  • 基于Spring、SpringMVC、MyBatis的病历管理系统
  • QT编程从入门到精通之三十四:“第五章:Qt GUI应用程序设计”之“5.5 Qt Creator使用技巧”
  • 网络工程方向有哪些SCI期刊推荐? - 易智编译EaseEditing
  • netty入门(二十六)任务加入异步线程池源码剖析
  • 神经网络算法入门和代码
  • 如何用一个端口同时暴露 HTTP1/2、gRPC、Dubbo 协议?
  • ToBeWritten之杂项2
  • Linux三剑客之awk命令详解
  • C++异常处理:掌握高效、健壮代码的秘密武器