八、为对话框添加类、对象(变量)以及消息响应函数

2024-06-17 00:18

本文主要是介绍八、为对话框添加类、对象(变量)以及消息响应函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.   为对话框添加类:

       a. 四种方法:

            *1. 在对话框空白处右键→建立类向导;

            *2. 在对话框空白处双击(推荐使用!方便快捷);

            *3. 菜单栏→查看(View)→建立类向导;

            *4. 快捷键Ctrl + W;

        b. 如果该对话框还没建立过类,则会弹出添加类对话框(Adding a Class),直接选择OK即可;

        c. 在添加类过程中(即在New Class对话框中)我们需要为在图形界面下设计的对话框取一个类名,这里我们取CStudentDlg:

             i.   C表示Class,即类,系统会为我们自动生成.cpp文件,其名字会去掉C;

             ii.  Dlg就是Dialog的缩写;

        d. 在创建时可以看到Dialog ID系统已经自动填写了IDD_STUDENTMANAGEMENT,即已经自动将创建的类和我们所设计的对话框关联起来了;

        e. 修改.cpp文件名:

             i.   在文件名过长不方便时应该直接修改类名;

             ii.  在文件名和已存在工程中的文件名冲突时可以考虑修改.cpp文件名,选择Change按钮进入修改即可;


2.   小结——从图形到类对象的实质:

       a. 即图形只是一种抽象,但是到了程序里面必须是要以数据描述的;

       b. 因此要为图形对象建立类,完成从图形到数据描述(即代码描述)的过渡;

       c. 而在MFC中建立图形和类之间的联系的实质就是将类、变量等直接和图形的ID建立联系;

       d. 也就是说类名、变量名等是对数据的描述,而ID则是对图形的描述,即前者是数据的代号,而后者是图形的代号;

    

3.   为对话框中的控件添加成员变量:

       a. 在图形界面下控件是对话框的一部分,因此在数据描述中,空间就应该是对话框类的成员变量,即成员对象;

       b. 打开类向导后,选择刚建立的对话框类,即ID为IDD_STUDENTMANAGEMENT,类名为CStudentDlg,选择Member Variable选项卡;

       c. 里面已经直接列出了对话框中包含的控件的ID,但是添加的成员变量还是空白的;

       d. 为每个ID所代表的的控件添加成员变量(即将图形界面下的控件和数据层面上的成员变量建立联系),两种方法:

            *1. 用鼠标点击相应的ID号,然后点击Add Variable;

            *2. 直接双击目标ID号;

       e. 接着就是输入各个成员变量名即可,而对于类型,系统已经根据控件的类型为你自动选好了:

            i.   编辑框对应变量的类型可定是CString的,因为框中输入的肯定是字符串;

            ii.  单选框对应变量的类型是int型的,这样可以方便使用switch语句判断用户选择的是哪个单选框,规则是按照Tab顺序0, 1, 2递增;

            iii. 复选框对应变量的类型是BOOL型的,是typedef过的int,同样也定义了TRUE和FALSE宏,其值分别为int型的1和0;

            iv.  列表和组合框对应的变量类型是CString的,因为框中显示的内容都是字符串;

            v.  对于字符串变量,可以在Maximum Characters中填写字符串的最大长度;

       f.  编辑完成确定后就会自动在类代码中生成这些变量的定义声明,同时会自动生成CStudentDlg类的构造函数:

CStudentDlg::CStudentDlg(CWnd* pParent /*=NULL*/): CDialog(CStudentDlg::IDD, pParent)
{//{{AFX_DATA_INIT(CStudentDlg)m_art = FALSE;m_clanguage = FALSE;m_duty = _T("");m_english = FALSE;m_grade = -1;m_ID = _T("");m_major = _T("");m_math = FALSE;m_name = _T("");m_philosophy = FALSE;m_physics = FALSE;//}}AFX_DATA_INIT
}
             i.   可见默认构造函数是将所有的内容都初始化为空的;

             ii.  _T宏,表示字符串所用的字符集(以TCHAR *str = _T("abc")为例):

                  *1. 在ANSI模式下编译就是:char *str = "abc";

                  *2. 在UNICODE模式下编译就是:wchar_t *str = L"abc";

                        其中_t和L都表示UNICODE字符集;

       g. 自动生成数据交换函数DoDataExchage:

