问题标签 [ws-ex-transparent]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2181 浏览

c++ - WM_EX_TRANSPARENT 不会重绘子窗口

WM_EX_TRANSPARENT在某些窗口上使用窗口样式以尝试进行具有透明度的双缓冲。但是,我遇到了一个问题,因为当我InvalidateRect在父窗口上执行时,子窗口不会重绘。

迭代子窗口并让它们重新绘制自己是父窗口的责任,还是我做错了?如果它是父窗口的责任,我怎样才能得到父无效矩形内的所有子窗口?

这是一个完全可编译的示例,说明了我正在谈论的行为。当您将鼠标移到父窗口上时,您可以看到该按钮消失了。如果单击它,该按钮会自行重绘,但当您将鼠标移开并返回父窗口时,它会再次消失。


最终的解决方案

是按照下面建议的答案去做,然后在父窗口的WM_PAINT消息中向WM_PAINT每个孩子发送 a 并让孩子们在父母的双缓冲区中绘画(而不是在自己身上绘画任何东西),然后让父母BitBlt在它的缓冲区中(已被绘制到由它自己,然后由它的每个孩子从 Z 顺序的底部到顶部)进入它的HDC. 这允许在父项和子项中进行无闪烁绘图,并为子项提供透明度。这是我们得到的最终演示程序:

再次感谢 johnathon 花了这么多时间帮助我解决这个问题。

0 投票
1 回答
269 浏览

panel - 如何清除透明面板?

我做了一个这样的透明面板(在 C# 中):

它显示在普通面板上。我想画一个圆圈来在另一个面板中显示一些东西,所以我在透明的 OnPaint 方法上画了我的圆圈。然后,我想展示其他东西,所以我需要这个圈子“移动”到其他地方。

但我不能。

尽管我确实在 OnPaint 方法中绘制了这个圆圈,但我在这里找不到的任何解决方案都对我有用。我不使用事件的 Graphics 对象,因为如果我这样做了,什么都不会显示。

所以,我必须使用这个:

我无法使用背景颜色在其上绘制另一个圆圈:我的背景需要保持透明。并且用 Color.Transparent 画一个圆圈不起作用。

清除透明面板会导致黑色背景替换透明面板。

该指令

不编译。

这个也没有:

因为它需要一个 Color 参数。

和这个:

创建黑色背景。

在我看来,我已经尝试了我能想到的一切。

任何想法 ?