zoukankan      html  css  js  c++  java
  • MFC数值型关联变量和控件型关联变量

    在MFC中常常要处理控件与控件实际关联变量(数据成员变量)之间的数据关系,MFC为我们提供了一种方式,通过将控件与其实际成员变量进行关联,通过DDX实现两者之间的数据交换。

    不采用关联变量来对控件进行设值的时候,使用如下方式来设置

    1使用GetDlgItem(IDC_EDIT1)->GetWindowTextW(变量名)     来获取控件内容

    2.逻辑处理(比如相加)..

    3.使用GetDlgItem(IDC_EDIT1)->SetWindowTextW(变量名)     来更新变量内容。

    采用关联变量时,分两类:

    当关联的数据是Value(数值型)数据时:

    使用UpdateData(TRUE)     将从获取控件值------>该值自动更新到关联变量中  【编辑器输入值-> cpp中实际对应的关联变量m_edit中】

    使用UpdateData(FALSE)   将更新控件值------>关联变量的值更新到界面中

    注:UpdateData()默认为True。

    当关联数据为控件型(Control类型):

    Control是一个控件,可以使用该控件的所有方法。

    如假设关联变量为m_CEdit.则可以使用m_CEdit.GetWindowTextW(变量名),将空间内容赋值到变量中

    使用m_CEdit.SetWindowTextW(变量名),将变量值更新到控件上。

    以完成一个简单的计算器加运算为例来说明当关联的数据是Value(数值型)数据时的处理过程:

    在Edit Control设置视图上,点击添加变量

    m_num1,m_num2,m_result均为编辑控件。

     实际代码添加内容如下:

    //MyCalDlg.h中
    public:
        // 数值1
        int m_num1;
        // 数值2
        int m_num2;
        int m_result;
    //MyCalDlg.cpp中
    CMyCalDlg::CMyCalDlg(CWnd* pParent /*=nullptr*/)
        : CDialogEx(IDD_MYCAL_DIALOG, pParent)
        , m_num1(20)
        , m_num2(50)
        , m_result(0)
    {
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }
    
    void CMyCalDlg::DoDataExchange(CDataExchange* pDX)
    {
        CDialogEx::DoDataExchange(pDX);
        DDX_Text(pDX, IDC_EDIT1, m_num1);//文本数据保存到m_num1变量中,DDX_Text可以理解为把字符串变量和控件的文本(WindowText)关联起来
        DDX_Text(pDX, IDC_EDIT2, m_num2);
        DDX_Text(pDX, IDC_EDIT3, m_result);
    }

    点击计算按钮,算出两数之和。

    void CMyCalDlg::OnBnClickedButton1()
    {
        UpdateData();//UpdateData默认参数为true:将控件里面的数值刷新保存到关联变量中
        m_result = m_num1 + m_num2;//没有加入UpdateData函数时,m_num1,m_num2都,将控件上输入的数据刷新到绑定的成员变量上来。此时m_num1为实际输入值11,22
        UpdateData(false);//FALSE:将关联变量(成员变量)中的值刷新到控件中显示。
    
    }
    View Code

     以完成简单的Edit Control控件文本显示为例说明当关联的数据是Control(控件型)数据时的处理过程:

    控件ID为:IDC_EDIT6 (Edit Control)

     

     实际代码添加内容如下:

    //MyCalDlg.h
    public:
    CEdit m_edit;
    View Code
    //MyCalDlg.cpp
    
    void CMyCalDlg::DoDataExchange(CDataExchange* pDX)
    {
    
      DDX_Control(pDX, IDC_EDIT6, m_edit);//控件型关联变量
    }
    View Code

    点击测试按钮后,控件设置的文本会显示在弹出对话框中

    DDX_Control()的作用可以理解为把变量和控件本身关联起来

    BOOL CMyCalDlg::OnInitDialog()
    {
        CDialogEx::OnInitDialog();
        m_edit.SetWindowText(L"设置显示文本");
    ...
    }
    View Code
    BEGIN_MESSAGE_MAP(CMyCalDlg, CDialogEx)
        ON_WM_SYSCOMMAND()
        ON_WM_PAINT()
        ON_WM_QUERYDRAGICON()
        ON_BN_CLICKED(IDC_BUTTON1, &CMyCalDlg::OnBnClickedButton1)
        ON_BN_CLICKED(IDC_BUTTON2, &CMyCalDlg::OnBnClickedButton2)
    END_MESSAGE_MAP()
    
    
    void CMyCalDlg::OnBnClickedButton2()
    {
        CString str;
        m_edit.GetWindowText(str);
        MessageBox(str);
    }
    View Code

    总结

    数值型关联变量和控件型关联变量

    1、如何选择使用哪一种类型的变量?
     
      如果你是操作它的数值,只要关心数值,不关心控件的样式、风格,可以选择数值型关联变量;
       如果要关心控件的风格,样式等,要操作控件,需要建立控件型关联变量。

    2、一种控件能不能可以同时关联两个类型的变量。

    3、数值型关联变量与控件型关联变量相关转化关系: 只有数值型关联变量,是不能得到控件型关联变量的,同时也不能得到控件的窗口指针, 但是,拥有控件型关联变量,一般能够获取到控件中的数值,比如,又有窗口指针,GetWindowText; 

       控件型能处理数值,数值型不能处理控件。

    4、数值型关联变量需要UpdateData,控件型关联变量不需要调用UpdateData。

  • 相关阅读:
    Vue.js中css的作用域
    vue搭建脚手架
    一对多,多对一关系映射
    java.time.format.DateTimeFormatter
    java.time.ZonedDateTime
    Akka(23): Stream:自定义流构件功能-Custom defined stream processing stages
    Akka(22): Stream:实时操控:动态管道连接-MergeHub,BroadcastHub and PartitionHub
    Akka(21): Stream:实时操控:人为中断-KillSwitch
    Akka(20): Stream:异步运算,压力缓冲-Async, batching backpressure and buffering
    Akka(19): Stream:组合数据流,组合共用-Graph modular composition
  • 原文地址:https://www.cnblogs.com/shuzhongke/p/15551811.html
Copyright © 2011-2022 走看看