MFC控件与变量的关联、控件与字符串等变量绑定

⌚Time: 2022-04-24 18:56:18

👨‍💻Author: Jack Ge

控件与变量的关联

对于一个MFC控件如CEdit控件,我们可以使用GetDlgItem得到控件指针,对控件进行操作


GetDlgItem(IDC_EDIT1)->SetWindowTextW(L"hello");

除此之外,还可以将控件与变量进行关联,通过变量来操作控件。

方法一

在窗体资源中,对控件右键,点击添加变量

设置变量名字点完成

之后通过变量edit_1即可操作控件IDC_EDIT1


edit_1.SetWindowTextW(L"hello");

方法二

在窗口头文件中定义CEdit变量


CEdit edit_1;

在源文件的DoDataExchange()函数中,手动关联控件和变量。DoDataExchange,顾名思义,进行控件与变量数据交换的函数


void CMFCTestDlg::DoDataExchange(CDataExchange* pDX)

{

    CDialog::DoDataExchange(pDX);

    //关联控件与变量

    DDX_Control(pDX, IDC_EDIT1, edit_1);

}

其中,DDX_Control函数管理着在对话框、表格视或控件视中被子类化的控件与对话框、表格视或控件视的CWnd数据成员之间的数据交换。


void AFXAPI DDX_Control( CDataExchange* pDX, int nIDC, CWnd& rControl );

pDX 指向CDataExchange对象的指针。框架提供了这个对象以建立数据交换的环境,包括其方向。  

nIDC 与控件属性相关的被子类化的控件的资源ID。  

rControl 对对话框、表格视或控件视的成员变量的引用,将与该变量发生数据交换。 

之后就可以操控edit_1来进行控件的操作


edit_1.SetWindowTextW(L"hello");

实现自定义控件的方法

方法二可以实现自定义控件的效果,例如:

通过类向导新建一个基于CEdit的类,自己覆写其中的一些函数,如覆写绘图函数实现控件外观的改变。

在窗体类包含该类的头文件,并使用它自定义一个变量


CMyEdit m_myEdit;

将控件资源与这个变量建立数据关联


void CMFCTestDlg::DoDataExchange(CDataExchange* pDX)

{

    CDialog::DoDataExchange(pDX);

    //关联控件与变量

    DDX_Control(pDX, IDC_EDIT1, m_myEdit);

}

就实现了自定义的CEdit控件

控件与文本、数值的绑定

可以将控件与文本,数值等变量相绑定。使用的函数为:


void AFXAPI DDX_Text( CDataExchange* pDX, int nIDC, CString& value );

void AFXAPI DDX_Slider( CDataExchange* pDX, int nIDC, int& value );

...

对于DDX_XXX函数,更多的参考MSDN:MFC Macros and Globals

对于与控件绑定的控件变量,他的数据是与控件相同步的。而对于这种手段绑定的文本变量等,需要使用UpdateData()函数来实现数据的更新

UpdateData()参数只有一个,默认为TRUE。

UpdateData(TRUE):刷新控件的值到对应的变量。(外部输入值交给内部变量)

UpdateData(FALSE): 拷贝变量值到控件显示。(变量的最终运算结果值交给外部输出显示)


void CMFCTestDlg::DoDataExchange(CDataExchange* pDX)

{

    CDialog::DoDataExchange(pDX);

    //关联控件与变量

    DDX_Text(pDX, IDC_EDIT1, str);

}

...

void CMFCTestDlg::OnBnClickedButton1()

{

    UpdateData(true);//刷新控件的值到对应的变量

    //控制台打印str的值

    AllocConsole();

    freopen( "CONOUT$", "w+t", stdout );// 申请写

    freopen( "CONIN$", "r+t", stdin );  // 申请读

    ::wprintf(str.GetBuffer());

    str.ReleaseBuffer();

    FreeConsole(); 

}



void CMFCTestDlg::OnBnClickedButton2()

{

    str=“hi”;

    UpdateData(false);//刷新对应的变量的值到控件

}

当点击button1时,CEdit控件里面的内容,就会赋值给str,并通过控制台打印出str

而当点击button2时,str的值就会改变CEdit控件里面的内容,并显示出来