【问题标题】:Grey out items in disabled ListView禁用 ListView 中的项目灰显
【发布时间】:2014-04-30 02:22:17
【问题描述】:

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

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

已启用 已禁用

正常禁用的复选框看起来像这样: ListView 中看到复选框的方式,同样适用于滚动条。

【问题讨论】:

    标签: c++ windows listview winapi


    【解决方案1】:

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

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

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

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


    关于滚动条,您无法将隐式滚动条作为一个单独的窗口访问,因此我认为如果不对列表视图。

    或者你自己创建一个显式的滚动条控件,但是你需要确保它的行为和原来的一样,当列表视图项目改变时改变,尊重从右到左的语言环境等等。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-21
      • 1970-01-01
      相关资源
      最近更新 更多