LVN_GETDISPINFO: 当虚拟列表控件需要某个数据的时候,它给父窗口发送一个 LVN_GETDISPINFO通知消息,表示请求某个数据。因此列表的所有者窗口(或者它自己)必须处理这个消息。例如派生类的情况 (CMyListCtrl是一个虚拟列表类对象):
//这里处理的是反射消息 BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl) //{{AFX_MSG_MAP(CMyListCtrl) ON_NOTIFY_REFLECT(LVN_GETDISPINFO, OnGetdispinfo) //}}AFX_MSG_MAP END_MESSAGE_MAP()LVN_GETDISPINFO的处理函数用于对每行记录的内容进行赋值,消息带的参数为一个LV_ITEM结构体:
typedef struct tagLVITEMA { UINT mask; //跟项相关的风格属性 int iItem; //Line项行号 int iSubItem; //列号 UINT state; UINT stateMask; LPSTR pszText; //该列的字符串内容 int cchTextMax; int iImage; //图标索引 LPARAM lParam; #if (_WIN32_IE >= 0x0300) int iIndent; #endif #if (_WIN32_WINNT >= 0x0501) int iGroupId; UINT cColumns; // tile view columns PUINT puColumns; #endif #if _WIN32_WINNT >= 0x0600 // Will be unused downlevel, but sizeof(LVITEMA) must be equal to sizeof(LVITEMW) int* piColFmt; int iGroup; // readonly. only valid for owner data. #endif } LVITEMA, *LPLVITEMA;在 LVN_GETDISPINFO 通知消息的处理程序中,必须检查正在请求的信息的类型。可能值是: LVIF_TEXT 必须填写 pszText 成员。 LVIF_IMAGE 必须填写 iImage 成员。 LVIF_INDENT 必须填写 iIndent 成员。 LVIF_PARAM 必须填写 lParam 成员。 LVIF_STATE 必须填写 state 成员。 根据它的请求,填充所需的数据即可。
================= 例子代码====================
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR; LV_ITEM* pItem= &(pDispInfo)->item; int iItemIndx= pItem->iItem; if (pItem->mask & LVIF_TEXT) //字符串缓冲区有效 { switch(pItem->iSubItem){ case 0: //填充数据项的名字 lstrcpy(pItem->pszText,m_Items[iItemIndx].m_strItemText); break; case 1: //填充子项1 lstrcpy(pItem->pszText,m_Items[iItemIndx].m_strSubItem1Text); break; case 2: //填充子项2 lstrcpy(pItem->pszText,m_Items[iItemIndx].m_strSubItem2Text); break; } } /*注意,多数情况下要使用lstrcpyn ,因为最多复制字符的个数由pItem->cchTextMax给出: lstrcpyn(pItem->pszText, text, pItem->cchTextMax); */ if (pItem->mask & LVIF_IMAGE) //是否请求图像 pItem->iImage= m_Items[iItemIndx].m_iImageIndex;甚至连某行数据是否选中(当有checkbox的情况下)的信息也需要由用户自己来维护,例如:
//是否显示该行的选择信息? if(IsCheckBoxesVisible()) //自定义函数 { pItem->mask |= LVIF_STATE; pItem->stateMask = LVIS_STATEIMAGEMASK; if(m_database[itemid].m_checked) { pItem->state = INDEXTOSTATEIMAGEMASK(2); } else { pItem->state = INDEXTOSTATEIMAGEMASK(1); } }转自: 1.https://blog.csdn.net/mikasoi/article/details/82903143 2.https://blog.csdn.net/flyinautumn/article/details/8443674