【问题标题】:Disable or greyout rows in CListCtrl Customdraw function在 CListCtrl Customdraw 函数中禁用或灰显行
【发布时间】:2014-01-26 04:46:22
【问题描述】:

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

【问题讨论】:

    标签: c++ mfc clistctrl custom-draw


    【解决方案1】:

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

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

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

    【讨论】:

    • 实际上我必须以某种方式让用户立即知道某些项目对于当前上下文无效。为此,我必须将行变灰。我可以更改颜色,但这不会阻止他们选择无效。不首选禁用 OK 按钮/内部处理无效选择/警告弹出窗口等替代方法。
    猜你喜欢
    • 2012-02-01
    • 2010-11-30
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多