Windows编程基础--第9节 MFC对话框控件访问的七种方法(下)

标签: MFC 控件
1960人阅读 评论(0) 收藏 举报
分类:

上节学习了MFC访问控件的三种方法,这节我们来学习剩下的四种方法,四种方法分别如下:

第四种
把控件和整型变量相关联

第五种
把控件和控件变量相关联

第六种
SendMessage方法

第七种
SendDlgItemMessage方法

方法四 把控件和整型变量相关联

1. 创建项目

打开上节用到的day08项目,切换到资源视图,添加一个按钮“方法4”,我们在此按钮上实现方法四,如图所示:
这里写图片描述

2. 关联整型变量

单击选择身高的输入框(IDC_EDIT_SG),右击选择“添加变量”,打开如下界面:
这里写图片描述
现在我们先选择类别为“value”,然后选择变量类型选择“int”,变量名“m_Height”,其余的默认就好,不过你也可以尝试修改一下最大值,最小值等。如图所示:
这里写图片描述
现在我们切换到解决方案视图,可以看见,day08Dlg.h中已经增加了一个类变量,m_Height,day08Dlg.cpp中DoDataExchange也增加该变量的关联方法,将变量 m_Height和IDC_EDIT_SG的输入框关联起来,如下:

void Cday08Dlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Text(pDX, IDC_EDIT_SG, m_Height);
}

还有day08Dlg的构造函数中也对m_Height进行了初始化,如下:

Cday08Dlg::Cday08Dlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(Cday08Dlg::IDD, pParent)
    , m_Height(0)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

我们可以看到m_Height的初始化值为0,现在我们编译运行程序,可以看到身高输入框中的值就为0,如图:
这里写图片描述
接下来我们分别关联IDC_EDIT_TZ和IDC_EDIT_BMI为变量int m_Weight,double m_BMI;

    int m_Height;
    int m_Weight;
    double m_BMI;

3.实现按钮事件

现在m_Height ,m_Weight ,m_BMI 分别和界面上的三个输入框相关联,所以我们可以直接取它们的值就可以,也可以直接进行赋值,但这是会用下面这个方法:

UpdateData(TRUE); //把控件的值关联到变量
UpdateData(FALSE); //把变量的值关联到控件

void Cday08Dlg::OnBnClickedButtonFunc4()
{
    // TODO: 在此添加控件通知处理程序代码
    UpdateData(TRUE);   //把控件的值关联到变量
    double dHeight = m_Height / 100.00;
    m_BMI = m_Weight / (dHeight * dHeight );
    UpdateData(FALSE);  //把变量的值关联到控件
}

编译运行,这时就可以看到点击方法4之后,BMI值就计算出来了,如图:
这里写图片描述

方法五 把控件和控件变量相关联

1. 添加“方法5”按钮

如图:
这里写图片描述

1. 关联控件变量

单击选择身高的输入框(IDC_EDIT_SG),右击选择“添加变量”,打开如下界面:
这里写图片描述

现在我们先选择类别为“control”,变量名“m_edit_Height”,其余的默认就好,不过你也可以尝试修改一下最大值,最小值等。如图所示:
这里写图片描述
接下来我们分别关联IDC_EDIT_TZ和IDC_EDIT_BMI为变量 CEdit m_edit_tz, CEdit m_edit_bmi;

    CEdit m_edit_sg;
    CEdit m_edit_tz;
    CEdit m_edit_bmi;

3.实现按钮事件

现在m_edit_sg,m_edit_tz,m_edit_bmi分别和界面上的三个输入框相关联,所以我们可以直接取它们的值就可以,也可以直接进行赋值,但这是会用下面这个方法:

void Cday08Dlg::OnBnClickedButtonFunc5()
{
    // TODO: 在此添加控件通知处理程序代码
    TCHAR tcHeight[10], tcWeight[10] , tcBMI[10];
    m_edit_sg.GetWindowText(tcHeight,10);
    m_edit_tz.GetWindowText(tcWeight,10);

    int nHeight = _ttoi(tcHeight);
    double dHeight = nHeight / 100.00;
    int nWeight = _ttoi(tcWeight);

    double bmi = nWeight/(dHeight * dHeight);
    char buf[28];
    sprintf(buf, "%.3f", bmi);
    m_edit_bmi.SetWindowText(buf);
}

方法六 SendMessage方法

通过SendMessage方法发送WM_GETTEXT消息到控件所在窗口来获取控件文本值,同样发送WM_SETTEXT消息到控件所在窗口来设置控件文本值;

void Cday08Dlg::OnBnClickedButtonFunc6()
{
    // TODO: 在此添加控件通知处理程序代码
    TCHAR tcHeight[10], tcWeight[10] , tcBMI[10];
    ::SendMessage(GetDlgItem(IDC_EDIT_SG)->m_hWnd,WM_GETTEXT,10,(LPARAM)tcHeight);
    ::SendMessage(GetDlgItem(IDC_EDIT_TZ)->m_hWnd,WM_GETTEXT,10,(LPARAM)tcWeight);

    int nHeight = _ttoi(tcHeight);
    double dHeight = nHeight / 100.00;
    int nWeight = _ttoi(tcWeight);

    double bmi = nWeight/(dHeight * dHeight);
    char buf[28];
    sprintf(buf, "%.3f", bmi);
    ::SendMessage(GetDlgItem(IDC_EDIT_BMI)->m_hWnd,WM_SETTEXT,10,(LPARAM)buf);
}

