2015-11-17 114 views
-1

我想在Visual Studio 2010和WIN32(C++)的ComboBox中保存'username'和'ID'。下面的代码是的ItemData设置为组合框:为什么ComboBox不会在循环中设置和获取ItemData?

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); 
} 

和代码用于获取的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); 
} 

的问题是,消息框不显示任何内容。 当我通过为每个组合框项目添加一个CB_GETITEMDATA消息来检查代码的第一部分时,我发现项目的所有itemdata值都是“ID3”,这是列表中的最后一个项目数据。 我认为代码很简单,但是我找不到我的代码有什么问题?

回答

2

您的项目数据集的指针STEMP临时字符串(顺便说一句相同的所有项目)。

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

P.S.刚刚注意到你最后的评论。如果你在同一个范围内做,那么sTemp包含你打印的最后一个文本,每个项目都指向它。

[添加]

如果你想字符串数据添加到每个项目在你的组合框,您需要分配这些字符串。例如:

char* p = new char[some_buffer_length]; 

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

不要忘记通过调用释放当您完成内存:

delete [] p; 

为您的每个项目。

+0

那么如何将字符串分配给循环中的itemdata?直到现在我还以为combobox使用内部数据结构来保存itemdata! – Shaheen

+0

@Shaheen - 请看我编辑的答案。 –

+0

真是一团糟!如果我应该为每个itemdata分配内存,那么我会创建一个数据结构或文件来保存数据。一路走来,感谢您的关注。 – Shaheen

相关问题