gpt4 book ai didi

c++ - 16 位桌面颜色深度的 BitBlt + UpdateLayeredWindow 和 CreateDIBSection

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:02:10 29 4
gpt4 key购买 nike

我在客户区有一个透明背景的应用程序,它被绘制成黑色,因为窗口没有分层。在每个 WM_PAINT 消息中,我对内存 DC 执行 BitBlt,之后我将内存 DC 与 UpdateLayeredWindow 一起用于分层 Canvas 窗口。​​

内存-DC的设置:

HDC hdcMemory = CreateCompatibleDC(NULL);
HBITMAP bmpMemory = CreateDIBSection(hdcMemory, (BITMAPINFO*)&m_BitmapInfoHeader,
DIB_RGB_COLORS, (void **)&m_pDIBSectionBits, NULL, (DWORD)0);
SelectObject(hdcMemory, bmpMemory);

在 WM_PAINT 中,我使用 BitBlt 函数将应用程序客户区 DC 信息复制到内存 DC。之后,我将使用内存 DC 对分层 Canvas 窗口 DC(其 CWnd)执行 UpdateLayeredWindow。所以它是实时的,结果是:我有正常的应用程序窗口和分层窗口,此外还有不规则形状和每像素透明度。

在 32 位桌面颜色深度下一切正常!如果我切换到 16 位,分层 Canvas 窗口就会变得困惑。绘图看起来很糟糕,整个窗口都可以点击。

它认为这是因为缺少 alpha channel 信息。

所以我在谷歌上搜索了很多解决方案。我发现在这种情况下,我必须使用

创建内存 DC
HDC hdcMemory = CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);

而不是 CreateCompatibleDC(NULL)。因为兼容的 DC 会给我一个 16 位 DC。

使用 CreateDC 绘图效果更好。但是整个窗口仍然可以点击,并且在分层窗口中透明度被绘制成黑色。

所以我认为问题出在 BitBlt 或 CreateDIBSection 的 BitmapInfoHeader 上。

  1. 我不知道是使用 BitmapInfoHeader.biBitCount = 32 位还是 BitmapInfoHeader.biBitCount = 16 位。认为它是 32。那么 biCompression -> BI_RGB 或 BI_BITFIELDS 呢?

  2. 如何在 BitBlt(..., SRCCOPY) 将 16 位 DC 添加到内存 DC 之后将 alpha channel 信息添加到内存 DC,以便它与 UpdateLayeredWindow 一起工作? (也许:将 rgb channel 与 alpha channel 预乘?)不知道该怎么做。


我稍微接近了 16 位桌面颜色深度问题。

HDC hdcMemory = CreateCompatibleDC(NULL);

以上似乎有效。但是我的 UpdateLayeredWindow 函数产生的结果看起来很乱。

所以,这是因为缺少黑色!每个全黑的像素都变得透明。您可以看透并单击。所有其他像素都失去了黑色部分,只能通过点击。

我做了一个测试:我打开了Windows Paint.exe,做了一个窗口宽度和高度的表面,黑色作为填充颜色。

然后我把它放在我的分层窗口下面(缺少黑色),再次将分层窗口作为 forgeround 窗口,然后 ta-da,我的分层窗口结合 Shiny 的 Paint.exe 黑色像素看起来很正常。

所以我用 BitBlt 过期了,它又是光栅操作参数。但运气不好。

在使用 UpdateLayeredWindow 绘图之前,如何将黑色与 BitBlt 混合到我的 DC?

最佳答案

看这里: http://msdn.microsoft.com/en-us/library/aa453651.aspx我确信这是一个光栅操作问题。

关于c++ - 16 位桌面颜色深度的 BitBlt + UpdateLayeredWindow 和 CreateDIBSection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3322581/

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