为什么ComboBox没有在循环中设置和获取ItemData?

时间:2015-11-17 15:19:00

标签: visual-studio-2010 winapi combobox

我想保存一个'用户名'和' 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。        我认为代码很简单,但我无法找到我的代码有什么问题?

  

1 个答案:

答案 0 :(得分:2)

您将项目的数据设置为指向sTemp临时字符串的指针(顺便说一下,所有项目都相同)。

当该变量超出范围时,指针变为无效,并且取消引用它可能会导致崩溃。

P.S。刚刚注意到你的上一条评论如果你在相同的范围内进行,sTemp会包含你打印到它的最后一个文本,并且每个项目都指向它。

[加入]

如果要将字符串数据添加到ComboBox中的每个项目,则需要分配这些字符串。例如:

char* p = new char[some_buffer_length];

然后在您的通话中使用该p来设置项目数据。

完成后,请不要忘记释放内存:

delete [] p;

每件商品。