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を使用しようとしましたが、この投稿のように、CallBack Functionでnewによって作成されたポインタを削除するdeleteように、他の人が代わりにvector一緒に使用することを提案していますが、必要なLPARAMパラメータがrequiresであるという別の問題が発生するため、次のコード文字列を受け取るポインタではなく、最後のパラメータがであるため、機能しません。std::stringCB_GETLBTEXTA 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指定した長さでを初期化する方法もわかりません。

実際、コンボボックスコントロールのエディットコントロールに入力された文字列を、このコンボボックスのアイテムと比較したいと思います。この問題を解決したり、私がやりたいことをしたりするための提案はありますか?

4

1 に答える 1

1

std::vectorで使用する提案を誤解している可能性があります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 に答える