VC++ class wizard介绍

Visual C++的集成开发环境向用户提供了一个功能很强的操作类的工具—ClassWizard,我们可以利用该工具非常方便地向应用程序中添加类、向类中添加消息处理函数、成员函数、以及添加成员变量等。

一 、ClassWizard简介

ClassWizard既可以操作由AppWizard在应用程序框架中创建的类,又可以操作后来由ClassWizard自己添加的类。利用ClassWizard可以很轻松地完成一些最基本、最普通的工作,如在自己的应用程序中创建新类、映射消息为其添加消息处理函数、覆盖虚拟函数、将对话框中的控件与某个变量相关联等。

ClassWizard只能用于使用MFC类库的应用程序中。

ClassWizard可以完成的主要功能如下:

◆ 创建新类。这是ClassWizard最基本的用途之一。创建的新类由一些主要的基类派生而来,这些基类用于处理Windows的消息,对一般用户来说,这些基类已经足够了。

◆ 进行消息映射。这些消息主要和窗口、菜单、工具栏、对话框、控件以及加速键相关联。

◆ 添加成员变量。利用ClassWizard,可以很方便地向类中添加成员变量,并将这些成员变量与对话框或窗口中的控件关联起来,当控件的值改变时,所对应的成员变量的值也跟着发生变化。

◆ 覆盖虚拟函数。使用ClassWizard可以方便地覆盖基类中定义的虚拟函数。

二 、ClassWizard操作说明

首先打开以前创建的多文档应用程序FirstApp,再选择菜单项View|ClassWizard,即可启动ClassWizard,进入ClassWizard环境,ClassWizard是一个对话框,其中包含五个选项卡,分别为:Message Maps、Member Variables、Automation、ActiveX Events、以及Class Info。它们针对不同的对象完成不同的任务。

1. Message Maps选项卡

它是ClassWizard对话框中最重要的选项卡,主要完成创建新类、添加、删除消息处理函数等任务。

该选项卡中包含了两个下拉列表框:Project下拉列表框和Class name下拉列表框;三个列表框:Object IDs列表框、Message列表框和Member functions列表框;一个文本信息框;四个工具按钮。

★ Project下拉列表框:该下拉列表框用于选择当前操作的项目。当当前打开的工作区中包含多个项目文件时,用户可以从这个下拉列表框中选择将要操作的项目文件。对于单项目工作区来说,其默认值就是项目文件。

★ Class name下拉列表框:该下拉列表框用于选择当前要操作的类。当用户在Class name下拉列表框中选中了某个类之后,Object IDs窗口中的内容将会发生相应的变化。

★ Object IDs列表框:该列表框用于显示当前选定类中能够产生消息的对象的ID值。这些对象包括菜单选项、工具栏按钮选项、对话框以及各种控件等。

通常Object IDs列表框中所包含的第一个对象就是当前类名。

★ Message列表框:Message列表框中列出了对应于Object IDs列表框中所选中的当前项可以处理的消息以及可被重写的MFC虚函数。当Object IDs列表框中选定当前类名时,Message列表框前部分显示的是当前类所能覆盖的虚拟函数,后部分显示的是能够处理的消息。如Object IDs列表框中选定其它对象,则Message列表框显示的就是当前项可以处理的消息。

★ Member functions列表框:Member functions列表框中列出了在Class name下拉列表框中所选中的当前类包含的所有成员函数。其中用字母“V”标出的是MFC虚函数,用字母“W” 标出的是Windows消息处理函数。

★ 文本信息框:在Project下拉列表框的下方有一个文本信息框,用于显示当前选中类的源文件,包括.h文件和.cpp文件。该文本信息框中显示的内容会随着选定类的变化而变化。

★ Add Class按钮:该按钮用于向当前的Project中添加一个新类,新类可以是自己创建,也可以是从已有的文件中选取。