方法七 SendDlgItemMessage方法

通过SendDlgItemMessage方法发送WM_GETTEXT消息到控件所在窗口来获取控件文本值,同样发送WM_SETTEXT消息到控件所在窗口来设置控件文本值;

void Cday08Dlg::OnBnClickedButtonFunc7()
{
    // TODO: 在此添加控件通知处理程序代码
    TCHAR tcHeight[10], tcWeight[10] , tcBMI[10];
    SendDlgItemMessage(IDC_EDIT_SG,WM_GETTEXT,10,(LPARAM)tcHeight);
    SendDlgItemMessage(IDC_EDIT_TZ,WM_GETTEXT,10,(LPARAM)tcWeight);

    int nHeight = _ttoi(tcHeight);
    double dHeight = nHeight / 100.00;
    int nWeight = _ttoi(tcWeight);

    double bmi = nWeight/(dHeight * dHeight);
    char buf[28];
    sprintf(buf, "%.3f", bmi);

    SendDlgItemMessage(IDC_EDIT_BMI,WM_SETTEXT,10,(LPARAM)buf);
}

总结,以上七种方法虽然结果相同,但是其内部机制是有所区别的,在我们将来的编程中要根据实际情况来选择合适的方法,最后,我们列举一下这七种方法:

方法名 简介
GetDlgItem() 获取控件对象
GetDlgItemText() 获取对象文本
GetDlgItemInt() 获取对象整型值
DDX_Text(pDX,IDC_EDIT_SG, m_Height); 把控件和整型变量相关联
DDX_Control(pDX,IDC_EDIT_BMI,m_edit_bmi); 把控件和控件变量相关联
SendMessage 发送WM_GETTEXT消息到控件所在窗口来获取控件文本值
SendDlgItemMessage 发送WM_GETTEXT消息来获取控件文本值

项目源码可以访问我的码云

查看评论

Windows编程基础--第8节 MFC对话框控件访问的七种方法(上)

MFC对话框控件具有以下三种访问方式(当然还有很多别的访问方式,今天时间紧急,先学这三种),分别是: 第一种 GetDlgItem()->GetWindowText() GetDl...
  • qq_25549309
  • qq_25549309
  • 2017-10-24 21:51:13
  • 2026

MFC访问对话框控件的7种方法

MFC访问对话框控件的一些常用方法
  • pengz0807
  • pengz0807
  • 2015-08-15 20:50:41
  • 747

MFC学习笔记之:7种访问对话框控件的方式

7种访问对话框控件的方式,他们分别是:·GetDlgItem()->Get(Set)WindowText()·Get(Set)DlgItemText()·Get(Set)DlgItemInt()·将控...
  • a408789699
  • a408789699
  • 2011-03-31 14:06:00
  • 2836

一个对话框调用另一个对话框的控件值

我遇到的问题: 有两个平行对话框,其中一个对话框的校验和要根据另一个对话框的IP改变而重新计算改变,一直读取不到IP的值, 使用的方法,直接定义CIPDlg IPDlg,只能获得初值, exte...
  • nma_123456
  • nma_123456
  • 2012-08-10 11:27:36
  • 5040

MFC访问对话框控件的几种方式

1、通过对话框访问 /*******************************************/ int num1,num2,num3; CString str1,str2,str3...
  • h_wlyfw
  • h_wlyfw
  • 2014-03-07 12:11:06
  • 1431

MFC子线程访问主线程对话框程序的控件对象

最近在使用 VC 开发软件时需要用到多线程同步来解决开发过程中遇到的问题。本来以为只要象控制台程序一样,在主线程创建子线程,并设置好相应的对象事件就能解决问题,但是等到真正做起来,才在实践中发现原来事...
  • xbmoxia
  • xbmoxia
  • 2013-11-27 14:17:08
  • 4963

C++开发技术实例讲解

  • 2013年02月24日 16:36
  • 1.34MB
  • 下载

子对话框如何访问主对话框中的控件

在使用mfc的时候经常遇到自定义类访问主对话框控件的问题,例如自定义类中的方法要输出一段字符串到主对话框的EDIT控件、控制对话框的进度条等。    要在自定义的类中访问主对话框空间,须获得主对...
  • u010258235
  • u010258235
  • 2013-08-16 17:52:04
  • 1082

《Windows程序设计》读书笔九 子窗口控件

第九章 子窗口控件
  • sesiria
  • sesiria
  • 2016-07-10 00:59:17
  • 4732

一个MFC应用程序的生命周期

一个MFC应用程序的生命周期 (一)程序的进入点         MFC作为Win32 API的一种封装,它的程序进入点自然是WinMain。但是,这个WinMain也被封装起来,用户是看不到...
  • bluelilyabc
  • bluelilyabc
  • 2013-12-13 14:23:57
  • 871
    个人资料
    持之以恒
    等级:
    访问量: 4万+
    积分: 711
    排名: 7万+
    文章存档