0

假设我有 20 个不同长度的字符串,每个字符串都应该获得类似于以下内容:

TCHAR *itemText[...];
SendMessage(hwndCombobox, CB_GETLBTEXT, i, (LPARAM)itemText);

由于我有项目的索引,我想在 for 循环中使用上面的代码。但是因为每个项目都有不同的长度,我不能使用类似的东西:

int itemLength = SendMessage(hwndCombobox, CB_GETLBTEXTLEN, i, 0);
TCHAR *itemText[itemLength];

由于使用消息CB_GETLBTEXTLEN首先需要长度,因此需要获取长度。我知道我可以使用,例如,TCHAR *itemText[1024];但我个人不喜欢这种方式。

我也尝试使用newand delete,而其他人建议我使用vectorwith std::string,就像在这篇文章中一样delete pointers created by new in CallBack Function,但这会导致另一个问题,即CB_GETLBTEXTrequires所需的 LPARAM 参数A pointer to the buffer that receives the string.,所以下面的代码不起作用,因为最后一个参数是std::string,而不是接收字符串的指针:

int i;
Vec<std::string> itemText;
for (i = 0; i < itemCount; i++) {
    ......... // Don't know how to initialize a string with a specified length.
    SendMessage(win->hwndFindBox, CB_GETLBTEXT, i, (LPARAM)itemText.At(i));
}

我也不知道如何std::string str用指定的长度初始化 a 。

实际上,我想将组合框控件的编辑控件中键入的字符串与此组合框上的项目进行比较。你有什么建议来解决这个问题或做我想做的事吗?

4

1 回答 1

1

您可能误解了使用std::vectorwith 的建议std::string。读取 ComboBox 项文本时应将std::vector<TCHAR>其用作临时缓冲区(因为您不能直接写入 使用的内部缓冲区std::basic_string),然后可以std::basic_string<TCHAR>根据需要将其复制到后面:

std::basic_string<TCHAR> s;
int itemLength = SendMessage(hwndCombobox, CB_GETLBTEXTLEN, i, 0);
if (itemLength != CB_ERR)
{
    std::vector<TCHAR> buf(itemLength + 1 /* for NUL */);
    SendMessage(hwndCombobox, CB_GETLBTEXT, i, reinterpret_cast<LPARAM>(&buf[0]));

    s = &buf[0];
}

std::vector是有效的,因为保证使用连续内存,所以&buf[0]应该等价于一个数组(假设它buf不为空,但在这种情况下,我们保证它至少有 1 个元素)。

于 2012-05-19T10:54:07.377 回答