★ Add Function按钮:该按钮用于向当前选定类中为当前选定的消息添加一个消息处理函数。其中类是在Class name下拉列表框中选定的类;而当前消息则是在Message列表框中选定的消息。

Add Function按钮平时是灰化禁止的,只有当用户在Message列表框中选中某个特定的消息之后,该按钮才能正常显示,即此时才能使用。

★ Delete Function按钮:该按钮用于在当前选定的类中删除已有的成员函数。Delete Function按钮平时是灰化禁止的,只有当用户在Member functions列表框中选中某个消息处理函数之后,才能选择该按钮。

★ Edit Code按钮:单击该按钮将打开编辑窗口,并将光标位置自动跳到当前选定的成员函数的源代码处。

2. Member Variables选项卡

该选项卡主要用于添加与对话框中的控件相关联的成员变量,以便程序能利用这些成员变量与对话框中的控件进行数据交换。该选项卡与Message Maps选项卡一样,也包含Project下拉列表框和Class name下拉列表框,分别用于选定用户操作的当前项目和当前类;Add Class按钮用于向当前项目中添加一个新类;一个文本信息框,用于显示当前选中类的源文件。

此外,Member Variables选项卡中还包含另一个列表框以及另外四个工具按钮。列表框中共有3列数据,分别为:

★ Control IDs:该项显示了当前选定类中能够映射成员变量的控件的ID值。所谓能映射成员变量的控件,就是可以使用类中的成员变量来代表某个控件,当控件发生改变时,该成员变量的值也发生相应变化。

★ Type:该项表示成员变量的类型。

★ Member:该项表示成员变量的名字。

注意:并不是所有的类都有这些信息,只有在选择了对话框类、有格式视图类或记录视图类时才能显示出这些信息。

★ Add Variable按钮:该按钮用于为当前选定的控件添加一个成员变量。

★ Delete Variable按钮:该按钮用于删除一个现有的成员变量。该按钮平时是灰化禁止的,只有当用户在Control IDs列表框中选中某个成员变量以后,才能选择该按钮执行删除工作。

★ Update Columns按钮:该按钮用于选定一个数据源,只在记录集合类中才可以使用。

★ Bind All按钮:只适用于记录集合类,单击此按钮将把所有未绑定的记录集里的数据成员绑定到数据源的一个表中相应的列上。在默认情况下,MFC AppWizard和ClassWizard将绑定所有的列,所以很少需要使用数据绑定。如果通过删除相关的数据成员将一些或所有列取消绑定,那么在这之后还可以重新绑定它们。

3. Automation选项卡

该选项卡允许用户加入方法或属性以增强Automation功能。

4. ActiveX Events选项卡

该选项卡允许用户加入事件以支持ActiveX控件。

5. Class Info选项卡

该选项卡用于显示和设置当前选定类中的一些重要信息。

三 、使用ClassWizard创建新类

使用ClassWizard最重要的作用就是创建新类,用户将不必手工添加创建类所需的大量代码,只需指定一些关于新类的重要信息,ClassWizard将自动为你生成这些代码。

下面以应用程序FirstApp为例说明创建过程。步骤如下:

(1) 首先打开FirstApp的项目工作区。

(2) 点击菜单项View|ClassWizard,进入ClassWizard对话框。

(3) 在Message Maps选项卡中选择功能按钮Add Class,并从其下拉选项栏中单击New选项,将会打开New Class对话框。

(4) 首先在Name栏中键入新类的名称,如FirstButton。此时我们将看到在下面的File name栏中显示出ClassWizard自动为新类定义的默认文件名:FirstButton.cpp。如果你不想要这个名字,也可以单击Change按钮对文件名进行修改。

(5) 接下来应当设定新类的基类,即该类是由什么类派生而来的。在Base class下拉列表框中选中所需的基类名,如CButton。

(6) 如果你创建的基类需要对话框或其它资源,则应当在Dialog ID框中选择一个资源ID值。

