CListCtrl :: GetItemData()有什么用?

时间:2015-04-11 06:55:00

标签: winapi visual-c++ mfc clistctrl

有人可以帮助我知道,CListCtrl::GetItemData()在MFC,VC ++中的用途是什么?

我通过了MSDN描述,但还不够清楚。

如果有人可以提供一个简短的解释和一些例子,它将会非常好并且会有很多帮助。

3 个答案:

答案 0 :(得分:4)

项目数据允许您将所需的任何数据与列表控件的每个项目相关联。这个数据大部分时间都是指向某些数据结构的指针。

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

答案 1 :(得分:0)

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

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

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

另一个巧合是SendMessage()PostMessage() Windows API函数具有LPARAM参数,例如SendMessage(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam)的大小与在x32编译器上为LONG_PTR或在x64编译器中为long的{​​{1}}相同(请参阅Microsoft Docs - Windows Data Types)。并且__int64DWORD_PTR相同,恰好是x32编译时的ULONG_PTR或x64编译时的unsigned long

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

答案 2 :(得分:0)

初学者的解决方案

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

struct foo
{
   ...
};

foo myData;    

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

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