虚拟ClistCtrl,显示报告列表样式

时间:2017-05-11 08:29:57

标签: clistctrl

我有一个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结构中,有uNewStateuOldState变量成员,我不知道如何将我的微小已检查和未经检查的图标设置为状态图像。因为我可能必须这样做

if (pNMLV->uChanged & LVIF_STATE)
{
    switch (pNMLV->uNewState & LVIS_STATEIMAGEMASK)
    {
       case image1://do
       case image2://do
    }
}

0 个答案:

没有答案