- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在客户区有一个透明背景的应用程序,它被绘制成黑色,因为窗口没有分层。在每个 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 信息。
所以我在谷歌上搜索了很多解决方案。我发现在这种情况下,我必须使用
创建内存 DCHDC hdcMemory = CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);
而不是 CreateCompatibleDC(NULL)。因为兼容的 DC 会给我一个 16 位 DC。
使用 CreateDC 绘图效果更好。但是整个窗口仍然可以点击,并且在分层窗口中透明度被绘制成黑色。
所以我认为问题出在 BitBlt 或 CreateDIBSection 的 BitmapInfoHeader 上。
我不知道是使用 BitmapInfoHeader.biBitCount = 32 位还是 BitmapInfoHeader.biBitCount = 16 位。认为它是 32。那么 biCompression -> BI_RGB 或 BI_BITFIELDS 呢?
如何在 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/
我正在使用下面的代码使用 bltblt 捕获窗口的屏幕截图。但是,标题栏在捕获的屏幕截图中显示为完全黑色。我在 Windows 8.1 上运行代码。有没有一种方法可以正确捕获标题栏。 // Retri
我有一个将多页 tiff 拆分为单页的函数,它使用 Windows BitBlt 函数。在性能方面,显卡对拆分有影响吗?是否值得直接使用 C/C++ 库? 最佳答案 显卡不会参与任何事件,除非它是 B
我正在尝试编写一个程序,当勾选一个复选框时,它会在屏幕的大面积区域显示一个网格。我正在尝试使用 BitBlt 在 WM_PAINT 中执行此操作,并且我的显示函数肯定是使用正确的 bool 值调用的。
我正在使用 MFC,我正在尝试将图像绘制到屏幕上。我有以下 OnDraw 函数: void CgraphicstestView::OnDraw(CDC* pDC) { CgraphicstestDo
我正在将剪贴板中的图像粘贴到我的程序中。位图被放置在背景 memDC 位图上,然后在绘制到屏幕之前与另一个 memDC 合成。背景位图是每像素 8 位。问题是 bitblt 将 Black(0x000
我正在使用 BitBlt 在我的按钮上显示位图。对于大多数情况,它很好,但是存在内存泄漏,导致程序在一段时间后崩溃。我做错了什么? int Springboard::DrawBasicButtons(
我正在为一个简单的 Direct3D 游戏制作闪屏,尽管屏幕本身已正确创建和销毁,但未显示要投影到闪屏上的 BITMAP。到目前为止我有这个: //variable declarations HWND
我有一个 MFC 控件,我将一个句柄传递给一个位图 (HBITMAP)。在控件 OnPaint 方法中,我使用 BitBlt 来呈现位图。但是位图被颠倒了。 作为测试,我从这个句柄创建了一个 CBit
我正在尝试在 Windows 10 下使用 GDI 捕获屏幕的正方形部分。这就是我尝试的方式: //Get screen DC desktop = GetDC(NULL); //Create a co
我想在现有引擎中创建裁剪功能。这是我已经拥有的: bool Bitmap::Crop(RECT cropArea) { BITMAP bm; GetObject(m_Handle, sizeof(bm
我正在尝试使用此代码将 Bitmap 直接绘制到 PictureBox 上: Bitmap bmp = (Bitmap)Bitmap.FromFile(@"C:\Users\Ken\Desktop\L
我正在尝试绘制到屏幕外设备上下文/位图,并使用 bitblt 将图像移动到主 hdc。这是我目前看到的结果: 左边的蓝色、黄色和绿色条被直接绘制到窗口的 hdc。右边看起来很奇怪的那些被绘制到后台缓冲
我想创建一个幻灯片效果:在窗体的 Canvas 上从右到左绘制一个位图。为此,我使用 BitBlt。 我在定时器(20 毫秒)中调用此函数: var ViewPort: TRect; ViewPort
您好我试图捕获屏幕截图,但图像出来损坏,任何人都可以看到代码有什么问题,基本上我试图使用createdibsection以便我可以直接访问这些位。 这就是结果图片 http://oi47.tinypi
将一个 QImage 复制到 Qt4 中特定位置的另一个 QImage 的推荐方法是什么? QImage::bitblt 在 Qt4 中被删除。 QImage 现在需要转换为 PixMap 并返回吗?
我在这个程序中使用 BitBlt 时遇到问题。您调整窗口大小,椭圆也会随之调整大小。当然,用普通的hdc方法,是断断续续的。我尝试了 BitBlt 方法,但这也不起作用(可能是因为我做错了)。有人可以
这是我目前正在做的: 通过GetWindowDC获取窗口DC 使用 CreateCompatibleDC 创建一个兼容的 DC 在我的兼容 DC 上调用 GetPixel 不幸的是,我所有的 GetP
现在我正在使用 GetPixel() 从桌面检索大约 64 个像素以获得它们的颜色。我读到有关 GetPixel() 的信息很慢,但我认为这对几个像素并不重要,但每次我运行例程都需要 1.5 秒。在做
我编写了以下代码 (C++ Win32) 来捕获游戏窗口屏幕并从图像中获取像素颜色数组。函数 autoB() 完成这项工作。 然后我将结果数组绘制到我的窗口中以直观地检查我得到了什么。 问题是这个程序
我目前正在使用 Petzold 的书(第 5 版)回到一些 Windows 编程。我编译了following example使用 BitBlt 但它无法正常工作。 它应该复制 (CxSource, C
我是一名优秀的程序员,十分优秀!