Winapi CListCtrl::GetItemData()的用途是什么?

Winapi CListCtrl::GetItemData()的用途是什么?,winapi,visual-c++,mfc,clistctrl,Winapi,Visual C++,Mfc,Clistctrl,有谁能帮我了解一下,在MFC、VC++中,CListCtrl::GetItemData()有什么用 我看了MSDN说明,但不够清楚 如果有人能提供一个简单的解释和一些示例,那将非常棒,而且会有很大帮助。项数据允许您将任何想要的数据与列表控件的每个项关联起来。大多数情况下,这些数据都是指向某个数据结构的指针 例如,在电子邮件应用程序中,您有一个包含所有收到电子邮件的列表控件。例如,每个项目都包含发件人、主题和日期。项目数据将包含指向某个数据结构的指针,该数据结构包含其他信息中的整个邮件文本。方法G

有谁能帮我了解一下,在MFC、VC++中,
CListCtrl::GetItemData()
有什么用

我看了MSDN说明,但不够清楚


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

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


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

方法
GetItemData()
与方法
SetItemData()关联使用
允许
CListCtrl
CTreeCtrl
与控件中的项目或节点关联一些数据

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

使用
GetItemData()
检索的值或使用
SetItemData()
分配给项的值的数据类型是
DWORD\U PTR
(有关
DWORD\U PTR
的讨论,请参阅)

另一个巧合是
SendMessage()
PostMessage()
windowsapi函数具有
LPARAM
参数,例如
SendMessage(HWND-HWND,UINT-uiMsg,WPARAM-WPARAM,LPARAM-LPARAM)
与x32编译上的
LONG\u PTR
大小相同,x64编译上的
LONG
大小相同(请参阅)。而
DWORD_PTR
ULONG_PTR
相同,它恰好是x32编译上的
无符号长
,或者x64编译上的
无符号uu int64

这意味着
GetItemDataa()
中的
DWORD\u PTR
值可以用作
SendMessage()或
PostMessage()中的
LPARAM
值。因此您可以使用
SetItemData()
方法将
LPARAM
类型的标识符关联起来,然后
CListCtrl
CTreeCtrl
的选择事件处理程序可以将该标识符发送到另一个窗口或线程,该窗口或线程的句柄已知,可以将选择事件传递给应用程序的其他部分。

初学者解决方案

例如,您有一个int/string/struct或其他内容

struct foo
{
   ...
};

foo myData;    

list.SetItemData(nItem, reinterpret_cast<DWORD_PTR>(&myData));   
...  
myData = *(reinterpret_cast<foo*>(list.GetItemData(nItem)));
structfoo
{
...
};
foo-myData;
list.SetItemData(nItem、reinterpret_cast(&myData));
...  
myData=*(reinterpret_cast(list.GetItemData(nItem));
请注意,SetItemData接受对对象的引用,该对象必须是全局的,否则将被销毁