【问题标题】:Changing color of scroll bar in ListView in WinForms在 WinForms 中更改 ListView 中滚动条的颜色
【发布时间】:2011-05-22 18:33:55
【问题描述】:

在 Windows 窗体应用程序中,是否可以更改 ListView 控件的滚动条颜色?

请让我知道我需要什么属性或代码来实现这一点,我找不到也无法开发类似的东西。

我的目的是将主题应用于我的整个 WinForms 应用程序。

【问题讨论】:

标签: c# .net winforms listview scrollbar


【解决方案1】:

简短的回答:不,不可能。

更长(更准确)的答案:
不幸的是,这远没有设置属性那么简单。原因是ListView 控件使用的滚动条并不是真正的滚动条控件。它们没有自己的窗口句柄,它们的绘图完全由ListView 控件在内部管理。当然,WinForms 中的ListView 控件只是Win32 API 提供的相同控件的薄包装。它们都没有公开任何更改滚动条颜色的工具。

但情节变厚了。我说过ListView 控件(注意这也适用于TreeView)处理绘制滚动条本身,这应该表明你不能简单地处理它的Paint 事件并像你一样自己绘制它们许多其他 WinForms 控件。 Paint 事件对应于窗口消息WM_PAINT,但是当窗口需要绘制非客户区时,还有另一条消息(WM_NCPAINT)发送到窗口。当收到WM_NCPAINT 消息时,滚动条是按理说的,因为我说过它们是ListView 控件框架的一部分。但他们不是。

然后是毫无意义的过度定制问题。我强烈支持尊重用户当前主题设置的应用程序。如果我将 Windows 配置为使用高对比度主题(或者如果我无法忍受蓝色,所以我有一个绿色主题),我希望我计算机上的应用程序使用该主题绘制它们的 UI 元素。无论您将滚动条设计成什么样子,无论它在您的计算机上看起来多么棒,都保证在某人的计算机上看起来像垃圾。如果该人是您的用户之一,哎呀。少数使用自定义主题的应用程序进行了大量测试,但仍然无法避免遇到问题。

可能能够以某种方式自行挂钩滚动条,但这很可能是不可能的,因为它们部分是在内核模式下实现的。事实上,我听说WindowBlinds 的作者声称挂钩滚动条是他们必须做的最困难的事情。他们当然不会分享他们的任何技巧。

唯一看起来很有希望的是 James Brown 的 Custom Scrollbar Library,但它是用 C 编写的。您自己将其移植到 C#。和往常一样,这种事情不会没有问题。阅读 cmets 显示不少人有各种问题。如果您不太了解 Win32 API,您可能无法修复这可能会引入您的应用程序的任何错误。

对此主题的 Google 搜索几乎完全发现未回答的问题是有原因的。对于它的价值,这在 WPF 中方式更容易。

【讨论】:

  • 科迪·格雷说不可能,一定不可能。
  • 作为一名计算机程序员,经过 19 年的现场经验,我完全同意开发人员应该尊重用户自己的偏好的部分,即使对于您应用程序的核心功能以及主题选项也是如此.然而,Windows(甚至 10)带有一个非常坚固且(可以说)丑陋(至少非现代)的主题,并且很少有用户更改(甚至知道如何更改)它们。所以我想最好的解决方法是在用户想要更改它们时给他们一个机会。我为我的列表视图列标题做了它,但现在我正在为滚动条而烦恼......
猜你喜欢
  • 2011-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多