在CListCtrl Customdraw函数中禁用或灰色行

时间:2014-01-08 07:38:51

标签: c++ mfc clistctrl custom-draw

我在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-&gt; nmcd.lItemlParam来调用GetItemData()。请帮忙。

1 个答案:

答案 0 :(得分:0)

绘制和禁用行是不同的。

要禁用某行,以便无法选择该行,请使用LVN_ITEMCHANGING。检查状态是否从未选择更改为选定状态(将uNewState和uOldState与LVIS_SELECTED的更改进行比较)。如果您不想允许选择此项,只需将TRUE返回到WM_NOTIFY消息。

要将数据与列表视图中的项目相关联,可以轻松使用免费的lParam字段。在这里,您可以存储一些用户数据,这些数据可能指向您拥有的内部结构。您还可以在绘图例程中访问此字段。