对话框基础知识(二)--访问控件的五种方式

来源:互联网 发布: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);

五种方式的运行效果:



1 0
原创粉丝点击