当前位置: 首页 > 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.可以选择新建对话框类型

在这里插入图片描述

相关文章:

MFC - CFormView类学习1

CFormView简介 MFC提供了一个名为CFormView的特殊视图类,我们称其为表单视图。表单视图是指用控件来输入和输出数据的视图,用户可以方便地在表单视图中使用控件。表单视图具有对话框和滚动视图的特性,它使程序看起来象是一个具有滚动条的对话…...

图像预处理方法

图像预处理 膨胀腐蚀概述 ⚫ 膨胀、腐蚀属于形态学的操作, 简单来说就是基于形状的一系列图像处理操作 ⚫ 膨胀腐蚀是基于高亮部分(白色)操作的, 膨胀是対高亮部分进行膨胀, 类似“领域扩张”, 腐蚀是高亮部分被腐蚀, 类似“领域被蚕食” ⚫ 膨胀腐蚀的应用和功能: 消除噪声…...

【蓝桥杯C/C++】专题六:动态规划

专题六:动态规划 目录专题六:动态规划导读什么是动态规划解决的问题解题步骤动态规划应该如何debug记忆化搜索斐波那契数题目代码题解爬楼梯题目代码题解使用最小花费爬楼梯题目代码题解不同路径题目题解dfsdp凑硬币题目题解dfsdp滑雪题目代码题解汉罗塔…...

图的定义和基本术语

图的定义和基本术语1.图的定义2.图的基本术语3.图的分类1.图的定义 图是由顶点和有穷非空集合和顶点边的集合吗,表示为G(V,E)。 G表示一个图,V是图G的顶点(数据元素)的集合,E是图G中顶点之间边的集合。在图中&#xf…...

041:cesium加载Blue Marble地图

第041个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中加载Blue Marble地图。Blue Marble是一个术语,用来描述星球漂浮在浩瀚太空中的形象。早在 1972 年,阿波罗 17 号任务的工作人员就首次捕捉到了地球的标志性卫星图像,并将其称为“Blue Marble”。从那时起,NA…...

【概念梳理】激活函数

一、引言 常用的激活函数如下: 1、Sigmoid函数 2、Tanh函数 3、ReLU函数 4、ELU函数 5、PReLU函数 6、Leaky ReLU函数 7、Maxout函数 8、Mish函数 二、激活函数的定义 多层神经网络中,上层节点的输出和下层节点的输入之间具有一个函数关系,…...

【python】@property 和 @staticmethod

property 和 staticmethod 是 Python 中的两个装饰器,它们分别用于在类中创建属性或静态方法。它们的作用如下: property property:用于将类的一个方法作为属性访问。在 Python 中,使用“getter” 和“setter”方法来实现属性&a…...

Spring题集 - Spring AOP相关面试题总结

文章目录01. Spring AOP 的理解?02. Spring AOP 思想的代码实现03. Spring AOP 的相关术语有哪些?04. Spring AOP 基于注解的切面实现?05. Spring AOP 的通知有哪些类型?06. AOP 有哪些实现方式?07. Spring AOP 和 AspectJ AOP 有…...

分考场

