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

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

相关文章

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

SpringIntegration消息路由之Router的条件路由与过滤功能

《SpringIntegration消息路由之Router的条件路由与过滤功能》本文详细介绍了Router的基础概念、条件路由实现、基于消息头的路由、动态路由与路由表、消息过滤与选择性路由以及错误处理... 目录引言一、Router基础概念二、条件路由实现三、基于消息头的路由四、动态路由与路由表五、消息过滤

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

Java实现将byte[]转换为File对象

《Java实现将byte[]转换为File对象》这篇文章将通过一个简单的例子为大家演示Java如何实现byte[]转换为File对象,并将其上传到外部服务器,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言1. 问题背景2. 环境准备3. 实现步骤3.1 从 URL 获取图片字节数据3.2 将字节数组

Javascript访问Promise对象返回值的操作方法

《Javascript访问Promise对象返回值的操作方法》这篇文章介绍了如何在JavaScript中使用Promise对象来处理异步操作,通过使用fetch()方法和Promise对象,我们可以从... 目录在Javascript中,什么是Promise1- then() 链式操作2- 在之后的代码中使

MyBatis的配置对象Configuration作用及说明

《MyBatis的配置对象Configuration作用及说明》MyBatis的Configuration对象是MyBatis的核心配置对象,它包含了MyBatis运行时所需的几乎所有配置信息,这个对... 目录MyBATis配置对象Configuration作用Configuration 对象的主要作用C

SpringBoot实现导出复杂对象到Excel文件

《SpringBoot实现导出复杂对象到Excel文件》这篇文章主要为大家详细介绍了如何使用Hutool和EasyExcel两种方式来实现在SpringBoot项目中导出复杂对象到Excel文件,需要... 在Spring Boot项目中导出复杂对象到Excel文件,可以利用Hutool或EasyExcel

Springboot控制反转与Bean对象的方法

《Springboot控制反转与Bean对象的方法》文章介绍了SpringBoot中的控制反转(IoC)概念,描述了IoC容器如何管理Bean的生命周期和依赖关系,它详细讲解了Bean的注册过程,包括... 目录1 控制反转1.1 什么是控制反转1.2 SpringBoot中的控制反转2 Ioc容器对Bea

Spring Boot整合消息队列RabbitMQ的实现示例

《SpringBoot整合消息队列RabbitMQ的实现示例》本文主要介绍了SpringBoot整合消息队列RabbitMQ的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录RabbitMQ 简介与安装1. RabbitMQ 简介2. RabbitMQ 安装Spring