2015-11-17 109 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

相關問題