CListCtrl::GetItemData()有什么用?
What is the use of CListCtrl::GetItemData()?
谁能帮我知道,CListCtrl::GetItemData()
在MFC中有什么用,VC++?
看了MSDN的描述,还是不够清楚。
如果有人能提供一个简短的解释和一些例子,那将非常棒并且会有很大帮助。
项目数据允许您将您想要的任何数据关联到列表控件的每个项目。大多数情况下,此数据是指向某些数据结构的指针。
例如,在电子邮件应用程序中,您有一个包含所有收到的电子邮件的列表控件。每个项目包含例如发件人、主题和日期。项目数据将包含指向某个数据结构的指针,该数据结构包含整个邮件文本和其他信息。
方法GetItemData()
与方法SetItemData()
结合使用,允许CListCtrl
或CTreeCtrl
与控件中的项目或节点关联数据。
想法是,当用节点填充列表或树时,您还可以使用 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_PTR
与 ULONG_PTR
相同,后者恰好是 x32 编译上的 unsigned long
或 x64 编译上的 unsigned __int64
。
这意味着 GetItemDataa()
中的 DWORD_PTR
值可以用作 SendMessage()
或 PostMessage()
中的 LPARAM
值。因此,您可以使用 SetItemData()
方法关联 LPARAM
类型的标识符,然后 CListCtrl
或 CTreeCtrl
的选择事件的处理程序可以将其发送给其他 window 或其句柄已知的线程将选择事件传递给应用程序的其他部分。
初学者解决方案
例如,您有一个 int / string /struct 或其他东西
struct foo
{
...
};
foo myData;
list.SetItemData(nItem, reinterpret_cast<DWORD_PTR>(&myData));
...
myData = *(reinterpret_cast<foo*>(list.GetItemData(nItem)));
注意SetItemData接受对象的引用,对象必须是全局的,否则会被销毁
谁能帮我知道,CListCtrl::GetItemData()
在MFC中有什么用,VC++?
看了MSDN的描述,还是不够清楚。
如果有人能提供一个简短的解释和一些例子,那将非常棒并且会有很大帮助。
项目数据允许您将您想要的任何数据关联到列表控件的每个项目。大多数情况下,此数据是指向某些数据结构的指针。
例如,在电子邮件应用程序中,您有一个包含所有收到的电子邮件的列表控件。每个项目包含例如发件人、主题和日期。项目数据将包含指向某个数据结构的指针,该数据结构包含整个邮件文本和其他信息。
方法GetItemData()
与方法SetItemData()
结合使用,允许CListCtrl
或CTreeCtrl
与控件中的项目或节点关联数据。
想法是,当用节点填充列表或树时,您还可以使用 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_PTR
与 ULONG_PTR
相同,后者恰好是 x32 编译上的 unsigned long
或 x64 编译上的 unsigned __int64
。
这意味着 GetItemDataa()
中的 DWORD_PTR
值可以用作 SendMessage()
或 PostMessage()
中的 LPARAM
值。因此,您可以使用 SetItemData()
方法关联 LPARAM
类型的标识符,然后 CListCtrl
或 CTreeCtrl
的选择事件的处理程序可以将其发送给其他 window 或其句柄已知的线程将选择事件传递给应用程序的其他部分。
初学者解决方案
例如,您有一个 int / string /struct 或其他东西
struct foo
{
...
};
foo myData;
list.SetItemData(nItem, reinterpret_cast<DWORD_PTR>(&myData));
...
myData = *(reinterpret_cast<foo*>(list.GetItemData(nItem)));
注意SetItemData接受对象的引用,对象必须是全局的,否则会被销毁