【问题标题】:Transparency using WS_EX_TRANSPARENT on 16-bit color depth在 16 位颜色深度上使用 WS_EX_TRANSPARENT 的透明度
【发布时间】:2014-10-15 15:34:43
【问题描述】:

我有一个 WPF 应用程序,它通过在透明窗口上绘画来在计算机屏幕上进行注释。使用 PInvoke 设置透明度:

extendedWindowStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
SetWindowLong(hwnd, GWL_EXSTYLE, extendedWindowStyle | WS_EX_TRANSPARENT);

现在,当我将显示适配器颜色深度从 32 位调低到 16 位时,我遇到了问题。 那时我不再能够在透明窗口上绘画,而是鼠标到达透明 WPF 窗口下方的控件。任何想法如何解决这个问题?

(顺便说一句,使用 PInvoke 是让透明度在“Windows Basic”和“高对比度”主题上正常工作的唯一方法,这些主题会关闭 Aero 透明度)

【问题讨论】:

  • WS_EX_TRANSPARENT 是一个非常弱的 Windows hack,用于模拟透明度,仅适用于子窗口。 WPF 应用程序永远不需要的一个,非常不清楚您为什么使用它。顶级窗口应使用 AllowTransparency = True 和 0% 不透明背景画笔。

标签: c# wpf transparency


【解决方案1】:

我终于发现问题与通过 WS_EX_TRANSPARENT 或 WPF 中的 AllowTransparency=true 设置透明度无关,它与“0% 不透明背景画笔”有关。我只是忽略了我在那里所做的事情:为了在透明画布上绘画,您不能将其设置为 0% 不透明,因为这会导致您的鼠标事件被忽略。因此我将不透明度设置为 01 (Background="#01FFFFFF")。现在我意识到,当使用 16 位颜色分辨率时,这个值太小而无法检测到。它被视为 0% 的不透明度并且不再捕获鼠标事件。将背景设置为“04FFFFFF”解决了这个问题。以防万一其他人遇到同样的问题 - 我只是在查看代码的错误部分,试图解决这个问题......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 2011-04-23
    • 2021-07-26
    • 2012-07-11
    • 2011-10-06
    相关资源
    最近更新 更多