禁用 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_STATEIMAGEMASK
和 INDEXTOSTATEIMAGEMASK
【讨论】:
实现您自己的图形和复选框处理 - 这就是我会做的(并且已经做过)。唯一棘手的部分是为复选框状态创建图像列表(以匹配当前主题)。这可以使用GetThemePartSize()
和DrawThemeBackground()
与iPartId
的BP_CHECKBOX
和iStateId
的CBS_...
来完成。如果您需要支持早于 Win 8 的 Windows 版本,“经典”外观有 DrawFrameControl()
。以上是关于禁用 CListCtrl 中的复选框 (LVITEM)的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法覆盖当用户单击 CListCtrl 中的复选框时调用的处理程序? (MFC)