void CStudentDlg::DoDataExchange(CDataExchange* pDX)
{CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CStudentDlg)DDX_Check(pDX, IDC_ART, m_art);DDX_Check(pDX, IDC_CLANGUAGE, m_clanguage);DDX_LBString(pDX, IDC_DUTY, m_duty);DDX_Check(pDX, IDC_ENGLISH, m_english);DDX_Radio(pDX, IDC_GRADE, m_grade);DDX_Text(pDX, IDC_ID, m_ID);DDX_CBString(pDX, IDC_MAJOR, m_major);DDX_Check(pDX, IDC_MATH, m_math);DDX_Text(pDX, IDC_NAME, m_name);DDV_MaxChars(pDX, m_name, 50);DDX_Check(pDX, IDC_PHILOSOPHY, m_philosophy);DDX_Check(pDX, IDC_PHYSICS, m_physics);//}}AFX_DATA_MAP
}
             i.   该函数将会在填写完对话框中的内容并点击OK退出对话框时调用;

             ii.  作用就是将对话框内填写的数据存入各个控件对象中以实现对用户数据的读取,专业地将就是实现后台和对话框的数据交换;

             iii. DDX_就是数据交换函数,即Do Data Exchange的缩写,从参数可以看出将指定ID号所代表的控件中的数据存入指定的成员变量中去;

             iv. 其还有一个功能,就是检验用户输入的数据是否合法,比如在为控件添加变量时如果设置过字符串的最大长度,则在这里则会以函数的形式体现出来,比如这里的DDV_MaxChars函数,用来检验交换而来的m_name变量中字符数是否超过50个;

             v.  所有数据检验函数都是以DDV_开头的;

             vi. DoDataExchange函数不是人为调用的,而是由UpdateData函数调用的,即对数据进行更新的一个函数,这很显然,当用户输入完对话框中的内容并按OK按钮退出时就应该调用UpdateData函数,其间接调用DoDataExchange函数实现用用户输入的数据对程序中的数据进行更新;


4.   为列表框和组合框添加初始化内容:

       a. 即当用户打开对话框时,对话框对象需要自动对列表框和组合框中的内容进行初始化,即提供选项供用户选择;

       b. 该项工作在OnInitDialog函数中完成,它同样也是一个消息相应函数,相应的消息是WM_INITDIALOG;

       c. 该消息一般会在打开对话框时发送给相应的对话框;

       d. 因此可以为相应对话框类添加相应该消息的函数,该函数理所当然是对话框类的成员函数;

       e. 在资源视图中CStudentDlg类上右键→Add Windows Message Handler..(即添加Windows消息响应);

       f.  然后在左侧双击WM_INITDIALOG将该消息响应添加到右侧存在的消息响应中,此时已经为该类添加了一个响应WM_INITDIALOG消息的函数了;

       g. 最后点击Edit Existing进入编辑该函数的代码区;

       h. OnInitDialog函数实现:

BOOL CStudentDlg::OnInitDialog() 
{CDialog::OnInitDialog();// TODO: Add extra initialization here//GetDlgItem函数的作用即使返回指定ID号的控件的指针//由于该函数返回的指针类型是控件类的父类,即CStudentDlg类//因此在这里需要进行强制类型转换(扩展转换,但是是安全的)CListBox *pList = (CListBox *)GetDlgItem(IDC_DUTY);pList->AddString("普通成员");//控件的通用成员函数,向列表框和组合框中添加新的字符串项目pList->AddString("班长");pList->AddString("副班长");pList->AddString("学习委员");pList->AddString("生活委员");	CComboBox *pCom = (CComboBox *)GetDlgItem(IDC_MAJOR);pCom->AddString("通信工程");pCom->AddString("计算机应用");pCom->AddString("电子技术");pCom->AddString("图书管理学");return TRUE;  // return TRUE unless you set the focus to a control// EXCEPTION: OCX Property Pages should return FALSE
}