(7) Automation组框用于设置类的自动化信息,这只适用于能够自动化的类,即由CCmdTarget所派生的类,我们保持其默认选择None。

(8) 最后单击OK按钮结束。

至此我们已经成功地向项目中添加了一个新类FirstButton。

回到Visual C++的主窗口中,我们将发现在FirstApp的项目工作区中发生了一些变化。打开ClassView选项卡,将看到一个新类FirstButton已经被添加到该项目的类列表中了。同时在FirstView选项卡中将发现FirstApp项目中新增加了两个文件:FirstButton.h,FirstButton.cpp。

四、使用ClassWizard添加消息处理函数

使用ClassWizard来为类添加消息处理函数,用户将不需要手工编写消息映射所需的各种消息宏,这样大大减轻了工作量。

本节将以FirstApp应用程序为例来添加消息处理函数,处理用户在视图中的单击鼠标操作。步骤如下:

(1) 首先打开FirstApp的项目工作区。

(2) 点击菜单项View|ClassWizard,进入ClassWizard对话框。

(3) 选择Message Maps选项卡,在Project下拉列表框中选择项目名FirstApp,在Class name下拉列表框中选择类名CFirstAppView。

(4) 在Object IDs列表框中选择对象ID为CFirstAppView。

(5) 在Message列表框中选择需要处理的消息为WM_LBUTTONDOWN,即按下鼠标左键消息。

(6) 此时会发现Add Function按钮已经可用。单击此按钮,ClassWizard将选中消息的处理函数添加到Member Functions列表框中。在本例中,对应WM_LBUTTONDOWN消息的处理函数是OnLButtonDown()。

(7) 最后单击OK按钮结束。

注意:当用户为一些标准的Windows消息添加消息处理函数时,ClassWizard一般会自动地为你创建一个默认的消息处理函数名。而当用户为非标准消息添加处理函数时,ClassWizard将弹出一个对话框,并给出一个缺省的函数名,用户可以重新命名该消息响应函数。

在Visual C++的主窗口中打开项目工作区的ClassView选项卡,并打开CFirstAppView类的成员列表,就会发现消息处理函数OnLButtonDown()已经被添加进去了。

同时,通过查看文件,将会看到在CFirstAppView类的头文件FirstAppView.h中新加了消息处理函数OnLButtonDown()的声明。

可以看到该函数体是空的,其中只调用了一个其父类的成员函数,并且ClassView为用户生成了一些重要的注释行,以提示用户在何处添加自己的代码。

五 、使用ClassWizard添加成员变量

成员变量也是类中不可或缺的组成部分,用于保存类的信息,我们将利用ClassView来为类添加成员变量。具体步骤如下:

(1) 首先打开FirstApp的项目工作区。

(2) 点击菜单项View|ClassWizard,进入ClassWizard对话框。

(3) 在ClassWizard对话框中选择Member Variables选项卡,在Project下拉列表框中选择当前项目名FirstApp,在Class name下拉列表框中选择当前类名CAboutDlg。此时在Controls IDs列表框中将显示该类中包含的控件ID:“IDOK”,这个ID值对应于About对话框中的OK按钮。

(4) 单击Add Variables按钮,将打开Add Member Variables对话框。有3个控件用来设置新成员变量的一些重要信息。

◆ Member variables name文本框:该文本框用来输入新成员变量的名字,在默认情况下,ClassWizard提供“m_”这个前缀以便将这个变量确认为成员变量。

◆ Category下拉列表框:该下拉列表框用于指定新变量是一个“Value”类型的成员变量还是一个“Control”类型的成员变量。对于标准的Windows控件来说,选择Value可以创建一个包含由用户来输入控件文本和控件状态的成员变量。而当用户选中Control选项时,就可以创建一个“Control”类型的变量,我们可以对这个控件直接进行访问。

◆ Variable type下拉列表框:该下拉列表框用于选择变量的数据类型。

