关闭

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

标签: MFC控件
1934人阅读 评论(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消息来获取控件文本值

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

0
0
查看评论

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

7种访问对话框控件的方式,他们分别是:·GetDlgItem()->Get(Set)WindowText()·Get(Set)DlgItemText()·Get(Set)DlgItemInt()·将控件与整型变量相关联()·将控件与控件变量相关...
  • a408789699
  • a408789699
  • 2011-03-31 14:06
  • 2764

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

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

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

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

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

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

MFC对话框中的编辑控件的7种操作方式

//第一种方式          int num1,num2,num3;          char ch1[10],ch2[10],c...
  • u010879420
  • u010879420
  • 2016-10-09 17:59
  • 638

windows编程---对话框

用过windows的对于对话框并不陌生,其主要用于完成特定的任务,是人机交互的一个方式。对话框可以分为两种:模态对话框和非模态对话框。 模态对话框也可分为两种,一种是系统方式的模态对话框,这种对话框只有当其结束时,你才能访问其他窗口,例如单击关机按钮时,出现的包含待机,重启,关机三个按钮的对话框。...
  • zzh19811015
  • zzh19811015
  • 2012-08-28 11:34
  • 1035

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

1、通过对话框访问 /*******************************************/ int num1,num2,num3; CString str1,str2,str3; GetDlgItem(IDC_EDIT1)->GetWindowText(str1);...
  • h_wlyfw
  • h_wlyfw
  • 2014-03-07 12:11
  • 1402

在windows程序设计中,主窗口上的控件与对话框上的控件的区别

在windows程序设计中,主窗口上的控件与对话框上的控件的区别主要表现为:主窗口的控件需要调用 CreateWindow函数显示出来,但对话框上的控件是不需要调用CreateWindow来显示的,只需要画在对话框上就行。 比如在windows程序设计中的BTNLOOK.c程序中就是用了 case...
  • C2S2D2Nshishabi
  • C2S2D2Nshishabi
  • 2015-10-22 18:17
  • 647

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

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

MFC中在非主对话框中访问主对话框中的控件,及向主对话框发送消息

MFC中在非主对话框中访问主对话框中的控件,及向主对话框发送消息 问题1.访问主对话框中的控件 首先看如下代码: CDC *pDC = this->GetDC(); //得到当前鼠标点击处的像素值 COLORREF color = pDC->GetPixel(point)...
  • u014267567
  • u014267567
  • 2017-03-30 23:11
  • 226
    个人资料
    • 访问:40691次
    • 积分:697
    • 等级:
    • 排名:千里之外
    • 原创:28篇
    • 转载:6篇
    • 译文:0篇
    • 评论:1条
    文章分类