对话框基础知识(二)--访问控件的五种方式
来源:互联网 发布:html5 棋牌游戏源码 编辑:程序博客网 时间:2024/04/28 13:42
背景描述:
我们用实现这样的一个功能,在Num1和Num2编辑框中输入数据,点击求和按钮后,在Sum编辑框中显示这两个数的和,对话框界面如图1所示。
准备事项:
1.添加与这个对话框相关联的类,具体方法参见《对话框基础知识(一)》;
2.从工具箱从拖拽3个编辑框控件和3个文本控件,同时增加一个“求和”按钮
3.在所关联的对话框类中响应“求和”事件,完成算数功能,右键按钮添加“BN_CLICKED”类型的事件处理函数。
图1 求和对话框
本文就这个功能提供五种实现方式,下面一一展开:
方式一:
void CTestDlg::OnButtonAdd(){ // TODO: 在此添加控件通知处理程序代码 //公共部分代码 char szNumber1[11] = {0}; char szNumber2[11] = {0}; char szSum[11] = {0}; int nNum1 = 0; int nNum2 = 0; int nSum = 0; //方法一: //得到编辑框字符串 GetDlgItem(IDC_EDIT_NUM1)->GetWindowText(szNumber1, 10); GetDlgItem(IDC_EDIT_NUM2)->GetWindowText(szNumber2, 10); //字符转换 nNum1 = atoi(szNumber1); nNum2 = atoi(szNumber2); //求和 nSum = nNum1 + nNum2; //数组转换为字符串 _itoa_s(nSum, szSum, 10);//转换为10进制 //设置编辑框,显示结果 GetDlgItem(IDC_EDIT_SUM)->SetWindowText(szSum);}
接口说明:
CWnd* GetDlgItem( int nID ) const;
说明:
获得对话框中指定控件的指针。返回的指针通常被强制转换为nID所标识的控件类型。
int GetWindowText( LPTSTR lpszStringBuf, int nMaxCount ) const;void GetWindowText( CString& rString ) const;说明:
GetWindowText拷贝控件内的文本到字符缓冲区
void SetWindowText( LPCTSTR lpszString );说明:
SetWindowText设置控件内的文本。
方式二:
//方法二: //得到编辑框字符串 GetDlgItemText(IDC_EDIT_NUM1,szNumber1, 10); GetDlgItemText(IDC_EDIT_NUM2,szNumber2, 10); //字符转换 nNum1 = atoi(szNumber1); nNum2 = atoi(szNumber2); //求和 nSum = nNum1 + nNum2; //数组转换为字符串 _itoa_s(nSum, szSum, 10); SetDlgItemText(IDC_EDIT_SUM, szSum);接口说明:
int GetDlgItemText( int nID, LPTSTR lpStr, int nMaxCount ) const;int GetDlgItemText( int nID, CString& rString ) const;说明:
获得与对话框中的控件相关的标题或文本
void SetDlgItemText( int nID, LPCTSTR lpszString );说明:
设置窗口或对话框拥有的标题或是控件文本
方式三:
//方法三: //得到经转换的编辑框数字 nNum1 = GetDlgItemInt(IDC_EDIT_NUM1); nNum2 = GetDlgItemInt(IDC_EDIT_NUM2); //求和 nSum = nNum1 + nNum2; //显示编辑框结果 SetDlgItemInt(IDC_EDIT_SUM, nSum, TRUE);接口说明:
UINT GetDlgItemInt( int nID, BOOL* lpTrans = NULL, BOOL bSigned = TRUE )const;说明:
它将给定对话框中指定控件的文本转换为整数
void SetDlgItemInt( int nID, UINT nValue, BOOL bSigned = TRUE );说明:
对话框中给定控件的文本设为代表指定整数值的字符串
方式四:
该方法使用向对话框关联数据成员来实现,我们将三个编辑框分别和对话框类的三个成员变量相关联,然后通过这些成员变量来检索和设置编辑框的文本,这是最简单的访问控件的方式,添加步骤如下:
选择控件->鼠标右键->添加变量->l类型选择(Value),变量类型选择(int),如图2所示。
图2 绑定类型
我们需要添加的代码如下:
//方法四: UpdateData(TRUE);//数据获取,两个变量值更新为用户输入的值 m_nTotal = m_nNum1 + m_nNum2; UpdateData(FALSE);//初始化控件,显示结果当我们成员变量的添加,我们实际需要编写的代码就特别少,下面分析MFC如何完成数据更新和显示的基本原理。
当我们完成成员变量和控件的关联,MFC向导会向DoDataExchange函数中添加一部分代码,以完成对话框数据交换和校验,该函数有MFC框架调用。
void CTestDlg::DoDataExchange(CDataExchange* pDX){ CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT_NUM1, m_nNum1);//以下都是新增代码,DDX_TEXT完成指定控件和特定成员变量的关联 DDV_MinMaxInt(pDX, m_nNum1, -99, 99); //数据运行输入的范围 DDX_Text(pDX, IDC_EDIT_NUM2, m_nNum2); DDV_MinMaxInt(pDX, m_nNum2, -99, 99); DDX_Text(pDX, IDC_EDIT_SUM, m_nTotal);}DoDataExchang接口声明如下:
virtual void DoDataExchange( CDataExchange* pDX );说明:
框架调用这个函数以交换并校验对话框数据。
我们不要直接调用这个函数。它是由UpdateData成员函数所调用的。我们可调用UpdateData函数以初始化对话框控件或从对话框获取数据。
UpdateData接口声明如下:
BOOL UpdateData( BOOL bSaveAndValidate = TRUE );说明:
bSaveAndValidate = FALSE,初始化对话框(FALSE),更新界面值bSaveAndValidate = TRUE ,从对话框获取数据(TRUE)
小知识点:
Dialog Data Exchange 对话框数据交换
Dialog Data Validation 对话框数据校验
MFC提供了多种DDX_为前缀的函数,这些函数均是用来不同控件的数据交换。
方式五:
第五种方式我们将编辑框控件和一个变量相关联,这里我们关联的变量是控件变量,这些控件变量代表的是控件本身。由于编辑框控件是用类CEdit来描述,而CEdit类派生于CWnd类。因此,我们可以直接使用GetWindowText和SetWindowsText函数来完成数据的获取和更新。使用的内容和方法四类似,只是添加变量的类型是Control。
图3 添加控件类型
具体代码如下:
m_Edit1.GetWindowText(szNumber1, 10); m_Edit2.GetWindowText(szNumber2, 10); nNum1 = atoi(szNumber1); nNum2 = atoi(szNumber2); nSum = nNum1 + nNum2; _itoa_s(nSum, szSum, 10); m_EditSum.SetWindowText(szSum);
五种方式的运行效果:
- 对话框基础知识(二)--访问控件的五种方式
- 对话框控件访问的七种方式
- 访问对话框控件的7种方式
- 对话框控件的七种访问方式
- 访问对话框控件的方式
- 总结对话框控件访问的七种方式
- 总结VC6对话框控件访问的七种方式
- MFC访问对话框控件的几种方式
- MFC访问对话框控件的几种方式
- 对话框控件访问七种方式
- 对话框控件访问七种方式
- VC:对话框控件访问七种方式
- 对话框控件访问七种方式
- vc学习二:访问控件的方式
- 《MFC那点事儿》の访问对话框控件的方式
- 对话框控件访问七种方式转自孙鑫
- MFC学习笔记之:7种访问对话框控件的方式
- 对话框访问的七种方式
- wamp修改php.ini配置文件
- pyinstaller打包pyqt5问题解决
- 进一步优化—IE8以下浏览器不支持document.getElementsByClassName() 访问节点;怎么解决?---封装自己的类名
- 两段不重叠连续序列的和的最大值
- 74cms|骑士cms|开源招聘系统,数据结构
- 对话框基础知识(二)--访问控件的五种方式
- STM32 时钟系统
- Centos7安装iNode客户端
- org.eclipse.jgit.errors.LockFailedException: Cannot lock D:\xxx\.git\index
- (转)一篇图片处理优化思路 原文地址http://blog.chinaunix.net/uid-20806919-id-132246.html
- POJ 3189 二分+Dinic
- C语言求解0~2*PI(0~360度)弧度值
- linux服务器内存简单清理(centos)
- 进程的虚拟内存,物理内存,共享内存