(5) 在Member variables name栏中输入变量名m_ok;在Category栏中选择该变量的类型:copntrol类型;在Variable type栏中选择该变量的数据类型CButton。

(6) 单击OK按钮退出,这时我们可以看到,ClassWizard对话框中发生了改变。

打开FirstApp程序的项目工作区,可以看到,在CAboutDlg类的数据成员中,新增加了一个成员变量:m_ok。在CAboutDlg类的成员函数DoDataExchange()中,也添加了一条语句来映射控件ID值IDOK和成员变量m_ok:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/771184.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

海量数据处理项目-账号微服务和流量包数据库表+索引规范(上)

海量数据处理项目-账号微服务和流量包数据库表索引规范(上) 第1集 账号微服务和流量包数据库表索引规范讲解《上》 简介:账号微服务和流量包数据库表索引规范讲解 短链平台大课难度层级曲线图:由浅入深 索引规范 主键索引名为…

卡行领航家用户端是怎么拼团怎么挣钱的?

#领航家代理政策/怎么代理/奖金制度/双2.0模式# 全国V:ok1234vip 领航家用户端:0.52费率 一次拼团0.44费率 两次拼团0.36费率 三次拼团0.2费率 ………… 十次拼团,客户每月挣20480 领航家代理端:无押激活返现高达166/台 分润万5-万…

Shell教程_不同Shell中管道操作符的差异

Shell教程_不同Shell中管道操作符的差异 不同的 Unix / Linux Shell (如 Bash, Zsh, Csh 和 Fish 等) 在语法方面存在一些差异, 主要是因为它们采用了不同的设计理念和语法规则。 这些差异在编写 Shell 脚本或在命令行中使用不同的 Shell 时可能会引起困惑和问题。 因此, 有…

P1383 高级打字机(可持续化线段树)

题目描述 早苗入手了最新的高级打字机。最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧。 请为这种高级打字机设计一个程序,支持如下 33 种操作: T x:Type 操作,表示在文章末尾打下一个小…

vue 中实现下载后端返回的流式数据

