【问题标题】:Specifiying twice LWA_COLORKEY in Win32 API在 Win32 API 中指定两次 LWA COLORKEY
【发布时间】:2021-12-24 10:26:23
【问题描述】:

我正在尝试找到一种能够在特定窗口上替换 2 种颜色的方法(这不是我制作的,这是另一个问题)。

LONG ExtendedStyle = GetWindowLong(handle,GWL_EXSTYLE );
SetWindowLong(handle,GWL_EXSTYLE,ExtendedStyle | WS_EX_LAYERED );
::SetLayeredWindowAttributes(handle,RGB(251,254,249),0,LWA_COLORKEY);

这很好用,现在我尝试调用两次:

::SetLayeredWindowAttributes(handle,RGB(251,254,249),0,LWA_COLORKEY);

使用不同的颜色代码

LONG ExtendedStyle = GetWindowLong(handle,GWL_EXSTYLE );
SetWindowLong(handle,GWL_EXSTYLE,ExtendedStyle | WS_EX_LAYERED );
::SetLayeredWindowAttributes(handle,RGB(251,254,249),0,LWA_COLORKEY);
::SetLayeredWindowAttributes(handle,RGB(251,254,220),0,LWA_COLORKEY);

这不起作用,只考虑最后一个,我已经进行了广泛的搜索,并希望不要进入太高级的解决方案,因为我的问题看起来很简单。有人知道吗?

编辑:对不起,我对这个 API 很不熟悉,我有一个客户端需要我在一个窗口中替换 2 种颜色(或更多),我已经在这方面浪费了太多时间。非常欢迎您的帮助。谢谢

【问题讨论】:

  • 如果您控制有问题的窗口,则需要使用每像素 Alpha 透明度而不是颜色键透明度。如果您不控制窗口,那么您将无能为力。
  • SetLayeredWindowAttributes() 一次只支持一种透明色。对于更高级的透明度/半透明需求,您必须改用UpdateLayeredWindow()
  • 感谢您的回复!我已经开始研究 UpdateLayeredWindow 但我不知道如何同时做两种颜色,似乎我可以做一种,然后一种,然后一种(抹去前一种)。我需要在我无法控制的窗口中用 2 种其他颜色替换 2 种颜色。

标签: c++ winapi


【解决方案1】:

根据SetLayeredWindowAttributes function的文档,如果使用参数LWA_COLORKEY,那么表单中颜色为crKey的所有区域都将变为透明,bAlpha参数无效。所以只有最后一个函数是有效的。如果要让多个区域透明,可以提前设置成相同颜色。

【讨论】:

  • 问题是我不知道Window中的区域,我需要用其他颜色替换某组颜色(例如#FFF和#000),但是多个颜色,不仅仅是一。
  • 就像@Remy Lebeau 所说,尝试UpdateLayeredWindow() 使多个区域透明。
  • 是的,但我并不是真的想让一个区域透明,我想用 2 种其他颜色替换 2 种颜色。我已经检查了 UpdateLayeredWindow() 的文档,但没有看到可以让我不必经常调用它就可以做到这一点的信息。
  • 可以在WM_PAINT消息中绘制一个客户区大小的Rectangle,使用Rectangle并设置填充颜色覆盖背景色。
  • 我已经尝试过您的解决方案,但它确实覆盖了初始窗口的背景(原始窗口中的颜色仍然存在,矩形只是在顶部),它不会替换另一个像素:/
猜你喜欢
  • 1970-01-01
  • 2011-07-28
  • 2021-10-02
  • 2019-09-23
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多