2 hy17003 hy17003 于 2014.11.27 23:38 提问

几个CString变量会相互干扰吗?

在学习ComboBoxEx控件时遇到一个非常奇怪的问题,我写了一个小程序来说明这种情况:
1、我添加一个ComboBoxEx和两个静态文本控件:
alt text
添加为控件添加变量,分别为:
CComboBoxEx m_ComboBox;
CString m_str1;
CString m_str2;
2、在OnInitDialog()函数中,为ComboBoxEx控件添加三个项:
COMBOBOXEXITEM cbi;
CString strTemp[3];
strTemp[0]=_T("Tom");
strTemp1=_T("LiLei");
strTemp2=_T("Lucy");
cbi.mask=CBEIF_TEXT;
for (int i=0;i<3;i++)
{
cbi.iItem=i;
cbi.pszText=(LPTSTR)(LPCTSTR)strTemp[i];
cbi.cchTextMax=256;
m_ComboBox.InsertItem(&cbi);
}
3、在控件的OnCbnSelchangeComboboxex1()函数中添加以下代码,当选择ComboBoxEx上的项时,会激发这个函数:
void CComboboxTestDlg::OnCbnSelchangeComboboxex1()
{
CString str;
//CString str("Dummy_String");
COMBOBOXEXITEM cbi;
cbi.pszText=(LPTSTR)(LPCTSTR)str;
cbi.iItem=-1;
cbi.mask=CBEIF_TEXT;
cbi.cchTextMax=256;
m_ComboBox.GetItem(&cbi);
//m_str1=str;
UpdateData(FALSE);
}
注意,这里我并没有为两个静态文本控件赋任何值。
4、问题出现了:运行的效果如下:
alt text
当我选择ComboBox中的任意一项的时候,两个静态文本框的值都随着改变了,可是我没有写任何一句改变字符串str1和str2的代码呀?难道str1和str2他们和str是同一个内存地址???

5、如果我把代码中注释部分打开,改写代码如下:
void CComboboxTestDlg::OnCbnSelchangeComboboxex1()
{
CString str("Dummy_String");
COMBOBOXEXITEM cbi;
cbi.pszText=(LPTSTR)(LPCTSTR)str;
cbi.iItem=-1;
cbi.mask=CBEIF_TEXT;
cbi.cchTextMax=256;
m_ComboBox.GetItem(&cbi);
m_str1=str;
UpdateData(FALSE);
}
这样,就可以得到正确的结果,当我任选ComboBoxEx中任何一项的时候,只有静态文本框1的值随之改变了,因为我在代码中有m_str1=str这句,而静态文本框2的值没有改变。

5个回答

caozhy
caozhy   Ds   Rxr 2014.11.28 07:01

检查下你将Static映射到m_Str1、m_Str2的时候有没有错误,按理说不会。

hy17003
hy17003 检查了DoDataExchange函数,问题应该不是这里,我很想传附件上来,但是不知道怎么传
接近 3 年之前 回复
hy17003
hy17003 void CComboboxTestDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_COMBOBOXEX1, m_ComboBox); DDX_Text(pDX, IDC_STATIC1, m_str1); DDX_Text(pDX, IDC_STATIC2, m_str2); }
接近 3 年之前 回复
hy17003
hy17003   2014.11.28 09:23

这是DoDataExChange函数:
void CComboboxTestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_COMBOBOXEX1, m_ComboBox);
DDX_Text(pDX, IDC_STATIC1, m_str1);
DDX_Text(pDX, IDC_STATIC2, m_str2);
}
看样子问题不是在这里

oyljerry
oyljerry   Ds   Rxr 2014.11.28 09:37

看上去还是应该检查所有用到m_str1,m_str2两个变量的地方

lx624909677
lx624909677   Ds   Rxr 2014.11.30 10:04

获取CString的内容,要用GetBuffer来做,直接强转赋值会错

eagleyan
eagleyan   Rxr 2014.12.01 03:13

你在OnCbnSelchangeComboboxex1里调用UpdateData(FALSE)是重新初始化dialog而不是进行DDE,应该改成UpdateData(TRUE)或者UpdateData()

Csdn user default icon
上传中...
上传图片
插入图片