我想保存一个'用户名'和' ID'在Visual Studio 2010和WIN32(c ++)中的ComboBox中。以下代码用于将itemdata设置为combobox:
HWND hCB;
hCB = CreateWindowEx(0, L"COMBOBOX", 0x00,
CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE | WS_VSCROLL,
10, 10, 200, 100,
hWnd, NULL, (HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE), NULL);
WCHAR sTemp[256];
for (int i =0 ; i<4 ; i++)
{
wsprintf(sTemp, L"%s%d", L"User", i);
SendMessage(hCB, CB_ADDSTRING, 0, (LPARAM) sTemp);
wsprintf(sTemp, L"%s%d", L"ID", i);
SendMessage(hCB, CB_SETITEMDATA, (WPARAM)i, (LPARAM)sTemp);
}
从combobox获取itemdata的代码是:
WCHAR *sTemp;
for (int i=0; i < 4 ; i++)
{
sTemp = (WCHAR *)SendMessage(hCB, CB_GETITEMDATA, (WPARAM)i, 0);
MessageBox(NULL, sTemp, NULL, MB_OK);
}
问题是,MessageBox没有显示任何内容。 当我通过为每个组合框项添加CB_GETITEMDATA消息来检查代码的第一部分,以及显示结果的MessageBox时,我发现所有项的值都是&#39; itemdata是&#34; ID3&#34;,这是列表中的最后一个itemdata。 我认为代码很简单,但我无法找到我的代码有什么问题?
答案 0 :(得分:2)
您将项目的数据设置为指向sTemp临时字符串的指针(顺便说一下,所有项目都相同)。
当该变量超出范围时,指针变为无效,并且取消引用它可能会导致崩溃。
P.S。刚刚注意到你的上一条评论如果你在相同的范围内进行,sTemp会包含你打印到它的最后一个文本,并且每个项目都指向它。
[加入]
如果要将字符串数据添加到ComboBox中的每个项目,则需要分配这些字符串。例如:
char* p = new char[some_buffer_length];
然后在您的通话中使用该p来设置项目数据。
完成后,请不要忘记释放内存:
delete [] p;
每件商品。