禁用 CListCtrl 中的复选框 (LVITEM)

Posted

技术标签:

【中文标题】禁用 CListCtrl 中的复选框 (LVITEM)【英文标题】:Disable Checkbox (LVITEM) in the CListCtrl 【发布时间】:2017-11-28 07:53:13 【问题描述】:

我有自己的 CListCtrl 实现,带有复选框 (LVITEM) 及其子项。我可以使子项禁用,但我不知道如何禁用复选框

CListCtrl 中的项目为LVITEM 时,如何使禁用的灰色 项目?

【问题讨论】:

至少显示一些代码,否则你的问题不清楚而且太宽泛。 【参考方案1】:

已禁用复选框没有状态。

但是您可以阻止LVN_ITEMCHANGING 中的状态更改。在应用对列表视图的任何更改之前发送此通知。

void CWzProjectStatistic_User::OnItemchangingLcData(NMHDR* pNMHDR,LRESULT* pResult) 

  LPNMLISTVIEW pNMLV= reinterpret_cast<LPNMLISTVIEW>(pNMHDR);

  // clear result (accept changes)
  *pResult = 0;

  // Only if the state changes
  if ((pNMLV->uNewState&LVIS_STATEIMAGEMASK)!=(pNMLV->uOldState&LVIS_STATEIMAGEMASK))
  
    if (IfThisIsADisabledEntry(pMLV))
      *pResult = 1;

还有机会实现您自己的图形和复选框处理。您可以将自己的图像列表分配给列表视图,并且您可以使用自己的状态图像处理 LVIS_STATEIMAGEMASKINDEXTOSTATEIMAGEMASK

【讨论】:

实现您自己的图形和复选框处理 - 这就是我会做的(并且已经做过)。唯一棘手的部分是为复选框状态创建图像列表(以匹配当前主题)。这可以使用GetThemePartSize()DrawThemeBackground()iPartIdBP_CHECKBOXiStateIdCBS_... 来完成。如果您需要支持早于 Win 8 的 Windows 版本,“经典”外观有 DrawFrameControl()

以上是关于禁用 CListCtrl 中的复选框 (LVITEM)的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法覆盖当用户单击 CListCtrl 中的复选框时调用的处理程序? (MFC)

只需要 CListCtrl 控件中的某些行具有复选框

在 MFC 中的 CListCtrl 中禁用多项选择项上的按钮

MFC - 如何禁用列表项?

MFC中CListCtrl添加复选框,实现单选

MFC中CListCtrl添加复选框,实现单选