2009-04-10 141 views
3

我有一個問題,這很可能是一個簡單的問題,但對我來說還不是一個問題。我在Win32/C++中使用列表框,並從列表框中獲取選定的文本時,返回的字符串就是垃圾。它是一個結構或類似的句柄?Win32 LB_GETTEXT返回垃圾

下面是我得到的代碼和例子。

std::string Listbox::GetSelected() { 
int index = -1; 
int count = 0; 

count = SendMessage(control, LB_GETSELCOUNT, 0, 0); 

if(count > 0) { 
    index = SendMessage(control, LB_GETSEL, 0, 0); 
} 

return GetString(index); 
} 


std::string Listbox::GetString(int index) { 
int count = 0; 
int length = 0; 
char * text; 

if(index >= 0) { 
    count = GetItemCount(); 

    if(index < count) { 
     length = SendMessage(control, LB_GETTEXTLEN, (WPARAM)index, 0); 
     text = new char[length + 1]; 

     SendMessage(control, LB_GETTEXT, (WPARAM)index, (LPARAM)text); 
    } 
} 
std::string s(text); 
delete[] text; 

return s; 
} 

GetItemCount就是這麼做的。它只是獲取列表框中當前項目的數量。

我是從列表框抓取的字符串是「測試字符串」和它返回¨±é»TZA

任何幫助appericated,謝謝。

好吧,我縮小到我的GetSelected函數爲GetString返回正確的字符串。

+0

你正在爲ANSI或UNICODE編譯嗎? – 2009-04-10 22:49:15

+0

另外,SendMessage的返回是什麼,它與預期的LB消息相比如何? – 2009-04-10 22:50:01

回答

8

LB_GETSEL消息不返回選定項目的索引,它返回您在WPARAM中傳遞的ITEM的選定狀態。

您還有一個嚴重的錯誤,如果沒有選擇任何項目,您將嘗試檢索索引-1處的項目的字符串,這顯然是錯誤的。檢查這些SendMessage調用的返回值可以幫助您診斷問題。

下面是如何獲取第一個選定項目文本的示例;

// get the number of items in the box. 
count = SendMessage(control, LB_GETCOUNT, 0, 0); 

int iSelected = -1; 

// go through the items and find the first selected one 
for (int i = 0; i < count; i++) 
{ 
    // check if this item is selected or not.. 
    if (SendMessage(control, LB_GETSEL, i, 0) > 0) 
    { 
    // yes, we only want the first selected so break. 
    iSelected = i; 
    break; 
    } 
} 

// get the text of the selected item 
if (iSelected != -1) 
    SendMessage(control, LB_GETTEXT, (WPARAM)iSelected , (LPARAM)text); 

或者您可以使用LB_GETSELITEMS獲得所選擇的項目列表。