C++ ClearType破坏了透明度

C++ ClearType破坏了透明度,c++,winapi,bitmap,transparency,cleartype,C++,Winapi,Bitmap,Transparency,Cleartype,我有一个位图,背景需要替换为另一个位图的一部分。在我在WindowsXP上启用ClearFont之前,一切正常 为了更好地解释我的问题,让我们将第一个位图标记为bmpdestation,将第二个位图标记为bmpSource 以下是bmpSource的外观: 下面是bmpDestination的样子: 当ClearType处于禁用状态时,正确的结果如下所示: 下面是当ClearType打开时它们组合的错误结果: ClearType更改文本背景颜色的某些部分,因此它们不再是白色(RGB(25

我有一个位图,背景需要替换为另一个位图的一部分。在我在WindowsXP上启用ClearFont之前,一切正常

为了更好地解释我的问题,让我们将第一个位图标记为
bmpdestation
,将第二个位图标记为
bmpSource

以下是
bmpSource
的外观:

下面是
bmpDestination
的样子:

当ClearType处于禁用状态时,正确的结果如下所示:

下面是当ClearType打开时它们组合的错误结果:

ClearType更改文本背景颜色的某些部分,因此它们不再是白色(
RGB(255,255,255)
),而是白色和文本颜色的组合

我正在使用
BitBlt()
和单色位图创建遮罩,并模拟透明度。我也尝试过使用
TransparentBlt()
,但得到了相同的结果

启用ClearType时,如何组合
bmpSource
bmpDestination
,以便创建如上所述的正确结果

谢谢你的帮助


致以最诚挚的问候。

在白色背景上用黑色文本呈现树状视图。使用带有灰度消除混叠的字体。不要使用ClearType抗锯齿。我可以肯定,您可以使用
fdwQuality
参数中的一个参数
CreateFont
来实现这一点,但我不会发誓


每个像素将有一个介于白色和黑色之间的灰色阴影。您可以将其解释为透明度。白色是完全透明的;黑色是完全不透明的。使用此信息创建具有透明度的位图。在多色背景上渲染此透明位图。

ClearType混合前景和背景像素。在你的例子中,背景是白色的。然后尝试将这些像素转换为彩色背景,因此混合现在完全错误。您需要直接在最终背景上绘制文本。@RaymondChen:您需要直接在最终背景上绘制文本。不幸的是,在我的情况下,这是不可能的,因此发布此问题的原因。(该死,树视图自定义绘制问题又出现了!)我恐怕你再也不能让ClearType渲染对这种构图有用了——它只是在文本颜色和背景颜色之间添加了太多的阴影,即使是在一个成熟的图像处理程序中,你也无法自动过滤掉这些阴影。这是行不通的。您必须关闭ClearType或直接在背景上绘制文本。我不知道你为什么说这是不可能的,但如果不可能,那就不可能了。与其做你的蒙面BitBlt,不如使用内存DC,并在其中渲染与你在树视图中使用的相同的渐变背景。然后在内存DC顶部透明地绘制文本,最后从内存DC到树进行普通(非屏蔽)blit。我检查了
CreateFont
的文档,没有发现任何灰度字体。然而,我确实找到了一个标志
抗锯齿质量
,并试图用它创建字体。将其设置为treeview字体后,所有内容都呈现良好。不过,这些都是ClearType问题的解决方法。。。我想没有解决办法,只有一个解决办法。。。向上投票。非常感谢。顺致敬意,