4


2

私はおそらく単純な問題である問題を抱えていますが、それでも私にとってはそれほど問題ではありません。 私はWin32 / Cでリストボックスを使っています、そして私のリストボックスから選択されたテキストを得るとき、返される文字列は単なるゴミです。 それは構造体または類似のものへのハンドルですか。

以下は私が得たもののコードと例です。

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

カウント= SendMessage(コントロール、LB_GETSELCOUNT、0、0);

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

GetString(index)を返します。 }

std :: string Listbox :: GetString(int index){intカウント= 0; intの長さ= 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(コントロール、LB_GETTEXT、(WPARAM)インデックス、(LPARAM)テキスト); std :: string s(テキスト); []テキストを削除します。

sを返します。 }

GetItemCountはちょうどそれをします。 現在リストボックスにあるアイテムの数を取得するだけです。

リストボックスから取得した文字列は "Test String"で、返された文字列は次のとおりです。

手助けは何でもいいです、ありがとう。

わかりました、GetStringが正しい文字列を返すので、GetSelected関数に絞り込みました。

1 Answer


10


LB_GETSELメッセージは選択された項目のインデックスを返さず、WPARAMに渡したITEMの選択されたSTATEを返します。

また、項目が選択されていないとインデックス-1の項目の文字列を取得しようとするという重大なバグもありますが、これは明らかに間違っています。 これらのSendMessage呼び出しの戻り値を確認すると、問題の診断に役立ちます。

これは最初に選択されたアイテムのテキストを取得する方法の例です。

// get the number of items in the box.
count = SendMessage(コントロール、LB_GETCOUNT、0、0);

int iSelected = -1;

// go through the items and find the first selected one
for(int i = 0; i <count; i){//このアイテムが選択されているかどうかを確認します。 if(SendMessage(control、LB_GETSEL、i、0)> 0){//はい、最初に選択したものだけを壊したい。 iSelected = i;ブレーク; }}

// get the text of the selected item
if(iSelected!= -1)SendMessage(コントロール、LB_GETTEXT、(WPARAM)iSelected、(LPARAM)テキスト)。

あるいは、LB_GETSELITEMSを使用して、選択されている項目のリストを取得することもできます。