验证是否是blob /*** Event 验证是否为blob格式* */export async function blobValidate(data) {try {const text await data.text();JSON.parse(text);return false;} catch (error) {return true;}}get请求 /*** Event: get请求下载后端返回的数据流* description: url[Stri…

RockyLinux8 RockyLinux9安装postgresql16-devel开发包

1、PG的插件扩展有些需要自行编译,需要安装PG开发包 2、RockyLinux8安装 #创建用户先 useradd postgressudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm sudo dnf -qy module disab…

计算机网络复试总结(五)

可能会问: 基础知识问题: 请简述TCP/IP协议栈的层次结构及其功能。 TCP/IP协议栈的层次结构及其功能可以简要概述如下: 层次结构: TCP/IP协议栈通常被划分为四个主要层次,从底层到高层分别是网络接口层(也…

Flutter 旋转动画 线性变化的旋转动画

直接上代码 图片自己添加一张就好了 import dart:math;import package:flutter/material.dart;import package:flutter/animation.dart;void main() > runApp(MyApp()); //旋转动画 class MyApp extends StatelessWidget {overrideWidget build(BuildContext context) {re…

【python】正则表达式

文章目录 正则表达式对象re.RegexObjectre.MatchObject符号说明匹配基础匹配?=、?<=、?!、?<!字符类re模块编译正则表达式compile 函数匹配字符串re.matchre.searchre.findallre.finditer替换字符串re.sub分割字符串re.split正则表达式修饰符 - 可选标志主要用于网页…

ESCTF-逆向赛题WP

ESCTF_reverse题解 逆吧腻吧babypybabypolyreeasy_rere1你是个好孩子完结撒花 Q_W_Q 逆吧腻吧 下载副本后无壳&#xff0c;直接拖入ida分析分析函数逻辑&#xff1a;ida打开如下&#xff1a;提取出全局变量res的数据后&#xff0c;编写异或脚本进行解密&#xff1a; a[0xBF, …

Spring Task 知识点详解、案例、源代码解析

简介&#xff1a;Spring Task 定时任务   所谓定时任务。就是依据我们设定的时间定时运行任务&#xff0c;就像定时发邮件一样&#xff0c;设定时间到了。邮件就会自己主动发送。 在Spring大行其道的今天&#xff0c;Spring也提供了其定时任务功能&#xff0c;Spring Task。同…

【ARM64 常见汇编指令学习 22 -- ARMv8/v9 入栈寄存器介绍】

文章目录 ARMv8/v9 入栈寄存器介绍可以不入栈的寄存器需要入栈的寄存器&#xff08;被调用者保存的寄存器&#xff09;入栈顺序出栈顺序示例汇编代码 ARMv8/v9 入栈寄存器介绍 在 ARMv8 架构中&#xff0c;函数调用遵循一组称为 AAPCS64 &#xff08;ARMv8 64-bit Procedure C…

3.3 数据定义 数据库与系统概论

目录 3.3.1 模式的定义与删除 1. 定义模式 2. 删除模式 CASCADE&#xff08;级联&#xff09; RESTRICT&#xff08;限制&#xff09; 3.3.2 基本表的定义、删除与修改 表的定义 2.数据类型 3. 模式与表 4. 修改基本表 5. 删除基本表 3.3.3 索引的建立与删除 1. …

力扣刷题44-46(力扣0062/0152/0198)

62. 不同路径 题目描述&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff0c;机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角。问总共有多少条不同的路径&#xff1f; 思路&#xff1a; 其实就是问(0,0)->(m-1,n-1)一共有几条路。 第一个…

如何实高可用性(HA)的 Nginx 集群

声明&#xff1a;内容来自AI&#xff0c;未经验证&#xff0c;仅供参考! 为了实现高可用性&#xff08;HA&#xff09;的 Nginx 集群&#xff0c;可以使用 Linux Virtual Server (LVS) 作为负载均衡器。LVS 是 Linux 内核内置的负载均衡软件&#xff0c;它支持多种调度算法&…

突破限制:亚信安慧AntDB高速处理能力的解密

AntDB不仅仅是一款优秀的数据库管理系统&#xff0c;更是一套提供丰富数据分析和处理工具的集合&#xff0c;它为用户提供了更多可能性&#xff0c;帮助他们深入理解数据、挖掘数据背后的价值。在当今信息爆炸的时代&#xff0c;数据已经成为企业决策的重要支撑&#xff0c;而A…

QT_day4:对话框

1、完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配&…

ubuntu下安装minconda

1.搜索清华源 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 2.搜索conda 3.选一个合适自己的下载到本地 4.将下载的文件传入到ubuntu中 bash Miniconda3-py311_23.11.0-1-Linux-x86_64.sh 安装 5.source ~/.bashrc 激活即可&#xff08;必要步骤&#xff09;

Qt实现简易的多线程TCP服务器(附源码)

目录 一.UI界面的设计 二.服务器的启动 三.实现自定义的TcpServer类 1.在widget中声明自定义TcpServer类的成员变量 2.在TcpServer的构造函数中对于我们声明的m_widget进行初始化&#xff0c;m_widget我们用于后续的显示消息等&#xff0c;说白了就是主界面的更新显示等 …

[JVM]——垃圾回收

学习内容&#xff1a; GC、垃圾回收器、垃圾回收算法 目录 一、GC垃圾回收算法 1.1 可达性分析法 1.1.1 GC ROOT对象&#xff1a; 1.1.3 四种引用方式&#xff1a; ⭐小结&#xff1a; 1.2 其他回收算法 二、详解分代回收法&#xff1a; 三、垃圾回收器 3.1 串行垃圾…