这篇关于八、为对话框添加类、对象(变量)以及消息响应函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1067961

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

C# 中变量未赋值能用吗,各种类型的初始值是什么

对于一个局部变量,如果未赋值,是不能使用的 对于属性,未赋值,也能使用有系统默认值,默认值如下: 对于 int 类型,默认值是 0;对于 int? 类型,默认值是 null;对于 bool 类型,默认值是 false;对于 bool? 类型,默认值是 null;对于 string 类型,默认值是 null;对于 string? 类型,哈哈,没有这种写法,会出错;对于 DateTime 类型,默

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

API-环境对象

学习目标: 掌握环境对象 学习内容: 环境对象作用 环境对象: 指的是函数内部特殊的变量this,它代表着当前函数运行时所处的环境。 作用: 弄清楚this的指向,可以让我们代码更简洁。 函数的调用方式不同,this指代的对象也不同。【谁调用,this就是谁】是判断this指向的粗略规则。直接调用函数,其实相当于是window.函数,所以this指代window。

js小题:通过字符串执行同名变量怎么做

在JavaScript中,你不能直接使用一个字符串来直接引用一个变量,因为JavaScript是一种静态类型语言(尽管它的类型在运行时可以变化),变量的名字在编译时就被确定了。但是,有几种方法可以实现类似的功能: 使用对象(或Map)来存储变量: 你可以使用一个对象来存储你的变量,然后使用字符串作为键来访问这些变量。 let myVars = { 'var1': 'Hello', 'var

Python分解多重列表对象,isinstance实现

“”“待打印的字符串列表:['ft','bt',['ad',['bm','dz','rc'],'mzd']]分析可知,该列表内既有字符对象,又有列表对象(Python允许列表对象不一致)现将所有字符依次打印并组成新的列表”“”a=['ft','bt',['ad',['bm','dz','rc'],'mzd']]x=[]def func(y):for i in y:if isinst

消息认证码解析

1. 什么是消息认证码         消息认证码(Message Authentication Code)是一种确认完整性并进行认证的技术,取三个单词的首字母,简称为MAC。         消息认证码的输入包括任意长度的消息和一个发送者与接收者之间共享的密钥,它可以输出固定长度的数据,这个数据称为MAC值。         根据任意长度的消息输出固定长度的数据,这一点和单向散列函数很类似

rocketmq问题汇总-如何将特定消息发送至特定queue,消费者从特定queue消费

业务描述 由于业务需要这样一种场景,将消息按照id(业务id)尾号发送到对应的queue中,并启动10个消费者(单jvm,10个消费者组),从对应的queue中集群消费,如下图1所示(假设有两个broker组成的集群):  producer如何实现 producer只需发送消息时调用如下方法即可 /*** 发送有序消息** @param messageMap 消息数据* @param

Spring 集成 RabbitMQ 与其概念,消息持久化,ACK机制

目录 RabbitMQ 概念exchange交换机机制 什么是交换机binding?Direct Exchange交换机Topic Exchange交换机Fanout Exchange交换机Header Exchange交换机RabbitMQ 的 Hello - Demo(springboot实现)RabbitMQ 的 Hello Demo(spring xml实现)RabbitMQ 在生产环境

SpringBoot中如何监听两个不同源的RabbitMQ消息队列

spring-boot如何配置监听两个不同的RabbitMQ 由于前段时间在公司开发过程中碰到了一个问题,需要同时监听两个不同的rabbitMq,但是之前没有同时监听两个RabbitMq的情况,因此在同事的帮助下,成功实现了监听多个MQ。下面我给大家一步一步讲解下,也为自己做个笔记; 详细步骤: 1. application.properties 文件配置: u.rabbitmq.ad