[蓝桥杯 2017 国 C] 分考场(假题&#xff1a;最小色数) 题目描述 nnn 个人参加某项特殊考试。 为了公平&#xff0c;要求任何两个认识的人不能分在同一个考场。 求最少需要分几个考场才能满足条件。 输入格式 第一行&#xff0c;一个整数 n(1<n<100)n(1<n<100…...

BI技巧丨DAX Studio

DAX Studio DAX Studio&#xff0c;作为PowerBI外部插件使用率排名第一的插件&#xff0c;相信各位小伙伴或多或少都听说过&#xff0c;那么DAX Studio具体有哪些功能呢&#xff1f; PS&#xff1a;DAX Studio的下载链接&#xff0c;小伙伴们可以自行搜索&#xff0c;这里就不…...

Java 8常用时间 API

Date: 你不爱我了吗? &#x1f6a1;本地时间时区相关格式化在Java 8中&#xff0c;Instant类用于表示时间戳&#xff0c;相当于旧的Date类&#xff1b;LocalDateTime类用于表示日期和时间&#xff0c;相当于旧的Calendar类&#xff1b;DateTimeFormatter类用于格式化日期和时间…...

C++运算符

C运算符 运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 内置了丰富的运算符&#xff0c;并提供了以下类型的运算符&#xff1a; 算术运算符关系运算符逻辑运算符位运算符赋值运算符杂项运算符 1. 算术运算符 运算符描述实例把两个操作数相加A B 将得到 30-从第…...

低/无代码赋能企业,IT与业务的角色正在悄然改变

现在这个社会&#xff0c;年轻人的压力是真的大&#xff0c;需要会的技能多到数不清。想学习多点技能也不知道去哪学&#xff0c;主要是网络资源太丰富&#xff0c;很难找到一个适合自己的。那接下来推荐4个大神级别的资源网站你可一定得码住&#xff0c;都是年轻人特别 …...

SpringCloud学习2(Spring Cloud Netflix)负载均衡Ribbon、Feign负载均衡、Hystix服务熔断

文章目录负载均衡RibbonRibbon的作用代码实现生产者cloud1_provider实现配置文件在HiController中编写以下代码启动集群消费者cloud1_consumer实现引入依赖编写配置文件编写启动类&#xff0c;并给RestTemplate配置LoadBalanced注解编写RestController来测试Feign负载均衡简介F…...

Spring 源码解析 - @Async 注解下的循环依赖问题原理

一、Async 注解下的循环依赖问题 我们都知道 Spring IOC 单例模式下可以帮助我们解决循环依赖问题&#xff0c;比如下面自己依赖自己循环依赖的场景&#xff1a; Component public class TestAsync {ResourceTestAsync async;public void test() {System.out.println("t…...

8个全球性编程比赛,天才程序员的梦想舞台

很多编程爱好者在学习之初&#xff0c;都渴望与全球的程序员一较高下&#xff0c;以证明自己的实力。 一些全球性的编程竞赛为他们提供了这样的机会&#xff0c;不仅可以与全世界的顶尖程序员们交流&#xff0c;还有机会获得丰厚的奖金和进入顶级公司的机会&#xff0c;更重要…...

2023年中国海洋大学计算机及电子信息考研分析

考研时间跨度&#xff1a; 初试时间&#xff1a; 2022年8月23 海大推免及创新人才计划接收通知。 2022年9月13 海大专业目录及人数&#xff0c;包含推免。 2022年10月18 2022年硕士研究生计划 &#xff0c;不含推免。 海大2022年硕士研究生计划 网上第一次时间为2022年9月24日…...

【C++笔试强训】第六天

选择题 1. 解析&#xff1a;十进制转换为八进制就是不断的除8&#xff0c;取余数。十进制转换成其他进制的数就是除以进制&#xff0c;取余。 解析&#xff1a;注意printf的转换&#xff0c;%%只会打印一个%&#xff0c;所以选A。 解析&#xff1a;由于()的原因p先和*结合&…...

Redission 中的 RedLock 原理实现, springboot 你造吗?

分布锁之RedLock 锁住你的心我的爱 &#x1f682;为什么需要使用 RedLock锁被误释放时钟不一致问题锁的“延迟释放”而不是死锁Redlock是啥redlock 存在什么问题惊群效应时钟漂移Redisson 实现 RedLock在 Redisson 中, RedLock的实现类是哪一个类?这一招叫抛砖引玉springboot …...

【沐风老师】3dMax一键房屋创建者插件使用方法详解

3dmax一键房屋创建者&#xff0c;一键生成墙体、窗洞和门洞的插件&#xff01;这个脚本主要用于创建或捕获一些架构项目所代表的平面&#xff0c;这是通过导入它们并在每个所需的层添加值来实现的。传统方法&#xff0c;但是省事儿多了&#xff01; 【版本要求】 3dMax 2015及…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

【堆垛策略】设计方法

堆垛策略的设计是积木堆叠系统的核心&#xff0c;直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法&#xff0c;涵盖基础规则、优化算法和容错机制&#xff1a; 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则&#xff1a; 大尺寸/重量积木在下&#xf…...

rknn toolkit2搭建和推理

安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 &#xff0c;不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源&#xff08;最常用&#xff09; conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...

jdbc查询mysql数据库时,出现id顺序错误的情况

我在repository中的查询语句如下所示&#xff0c;即传入一个List<intager>的数据&#xff0c;返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致&#xff0c;会导致返回的id是从小到大排列的&#xff0c;但我不希望这样。 Query("SELECT NEW com…...

ThreadLocal 源码

ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物&#xff0c;因为每个访问一个线程局部变量的线程&#xff08;通过其 get 或 set 方法&#xff09;都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段&#xff0c;这些类希望将…...