我有一个MFC SDI应用程序来显示从csv文件读取的数据列表。所以我将其视图设置为从CListView继承并使其成为虚拟列表控件。这意味着我必须使用LVS_OWNERDATA作为其CListCtrl样式属性之一。然而,当我必须在显示列表的每一行中包含Checkbox时,我现在遇到了问题。您可能知道,LVS_EX_CHECKBOXES不能与LVS_OWNERDATA一起使用,因此我创建一个位图文件以包含2个小图像的复选框(已选中和取消选中),并在每次用户单击加载的图像/图标时切换它们。我在OnNMClick方法中处理这个问题。我有两个问题,我想请求你帮忙解决。
(1)我不知道如何更新虚拟列表(通常在OnLvnGetdispinfo方法中处理),所以我在OnNMClick中尝试这个,并发现检查和未检查的图像没有切换。
void CMFCSDITest::OnNMClick(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: Add your control notification handler code here
*pResult = 0;
LVHITTESTINFO hitinfo;
hitinfo.pt = pNMItemActivate->ptAction;
int nItem = pListCtrl->HitTest(&hitinfo);
if (hitinfo.flags != LVHT_ONITEMICON)
return;
NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);
LV_ITEM* pItem = &(pDispInfo)->item;
if (pItem->iImage == 0)
pItem->iImage = 1;
else
pItem->iImage = 0;
pListCtrl->SetItem(pItem);
pListCtrl->UpdateWindow(); //this is wrong as nothing seems updated after all.
}
鉴于创建的图像列表已经插入到pListCtrl中(在OnInitialUpdate方法中),我在OnLvnGetdispinfo方法中设置输出图像索引值。
(2)我没有处理OnNMClick,而是在某处读到人们的建议,也可以使用OnLvnItemchanged方法。但是在LPNMLISTVIEW
结构中,有uNewState
和uOldState
变量成员,我不知道如何将我的微小已检查和未经检查的图标设置为状态图像。因为我可能必须这样做
if (pNMLV->uChanged & LVIF_STATE)
{
switch (pNMLV->uNewState & LVIS_STATEIMAGEMASK)
{
case image1://do
case image2://do
}
}