CListCtrl::GetItemData()的作用是什么?

3

请问有人能帮我了解在MFC、VC++中,CListCtrl::GetItemData()有什么用吗?

我已经查看了MSDN的说明,但并不够清晰。

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

3个回答

5

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

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


3
方法GetItemData()与方法SetItemData()一起使用,允许CListCtrlCTreeCtrl与控件中的项目或节点关联一些数据。
当填充列表或树状结构的节点时,您可以使用SetItemData()分配数据项到节点,然后在处理选择事件时,可以使用GetItemData()检索该数据。相关数据可能是指向对象的指针或某种标识符,该标识符是存储在集合(例如 std::map)中的数据的键。
使用GetItemData()检索或使用SetItemData()分配给项目的值的数据类型为DWORD_PTR(有关DWORD_PTR的讨论,请参见64位机器上的DWORD和DWORD_PTR)。
另一个巧合是,SendMessage()PostMessage() Windows API函数具有LPARAM参数,例如,SendMessage(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam),其大小与LONG_PTR相同,x32编译为longx64编译为__int64(有关Windows Data Types,请参见Microsoft Docs - Windows Data Types)。而DWORD_PTRULONG_PTR相同,它恰好是x32编译为unsigned longx64编译为unsigned __int64
这意味着可以将GetItemData()返回的DWORD_PTR值用作SendMessage()PostMessage()中的LPARAM值。因此,您可以使用SetItemData()方法将LPARAM类型的标识符与CListCtrlCTreeCtrl的选择事件处理程序相关联,然后将其发送给某些已知句柄的其他窗口或线程,以通知应用程序的其他部分有关选择事件。

1

初学者的解决方案

例如,您有一个整型/字符串/结构体或其他类型的数据

struct foo
{
   ...
};

foo myData;    

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

注意,SetItemData接受一个对象的引用,这个对象必须是全局的,否则它将被销毁。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接