CListCtrl::GetItemData()有什么用?

What is the use of CListCtrl::GetItemData()?

谁能帮我知道,CListCtrl::GetItemData()在MFC中有什么用,VC++?

看了MSDN的描述,还是不够清楚。

如果有人能提供一个简短的解释和一些例子,那将非常棒并且会有很大帮助。

项目数据允许您将您想要的任何数据关联到列表控件的每个项目。大多数情况下,此数据是指向某些数据结构的指针。

例如,在电子邮件应用程序中,您有一个包含所有收到的电子邮件的列表控件。每个项目包含例如发件人、主题和日期。项目数据将包含指向某个数据结构的指针,该数据结构包含整个邮件文本和其他信息。

方法GetItemData()与方法SetItemData()结合使用,允许CListCtrlCTreeCtrl与控件中的项目或节点关联数据。

想法是,当用节点填充列表或树时,您还可以使用 SetItemData() 将数据项分配给节点,在处理选择事件时可以使用 GetItemData() 检索该数据项。关联的数据可能类似于指向对象的指针或某种标识符,它是存储在集合中的数据的关键,例如 std::map.

使用 GetItemData() 检索或分配给使用 SetItemData() 的项目的值的数据类型是 DWORD_PTR(有关 [=19 的讨论,请参阅 DWORD and DWORD_PTR on 64 bit machine =]).

另一个巧合是 SendMessage()PostMessage() Windows API 函数有 LPARAM 参数,例如SendMessage(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam)LONG_PTR 大小相同,后者在 x32 编译时为 long 或在 x64 编译时为 __int64(参见 Microsoft Docs - Windows Data Types)。 DWORD_PTRULONG_PTR 相同,后者恰好是 x32 编译上的 unsigned long 或 x64 编译上的 unsigned __int64

这意味着 GetItemDataa() 中的 DWORD_PTR 值可以用作 SendMessage()PostMessage() 中的 LPARAM 值。因此,您可以使用 SetItemData() 方法关联 LPARAM 类型的标识符,然后 CListCtrlCTreeCtrl 的选择事件的处理程序可以将其发送给其他 window 或其句柄已知的线程将选择事件传递给应用程序的其他部分。

初学者解决方案

例如,您有一个 int / string /struct 或其他东西

struct foo
{
   ...
};

foo myData;    

list.SetItemData(nItem, reinterpret_cast<DWORD_PTR>(&myData));   
...  
myData = *(reinterpret_cast<foo*>(list.GetItemData(nItem)));

注意SetItemData接受对象的引用,对象必须是全局的,否则会被销毁