1

我在 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()。请帮忙。

4

1 回答 1

0

绘制和禁用一行是不同的。

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

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

于 2014-01-08T08:21:51.410 回答