在WinForms中更改ListView中滚动条的颜色

时间:2010-12-09 10:10:47

标签: c# .net winforms listview scrollbar

是否可以更改ListView控件中滚动条的颜色。它是一个Windows应用程序。

请让我知道我可以使用哪些属性或代码来执行此操作。

有人可以帮助你如何将主题应用于winforms(整个应用程序) 如在yahoo messenger / digby等中。

1 个答案:

答案 0 :(得分:16)

答案简短:不,这是不可能的。

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

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

然后是无意义的过度定制问题。我非常支持尊重用户当前主题设置的应用程序。如果我将Windows配置为使用高对比度主题(或者如果我不能忍受蓝色,那么我有一个绿色主题),我希望我的计算机上的应用程序使用该主题绘制他们的UI元素。无论你设计的滚动条看起来如何,无论它在你的计算机上看起来多么棒,它都可以保证在某人的计算机上看起来像垃圾。如果那个人是你的一个用户,那就是oops。少数使用自定义主题的应用程序会进行批次测试,但仍然无法避免遇到问题。

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

真正看起来很有希望的是詹姆斯布朗的Custom Scrollbar Library,但它是用C语写的。你自己将它移植到C#。像往常一样,这种事情不会没有它的问题。阅读评论显示了不少有各种问题的人。如果您不太了解Win32 API,那么您可能无法修复可能会在您的应用程序中引入的任何错误。

谷歌搜索这个主题的原因几乎完全揭示了未回答的问题。对于它的价值,这在WPF中更容易方式