gpt4 book ai didi

winapi - WINAPI中透明按钮的正确做法

转载 作者:行者123 更新时间:2023-12-02 02:16:08 25 4
gpt4 key购买 nike

如何使覆盖 WM_PAINT 的按钮透明。这样你就可以通过它在所有地方看到形状,除了绘制某些东西的地方。同时避免闪烁。

我看到了 SetBkMode(HDC, TRANSPARENT)、使用 NULL_BRUSH 的示例、CompatibleDC 和 BitBlts 的示例,但我不太确定哪种方法是正确的,而且,当在父窗口。我所做的大多数实验也有一些奇怪的行为。在 MSDN 上根本找不到关于 WM_ERASEBKGND/WM_CTLCOLOR/WM_PAINT/WS_EX_COMPOSITED/WS_CLIPCHILDREN/etc 内部关系的好文档。

有谁知道我可以在哪里阅读有关此主题以及所有相关问题的内容?

最佳答案

嗯,我从来没有找到任何接近这个主题的权威文档。

这只是我相当随机的内存转储,试图让控件在动画时在一个带有皮肤(具有位图背景的正常非客户区域)、分层(以获得带有自定义非客户端边缘(具有投影效果)或扩展 Aero Glass(通过 DwmExtendFrameIntoClient)效果。

  • SetBKMode(... TRANSPARENT) 只是确保文本渲染不会使用当前 bk 颜色填充文本的背景。
  • WS_EX_COMPOSITED 导致窗口在父窗口无效时将父窗口和所有子窗口绘制到后台缓冲区,然后绘制后台缓冲区。这是无闪烁的,但 NT 6.0 引入了不支持 WS_EX_COMPOSITED 的桌面窗口管理器。
  • WS_CLIPCHILDREN 防止子窗口和父窗口绘制同一区域两次。但如果您需要使用组框或选项卡控件,则相反。
  • 如果子窗口重叠并导致闪烁,WS_CLIPSIBLING 可能会很有用。同样,如果您需要使用组框或选项卡控件,则此样式毫无用处。
  • WS_CLIPCHILDREN 的另一个问题是您无法在父 widnows 窗口过程中绘制背景并依赖 NULL 画笔来显示皮肤。您可以从 WM_CTLCOLORxxx 消息返回画笔,以强制某些标准控件使用您的皮肤位图绘制其背景。
  • WS_EX_LAYERED 是另一种使窗口缓冲父窗口绘制的样式。但是分层窗口绘制器根本不绘制子窗口,因此您需要通过发送 WM_PRINTCLIENT 消息来手动绘制子窗口。并非所有控件都支持此消息。
  • WPF 通过根本不为其按钮创建实际的子窗口来解决缺乏后台缓冲绘制和 Alpha 支持的问题。

对情况的最终看法:

只需做一点工作,您就可以轻松获得大多数标准控件背后的皮肤。 WS_CLIPCHILDREN 并且父级上没有背景绘画将最大限度地减少闪烁。处理 WM_CTLCOLORxxx 以填充控件上的背景。

如果您使用 Group Boxes 或 TabControls 来构建其他控件,则在使用 WS_CLIPSIBLINGS 时绝对必须确保 Z 顺序正确。

通过发送控件 WM_PRINTCLIENT 消息和一些子类化,您可以获得标准控件来绘制到 DIBSection 上,然后您可以手动(或使用 DWM 工作函数)修复 alpha channel ,然后绘制到分层窗口上,或带有加长毛玻璃的 window 。这甚至是无闪烁的,但不支持 WM_PRINTCLIENT 或在 WM_PAINT 之外频繁更新自身的控件将无法正确显示。

关于winapi - WINAPI中透明按钮的正确做法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4595618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com