我想更改应用程序中标题栏的颜色,就像我在 Skype Preview 等程序中看到的那样。我在互联网上只找到了一个解决方案(WM_NCPAINT),这似乎需要我绘制一个完全自定义的标题栏,当我只想更改背景颜色时,这当然不理想。有人知道更好的解决方案吗?有人建议挂钩 GetSysColor,但它从不使用索引 2 (COLOR_ACTIVECAPTION) 调用,因此颜色是从其他地方检索的。
当前标题栏:
(来源: pbrd.co )
最终目标:
原文由 Dalton Sandbothe 发布,翻译遵循 CC BY-SA 4.0 许可协议
我要说的第一件事是: 你被警告了! 这是一项非常费力的任务。阅读 Wine 源代码(本地 win32 功能的 linux 实现)与简单和花费大量时间相去甚远
看到这个问题让我想起了我为达到同样结果所做的努力的“喜欢”(读作:令人恼火!)。这个过程有点复杂,并且比简单地绘制标题栏给你带来了更多的责任。 (我已经包含了大约 500 行代码)
除其他事项外,您需要处理窗口激活/停用、大小调整、NC 区域按钮、应用程序图标和标题文本。
在我未包含的其他文件中使用一些(绘图)实用程序函数,实现了以下目标:

这两个都是对这个对话框的修改:
在这些(彩色键控)图像的帮助下:
和一些拉伸/绘图(图像分为9块)
我在重新查看此代码时注意到,客户区过度绘制了边框。我想,因为我没有正确调整它以响应 WM_NCCALCSIZE 消息。我还使用了另一个确实有 8 像素宽边框的图像,而不是这两个显示的 14 像素。 (您可以看到响应我提到的消息的注释掉的代码)
这个想法是,首先,我们将标准对话框的 WindowProc 子类化。在这个子类处理程序中,我们告诉桌面窗口管理器禁用窗口的合成,我们设置一个分层窗口(这就是黑色的半透明窗口),最后,我们自己进行非客户端绘图以响应WM_NCPAINT 消息。
我还要指出,由于我早已忘记的原因,我对代码的功能并不特别满意。
话虽如此,这里有一些代码可以让你陷入困境:
在下面找到以下功能: - 加载 png 文件(使用 GDI+) - 将此图像拉伸到边框上
最后,将控件锚定到窗口的代码(窗口重新调整大小时自动重新计算它们的位置)