禁用ListView中的灰色项目

时间:2014-04-29 17:29:36

标签: c++ windows listview winapi

我正在使用C++WinAPI中编写应用程序。 我有一个带有复选框和滚动条的ListView个项目。有时我需要禁用整个事情。当我致电EnableWindow()时,ListView的行为就可以了。它被禁用,没有任何内容可以访问。但是,复选框和滚动条看起来仍然正常(不会像元素的其余部分一样变灰)。

是否可以将ListView中的所有部分变灰?

启用enter image description here 禁用enter image description here

正常禁用复选框看起来像这样:enter image description here< - 我希望在ListView中看到复选框,这同样适用于滚动条。

1 个答案:

答案 0 :(得分:1)

关于复选框,LVS_EX_CHECKBOXES的文档说:

  

当设置为此样式时,控件使用DrawFrameControl创建并设置包含两个图像的状态图像列表。状态图像1是未选中框,状态图像2是复选框。将状态图像设置为零将删除复选框。

因此,当您禁用整个控件时,只需将图像列表中索引1和2处的图像更改为正确禁用的变体。

当然,进程本身取决于您使用的框架(如果有的话),但通常会沿着创建SM_CXSMICON×SM_CYSMICON图标的图像列表的行,创建位图(2 * SM_CXSMICON×SM_CYSMICON)像素大,选择它进入Memory DC进行绘制,适当地调用DrawFrameControl(..., DFC_BUTTON, DFCS_BUTTONCHECK | DFCS_FLAT | ..., ...)两次,然后在图像列表中使用该位图(并在再次启用窗口时保存先前的IL以恢复)。


关于滚动条,你无法作为一个单独的窗口访问隐式滚动条,所以我认为你不能轻易地使它看起来更加残疾,而不需要为非客户区域的更多自定义绘图黑客列表视图。

或者自己创建一个显式滚动条控件,但是你需要确保它的行为与原始滚动条相同,当列表视图项更改时更改,尊重从右到左的区域设置等等。

即使对于上述自定义复选框图像,获取所有偏移量和可能的透明度也可能是一个挑战。尽管列表视图控件本身就是这样做的,但最终可能不值得付出努力。