0

ドロップされたファイルを一覧表示するツリービューがあります。

新しいツリービューアイテムを作成するときに、ファイルのアドレスをそのアイテムに文字列として保存し、後でさまざまな悪意のある目的で取得したいと思います。

MicrosoftドキュメントのTVITEM構造を見ると、明らかLPARAMに値を格納する場所です。

lParam

Type: LPARAM

A value to associate with the item.

だから、私は先に進んでそれをしました:

TVITEM tvi;
tvi.mask = TVIF_TEXT;
tvi.pszText = const_cast<char *> (str0.c_str());
tvi.cchTextMax = sizeof(tvi.pszText);
tvi.lParam = (LPARAM) foo;  // SETTING LPARAM HERE, foo IS A const char * 

TVINSERTSTRUCT tvis;
tvis.item = tvi;
tvis.hInsertAfter = 0;
tvis.hParent = hti0;

// Send message to update tree, and return tree item.
return TreeView_InsertItem(tvw_filelist_, &tvis);

次に、自分の値を取得しようとすると...

HTREEITEM htiSel = TreeView_GetSelection(tvw_filelist_);

TVITEM tvItem;
tvItem.hItem = htiSel;

TreeView_GetItem(tvw_filelist_, &tvItem);
const char * info = (const char *) tvItem.lParam;
MessageBox(NULL, info, "Alert", MB_OK);

...ゴミが出て、ポインタがスコープから外れたか、仮眠を取っていることを示しています。そのポインタのサイズは常に4です。

これは私がやろうとしていることをする正しい方法ですか?もしそうなら、何が起こっているのですか?

4

2 に答える 2

2
struct CustomTreeData
{
    LPSTR str;   // or even std::string to forget about memory managment
    // TODO: any other data you need
};
...
TVITEM tvi;
tvi.mask = TVIF_TEXT | TVIF_PARAM;

CustomTreeData* myDataPtr = new CustomTreeData;   // the memory should be free later
myDataPtr->str = stringWhatIWant;   // And don't forget to alloc memory for str!
tvi.lParam = (LPARAM) myDataPtr;

このコードはチェックしませんが、動作するはずです。ハッピーコーディング:)

于 2012-11-08T08:59:48.843 に答える
2

もちろん、時間をかけて質問を投稿してから、答えを見つけようとすると、数秒で答えが表示されます。

この質問と同様に、TVITEM マスクに TVIF_PARAM を含める必要があることがわかりました。

上記のコードを次のように変更すると:

tvi.mask = TVIF_TEXT | TVIF_PARAM;

期待どおりに動作します。

ただし、これが LPARAM の推奨される使用法であるかどうかはまだわかりません。

于 2012-11-08T08:27:47.073 に答える