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

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

相关文章

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

java向微信服务号发送消息的完整步骤实例

《java向微信服务号发送消息的完整步骤实例》:本文主要介绍java向微信服务号发送消息的相关资料,包括申请测试号获取appID/appsecret、关注公众号获取openID、配置消息模板及代码... 目录步骤1. 申请测试系统2. 公众号账号信息3. 关注测试号二维码4. 消息模板接口5. Java测试

Python变量与数据类型全解析(最新整理)

《Python变量与数据类型全解析(最新整理)》文章介绍Python变量作为数据载体,命名需遵循字母数字下划线规则,不可数字开头,大小写敏感,避免关键字,本文给大家介绍Python变量与数据类型全解析... 目录1、变量变量命名规范python数据类型1、基本数据类型数值类型(Number):布尔类型(bo

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使

一文全面详解Python变量作用域

《一文全面详解Python变量作用域》变量作用域是Python中非常重要的概念,它决定了在哪里可以访问变量,下面我将用通俗易懂的方式,结合代码示例和图表,带你全面了解Python变量作用域,需要的朋友... 目录一、什么是变量作用域?二、python的四种作用域作用域查找顺序图示三、各作用域详解1. 局部作

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

Spring中管理bean对象的方式(专业级说明)

《Spring中管理bean对象的方式(专业级说明)》在Spring框架中,Bean的管理是核心功能,主要通过IoC(控制反转)容器实现,下面给大家介绍Spring中管理bean对象的方式,感兴趣的朋... 目录1.Bean的声明与注册1.1 基于XML配置1.2 基于注解(主流方式)1.3 基于Java

C++/类与对象/默认成员函数@构造函数的用法

《C++/类与对象/默认成员函数@构造函数的用法》:本文主要介绍C++/类与对象/默认成员函数@构造函数的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录名词概念默认成员函数构造函数概念函数特征显示构造函数隐式构造函数总结名词概念默认构造函数:不用传参就可以