2014-01-08 137 views
1

我在MFC对话框中有一个CListCtrl。我必须做的是根据条件对某些项目进行分解,以便用户不能选择它。现在我已经改变了颜色,但那不是一个合适的解决方案。我的代码如下所示:在CListCtrl中禁用或灰显行Customdraw函数

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; 
    } 
} 

我无法找到任何有关如何禁用行的参考资料。

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

回答

0

绘制和禁用行是不同的。

要禁用行,以便它不能被选中,请使用LVN_ITEMCHANGING。检查状态是否从未选中更改为选定状态(比较uNewState和uOldState有关对LVIS_SELECTED的更改)。如果你不想允许选择这个项目,只需返回TRUE到WM_NOTIFY消息。

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

+0

其实我不得不以某种方式让用户立即知道某些项目对于当前上下文无效。为此,我必须将这一行灰化。我可以改变颜色,但这不会阻止他们选择无效。像禁用OK按钮/内部处理无效的选择/警告弹出窗口的替代方法不是首选。 –