【问题标题】:Skinning MFC scrollbar蒙皮 MFC 滚动条
【发布时间】:2020-03-21 16:41:52
【问题描述】:

前提:我需要更改 MFC 中定义的默认 CScrollBar 的颜色(拇指 + 轨道 + 箭头),但经过一些研究后我意识到这并不是一件容易的事。

问题:如果我尝试在现有的滚动条上绘制会更好,还是应该从头开始创建一个新的滚动条控件?

  • 如果我限制自己在上面绘图,我的优势是不必管理处理滚动条其他功能的所有消息(除了绘图),但要找到所有消息非常复杂windows 重绘栏的点,因为滚动条仅在 OnPaint() 方法中不重绘。
  • 如果我从头开始重做,我将不再有识别重绘条的所有点的问题......但另一方面,我应该从头开始重新实现所有滚动条功能。

我已经看过这个链接: https://www.codeproject.com/Articles/14724/Replace-a-Window-s-Internal-Scrollbar-with-a-custo 但建议的方法似乎不适用于较新版本的 Windows(从 Vista 开始)。

感谢任何建议,提前致谢。

【问题讨论】:

  • 您在寻找this吗?
  • WM_CTLCOLORSCROLLBAR 绝对不完整。您无法通过此更改所有滚动条元素的颜色。

标签: c++ user-interface winapi mfc


【解决方案1】:

我们遇到了完全相同的问题,您尝试过度绘制原始滚动条是我们首先尝试的。由于某些问题,我们再次放弃了该尝试,我不记得详细信息(未收到所有鼠标或绘图消息,闪烁,...)。我们的解决方案是一些努力,但现在有效:

我们首先实现了一个类 CCustomScrollBar,它不是从 CScrollBar 派生的,因为 CScrollBar 只是 Windows 实现的一个包装器,覆盖 OnPaint() 并不完美。是的,所有事情都必须从头开始实施。

其次,我们实现了一个模板类 CWndCustomScrollBar,它保留了两个 CCustomScrollBar 并像标准窗口一样管理它们周围的所有内容,就像使用其嵌入的滚动条一样。然后可以通过 GetClientRectWithoutScrollBar() 方法实现空闲客户区,使其工作方式与标准窗口类似。

【讨论】:

  • 我担心从头开始重做酒吧并从头开始重新实现所有功能是最好的解决方案......非常感谢您的解释/示例,我想我会使用你的方法.
猜你喜欢
  • 2012-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-05
相关资源
最近更新 更多