原创 ---控件变量绑定
概述:一个控件可以绑定多个不同类型的变量。
说明:
1、这里所谓的不同类型,似乎只有两种:(有些只有一种,比如按钮控件)
a : 对象变量与控件本身绑定----control类型
(如编辑框绑定了一个CEidteedit对象,可通过对象调用edit.SetDlgItemText()对控件属性操作)
b: 变量与控件内容绑定 -----value类型
(如编辑框的内容,可定义CString类的某个具体变量与之绑定,通过刷新,可直接把变量显示到编辑框中。亦可通过刷新,把用户输入编辑框的内容,赋值给绑定变量。内容还可以绑定int类型。)
如图:
http://p.qlogo.cn/qqmail_head/cZVA8I2lXTGxPRVqQiby2Y4Qgcdd5rRxQvmmUKqLyjdGIsq4picI8icjHEbXBlet0jWMIwDUeCtzop0g1BFoaPLPrgbhicmB4jcgnib7H1Y4DekU5GRmtz8WvBDNOJt4FaLI63ARVE8liaIZ2XhRIOIicSxpXk7FwMd89ibL/0
对象变量与控件本身绑定的方法:
一、获得控件指针
获得指针,操作指针变量就能操作控件,也可以说这是一种绑定。
如:用指针调用各种成员函数,操作控件属性
CButton*p =(CButton*)GetDlgItem(ID);//控件ID与载体窗口指针,得到控件指
针
p->EnableWindow(false);//让按钮变灰
二、控件绑定类对象
概述:类对象与之绑定。与对话框绑定的不同之处是,其控件绑定后,默认就成为了对话框类的成员变量。
然后对对象的操作,就等同于对控件的操作。
绑定步骤如下图:(注意,与绑定窗口对象的区别,见模态与非模态对话框)
http://p.qlogo.cn/qqmail_head/cZVA8I2lXTGxPRVqQiby2Y4Qgcdd5rRxQvmmUKqLyjdGIsq4picI8icjHEbXBlet0jWMIwDUeCtzoomlCLribKU3rKIl0nibAjKrDJrJ3v8vRek0OTCab6BqJfQM6xa77W5aJrWIxWjGLSkOpuibjjSzOQjWvLgCzFnzyB/0
http://p.qlogo.cn/qqmail_head/cZVA8I2lXTGxPRVqQiby2Y4Qgcdd5rRxQvmmUKqLyjdGIsq4picI8icjHEbXBlet0jWMIwDUeCtzoo3TjKJ6SC5DavE7qN2HP6v2J4bicD98K6nHYzRNpjQc4SgKa1xBJ3Jm0TchnUReibuq6xm8sWJ3onxwcoCP2cDkh/0 http://p.qlogo.cn/qqmail_head/cZVA8I2lXTGxPRVqQiby2Y4Qgcdd5rRxQvmmUKqLyjdGIsq4picI8icjHEbXBlet0jWMIwDUeCtzorbodtJb03kiaVJHVvU82QDqgAGzkPYkbtb5N3xAY5ricTPjvxicEicXEF5Uw3S0gWNm5uInzTntUrYbzORzhicrKIKY/0
http://p.qlogo.cn/qqmail_head/cZVA8I2lXTGxPRVqQiby2Y4Qgcdd5rRxQvmmUKqLyjdGIsq4picI8icjHEbXBlet0jWMIwDUeCtzoqvL1oF4btrVE3GuRy7bRKYSVvIFUgp9tKZpF2UlgjzMmxZSFGQS9u331mr36zQD17Br1PhDow5sONdBciaPRZ38/0
说明:
1、绑定对话框,是用add class . 绑定对话框里的控件,是add variable
2、绑定控件后,会默认自动添加成为对话框的类成员变量。而对话框绑定对象,由自己定义位置。
如图:(控件绑定的对象能放到别的地方不作为成员变量吗?)
http://p.qlogo.cn/qqmail_head/cZVA8I2lXTGxPRVqQiby2Y4Qgcdd5rRxQvmmUKqLyjdGIsq4picI8icjHEbXBlet0jWMIwDUeCtzorw3vJKA8frLA2h11ymkbKvzNVGYGMwOvia4DicibhIKVdu9XE2PeyibRNicWtoxSG2ekeDrtFOtuI2ned0ApkU0ciaiaQ/0
3、绑定的关联代码:
http://p.qlogo.cn/qqmail_head/cZVA8I2lXTGxPRVqQiby2Y4Qgcdd5rRxQvmmUKqLyjdGIsq4picI8icjHEbXBlet0jWMIwDUeCtzoogv6DJfEXnIcGVVRd8qYic3n5UQYBNzuAJiaIeeibIXbpUZH6RcXnoV2TAoKGWFsibribEX63F7lmfBnlDm19Dib8JqP/0
4、绑定操作有时会失败!!!需要查看绑定代码是否存在!!
注意:有时候编译器会绑定失败,(没有任何提示)所以有时需要手动。
(如何添加???等下再补充)
5、一个控件能绑定多种类型变量,同一类型只能绑定一种。
6、对话框绑定,其绑定的是基类的派生类。而控件绑定,是基类。
7、对话框绑定,是派生“类”与之绑定。控件绑定,是基类的某个具体的对象与之绑定(不是类与之绑定)
变量与控件内容绑定方法:
给编辑框绑定字符串变量cstring
步骤:
1,如图:
http://p.qlogo.cn/qqmail_head/cZVA8I2lXTGxPRVqQiby2Y4Qgcdd5rRxQvmmUKqLyjdGIsq4picI8icjHEbXBlet0jWMIwDUeCtzopiac5ZphZDICNAiaT4IQa6IvuKrqmJIH7YWnUllX7ItYsombN6dnVktQhPjCAFOpnDjCGrzqmUI2zFhW8cSYUJ0l/0
http://p.qlogo.cn/qqmail_head/cZVA8I2lXTGxPRVqQiby2Y4Qgcdd5rRxQvmmUKqLyjdGIsq4picI8icjHEbXBlet0jWMIwDUeCtzor4XDhYvxCtn0dP6INFITrTQZTic1He10ibY66XI4Vh2Y2txGQJHK90X28bHEA8G5eL6ibg3KoRuv1n3ahG6PQaZnV/0
2、手动查看是否关联成功,如果没有需要自己添加代码(如何添加?)
http://p.qlogo.cn/qqmail_head/cZVA8I2lXTGxPRVqQiby2Y4Qgcdd5rRxQvmmUKqLyjdGIsq4picI8icjHEbXBlet0jWMIwDUeCtzoqhwRFV197KcPicXbq2XjEzO7l3rPeLmsw8lf3B9QYwZ48ibR1ca5zO4EkInvwBVlia2lQqkrof3ZWlSDQQ9ARIk9a/0
http://p.qlogo.cn/qqmail_head/cZVA8I2lXTGxPRVqQiby2Y4Qgcdd5rRxQvmmUKqLyjdGIsq4picI8icjHEbXBlet0jWMIwDUeCtzopEU7EMAK82XZV5Ytan6jDI81WRRLGU2KiaGkRlp1sLUvTKXFNLshPglsPVKbibAsVpZnPoXbxcJ6uZkIcSHSNScib/0
与int类型绑定:
步骤:
同上,如果之前绑定了CString 需要删除绑定才能绑定int
Value类型的使用:
UpdateData(false);//把绑定的变量内容赋值给编辑框显示出来
UpdateData(true);//把编辑框现有内容赋值给绑定的变量
如:CString类型m_Edit变量,在初始化中添加代码:
m_Edit = "你好";
UpdateData(false);
http://p.qlogo.cn/qqmail_head/cZVA8I2lXTGxPRVqQiby2Y4Qgcdd5rRxQvmmUKqLyjdGIsq4picI8icjHEbXBlet0jWMIwDUeCtzoq7Cfa1ibu3zTZ1kKLdiaGrWv0Vib2uicnRGXEbq2XWwu0Wt0bSW8ibmcAOy7pC3icNfJ6VO3ncKhXDsyCFPseXZsz8EU/0
在按钮响应函数中添加代码:
void CMFCDialogDlg::OnOK()
{
UpdateData(true);
MessageBox(m_Edit);
CDialog::OnOK();
}
http://p.qlogo.cn/qqmail_head/cZVA8I2lXTGxPRVqQiby2Y4Qgcdd5rRxQvmmUKqLyjdGIsq4picI8icjHEbXBlet0jWMIwDUeCtzorwdFbQBmzZ3eiaKINXvmcGicm6e9xaib55bPXjQuYudb6OwdiaBlhNoPdl6OmSGBzKwtFKRAphY0YgguvWw1TSs9IM/0
我们在编辑框中写入新值,结果证明 UpdateData(true);后,自动把编辑框内容赋值给了绑定的变量。
int 类型 绑定变量:
初始化中:
m_Iedit = 123;
UpdateData(false);
http://p.qlogo.cn/qqmail_head/cZVA8I2lXTGxPRVqQiby2Y4Qgcdd5rRxQvmmUKqLyjdGIsq4picI8icjHEbXBlet0jWMIwDUeCtzooggG2tPEWvd3Fibib738qvhcYaps8sZO5g3StHib8kU8Lw70iaOznYKCXCWgyRFh4O5j0MIT46ZLATQjWWb97xuTG4/0
显示成功。
在按钮响应代码中添加:
void CMFCDialogDlg::OnOK()
{
CString Cshow;
UpdateData(true);
Cshow.Format("%d",m_Iedit);
MessageBox(Cshow);
CDialog::OnOK();
}
显示:一个系统提示弹出,关闭后是自定义弹窗,关闭后又是系统弹窗,然后主窗口不关闭
如果把CDialog::OnOK();去掉,则系统提示窗口不会弹出两次,主窗口依然不关闭。
http://p.qlogo.cn/qqmail_head/cZVA8I2lXTGxPRVqQiby2Y4Qgcdd5rRxQvmmUKqLyjdGIsq4picI8icjHEbXBlet0jWMIwDUeCtzoq2qB6QXz48MsRL2RljWicAr3VAlDQxJF7wkA61xHSAjtpcwaNVvvj8bsoBTXLL93NVnr4iaZJgTCsZxTBh8OSFJG/0
http://p.qlogo.cn/qqmail_head/cZVA8I2lXTGxPRVqQiby2Y4Qgcdd5rRxQvmmUKqLyjdGIsq4picI8icjHEbXBlet0jWMIwDUeCtzooTy45dZB9qSbx7V4udliakzKqmbDuHC1UUZJQtgjGSiaJ5eLYhaw6oI6DgHiawQjOPricTvuzWiafhqhxINicYVgG87P/0
http://p.qlogo.cn/qqmail_head/cZVA8I2lXTGxPRVqQiby2Y4Qgcdd5rRxQvmmUKqLyjdGIsq4picI8icjHEbXBlet0jWMIwDUeCtzoonRgTuwet9FyDxbx0FVibA8ONCYpzOrOKfR9MUv78U2D8rvq8kG7DyPnPcyoPGgOXKWJXuMhN9wRFPiaN9N6dfxo/0
int 类型绑定说明:
1、UpdateData(false);UpdateData(true);内部自动完成类型转化
int 是整形,而编辑框上,不管是文字还是数字,都是字符形式。理论上说需要转化才能赋值。
但是这里却调用UpdateData即可刷入变量或从变量里读取数据到编辑框
2、系统提示与绑定内部机制
实验可以看出,在类型出错的情况下,本来 CDialog::OnOK();应该关闭的,现在没有关闭。(无错正常关闭)
第一个系统提示,是UpdateData刷入时发送的,然后是MessageBox弹出。这说明程序在往下走,之后执行CDialog::OnOK();时,又一次弹出系统提示。
这应该是内部消息机制等被UpdateData影响了,以至于窗口没被关闭,具体以后再找时间再研究。
3、UpdateData会自动提取编辑框中的数字,赋值给绑定变量(虽然有系统提示)
http://p.qlogo.cn/qqmail_head/cZVA8I2lXTGxPRVqQiby2Y4Qgcdd5rRxQvmmUKqLyjdGIsq4picI8icjHEbXBlet0jWMIwDUeCtzooa5nB4Y5JIlPpAhKXK36ocs3fAV0A3L8VaARAuUjF7jBibxHuD8qBicv3dWFBkcO1WkM6120sWI7ARbgspRqH7M2/0
补充:
1、绑定失败(无提示),自己手动添加绑定(如 int 需要找后面对应的int类型)
选中DDX_Text后跳至定义:
http://p.qlogo.cn/qqmail_head/cZVA8I2lXTGxPRVqQiby2Y4Qgcdd5rRxQvmmUKqLyjdGIsq4picI8icjHEbXBlet0jWMIwDUeCtzoqU4gGv9P2FUzMsOl0x4dFjtunFmofoj5tb0pfWvbU1aeTumpvSyQfPM5Mt4nOD1ULbtETe5IzeavibFs7iaGYr3A/0
复制后传参数:DDX_Text(pDX, IDC_EDIT1, m_Edit);
pDX照抄。IDC_EDIT1是绑定的IDm_Edit是绑定的变量名
2、int与CString类型默认的初始化值的代码位置:
http://p.qlogo.cn/qqmail_head/IfxTggBdwVJjfHa7FxIVI0XwDF2BbqRu1d69WbibLR33E5zmRvZb9wfhMUBTTyu6e/0
CString同样在这里(这里没绑定),他默认是m_edit = _T("");
3、CString类型绑定中的字符数限定设置,int类型绑定中的最大最小值设置
http://p.qlogo.cn/qqmail_head/PiajxSqBRaEJNKYakibPljoibaaibYetLYTFdMegzmxhDfgcGhDq44sVykllEVa1y6CGACGnb5YWTeib8XBVN6HJBBnJvcGhe63Ul/0
此时代码上会自动添加:(如果没有,需要手动添加)
注意:DDV_MaxChars不能单独使用,必须前面要先有DDX_Text
我们按下确定后,会弹出提示(但是我们没有自定义确定响应,也就是说,范围设置,途中改变了默认确定消息,使得弹出提示与本应该关闭主对话框的,而现在没有关闭)
但是CString类型确是可以实时的!!
范围限制,不是实时的(比如我们写的时候不会提示,只有按下确定后才会提示,我们也可以初始化时就超过范围。)
(怎样能实时进行,教程上没说,但应该是有方法的)
同理,还有CString类型的最大字节数限制:(注意是字节)
http://p.qlogo.cn/qqmail_head/IfxTggBdwVJjfHa7FxIVI0XwDF2BbqRuR1ZOmoyYXHaiaZSbsibBPAq4eUaElZFf5a/0
http://p.qlogo.cn/qqmail_head/IfxTggBdwVJjfHa7FxIVI0XwDF2BbqRuOjfXicdBpUA4liaH2ibefZia8oUzFmYnCq81/0
注意,这个是实时的,5字节,在窄环境下,2个中文,第三个就无法输入中文,只能是英文,而且再也输不进第4个字符了。
按确定后,是正常的退出了!!
为何CString能做到实时而Int无法做到实时呢?
但是我们可以通过初始化来打破其字节限制:
http://p.qlogo.cn/qqmail_head/IfxTggBdwVJjfHa7FxIVI0XwDF2BbqRum03t2ZNDyKLvBm9ErpTQjf9dArk99mkb/0
这个时候,我们再按下确定时,他就变成提示弹出跟不退出了。
页:
[1]