请问有人能帮我了解在MFC、VC++中,CListCtrl::GetItemData()
有什么用吗?
我已经查看了MSDN的说明,但并不够清晰。
如果有人能提供简要的解释和一些示例,那将非常棒,并且会帮助很多人。
请问有人能帮我了解在MFC、VC++中,CListCtrl::GetItemData()
有什么用吗?
我已经查看了MSDN的说明,但并不够清晰。
如果有人能提供简要的解释和一些示例,那将非常棒,并且会帮助很多人。
项目数据允许您将任何数据与列表控件的每个项目相关联。这些数据大多数情况下是指向某些数据结构的指针。
例如,在邮件应用程序中,您有一个包含所有收到电子邮件的列表控件。每个项目包含发件人、主题和日期等信息。项目数据将包含指向某些数据结构的指针,该数据结构包含整个邮件文本以及其他信息。
GetItemData()
与方法SetItemData()
一起使用,允许CListCtrl
或CTreeCtrl
与控件中的项目或节点关联一些数据。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
编译为long
,x64
编译为__int64
(有关Windows Data Types
,请参见Microsoft Docs - Windows Data Types)。而DWORD_PTR
与ULONG_PTR
相同,它恰好是x32
编译为unsigned long
,x64
编译为unsigned __int64
。GetItemData()
返回的DWORD_PTR
值用作SendMessage()
或PostMessage()
中的LPARAM
值。因此,您可以使用SetItemData()
方法将LPARAM
类型的标识符与CListCtrl
或CTreeCtrl
的选择事件处理程序相关联,然后将其发送给某些已知句柄的其他窗口或线程,以通知应用程序的其他部分有关选择事件。初学者的解决方案
例如,您有一个整型/字符串/结构体或其他类型的数据
struct foo
{
...
};
foo myData;
list.SetItemData(nItem, reinterpret_cast<DWORD_PTR>(&myData));
...
myData = *(reinterpret_cast<foo*>(list.GetItemData(nItem)));