遇到的问题大概如下所述:
1 插入了一个对话框并且根据这个对话框新建了一个对话框类CDlgSet
对话框上有
①两个ComboBox控件:一个是IDC_COMBO1,样式为下移,也就是可以输入
②另一个是IDC_COMBO2,样式为下拉列表,只能选择不能输入
③还有一个Edit编辑框控件IDC_EDIT1
④还有一个CheckBox复选框控件IDC_CHECK1
2 关联成员变量
①为IDC_COMBO1关联value成员变量,由于IDC_COMBO1样式为下移,所以value类型只能是 CSting类型
IDC_COMBO2关联value成员变量,IDC_COMBO2样式为下拉列表,value类型只能是int类型
②为IDC_EDIT1关联UINT型成员变量
③为IDC_CHECK1关联BOOL型成员变量
3 问题描述
在CDlgSet类的WM_INITDIALOG消息处理函数中为IDC_COMBO1和IDC_COMBO2添加数据
((CComboBox*) GetDlgItem(IDC_COMBO1))->AddString(strArray[i]); //循环体内
在一个菜单命令响应函数中构造一个CDlgSet对象并且显示,目的想取得控件的值赋给其他变量并且当再次打开该对话框的时候对话框显示的是上一次设定的值,于是发现了一个问题:下移样式的IDC_COMBO1可以显示上一次的值但是下拉列表样式的IDC_COMBO2却没有显示上一次设定的值,而其他控件都可以。
//某菜单命令响应函数
void CMyProjectView::OnSet()
{
CDlgSet dlg;
dlg.m1 = member; //meber表示上一次保存的值, m1表示IDC_COMBO2对应成员变量 其他略 行4
UpdateData(FALSE); // 试图让控件显示的值刷新 行5
// codes
if(IDOK == dlg.DoModal())
{
UpdateData(TURE); //控件--->变量
member = dlg.m1;
UpdateData(FALSE); //变量—-->控件
}
}
结果发现当行4 行5处试图让控件刷新的时候却没有刷新出上一次的值,而其他控件都可以, IDC_COMBO1也可以,经过单步发现:代码是在DoModal()时才会去执行对话框的WM_INITDIALOG消息函数,而进入该函数之前IDC_COMBO2还没有填充值,所以行5处把member赋给IDC_COMBO2的int型成员变量试图刷新也没用,需要在该控件填充值以后刷新才可以,所以想到了在WM_INITDIALOG函数最后刷新,调用一下UpdateData(FALSE),再次运行正确。
NOTE:
IDC_COMBO1之所以可以刷新出新值是因为它是可以输入的,给它关联的成员变量赋值以后在行5处的刷新是起作用的,就算那时控件里没有值也没关系。
一定要注意到这以点:对话框的初始化函数是在对话框显示出来之前调用,是在执行DoModal()函数时。
?