禁用 CListCtrl 自定义绘制函数中的行或将其显示为灰色

Disable or greyout rows in CListCtrl Customdraw function

本文关键字:显示 灰色 自定义 CListCtrl 绘制 函数 禁用      更新时间:2023-10-16

我在MFC对话框中有一个CListCtrl。我要做的就是根据条件禁用某些项目,以便用户无法选择它。到目前为止,我已经改变了颜色,但这不是合适的解决方案。我的代码如下所示:

void CSomeDialog::OnCustomdrawElementList(NMHDR *pNMHDR, LRESULT *pResult)
{
NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );
*pResult = 0;
if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage )
    {
    *pResult = CDRF_NOTIFYITEMDRAW;
    }
else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
    {
    COLORREF crText;
    //Here I want to do disable based on some condition of the data related to the item//
    if ( (pLVCD->nmcd.dwItemSpec % 2) == 0 )
        crText = RGB(255,0,0);
    else if ( (pLVCD->nmcd.dwItemSpec % 2) == 1 )
        crText = RGB(0,255,0);
    // Storing the color back 
    pLVCD->clrText = crText;
    *pResult = CDRF_DODEFAULT;
    }
}

我还找不到有关如何禁用行的任何参考。

另一个问题,即使在管理了分解部分之后,如何在此自定义绘制函数中获取与项目相关的数据? pLVCD->nmcd.lItemlParam 可以用来调用 GetItemData() 吗?请帮忙。

绘制和禁用行是不同的。

若要禁用行,使其无法选择,请使用 LVN_ITEMCHANGING。检查状态是否从未选中更改为已选中(比较 uNewState 和 uOldState 关于对LVIS_SELECTED的更改)。如果不想允许选择此项,只需将 TRUE 返回到WM_NOTIFY消息。

关于将数据关联到列表视图中的项目,使用自由 lParam 字段很容易。在这里,您可以存储一些用户数据,这些数据可能指向您拥有的内部结构。您还可以在绘图例程中访问此字段。