在Windows中的屏幕上渲染缓冲区
Render Buffer on Screen in Windows
我正在寻找一种将字符缓冲区呈现到窗口内容区域的方法。这只是伪的,但旨在展示我真正想做的事情:
char buffer[300][200][3]; // 300px x 200px x RGB bytes
// ... render stuff into buffer
FancyWindowsFunctionToRenderBufferOnWindow(my_hwnd, buffer, 300, 200, offset_x, offset_y);
有没有类似的方法?
我认为您需要创建一个与设备无关的位图(DIB)。如果您已经有一个像素数组准备放在应用程序窗口上,则可能需要将整个数组复制到CreateDIB部分API分配的缓冲区,并调用BitBlt将DIB传输到窗口。这是我所知道的在Win32平台上的计算机屏幕上以可见图片的形式显示像素阵列的唯一方法,它非常复杂,难以理解。
以下是我用来测试类似于你想做的事情的步骤:
创建DIB:
BITMAPINFO bmi;
memset(&bmi, 0, sizeof(bmi));
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = /* Width of your image buffer */
bmi.bmiHeader.biHeight = - /* Height of your image buffer */
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biCompression = BI_RGB;
HDC hDesktopDC = GetDC(GetDesktopWindow());
HBITMAP hDib = CreateDIBSection(hDesktopDC, &bmi, DIB_RGB_COLORS, (void **)&buffer, 0, 0);
if (buffer == NULL) { /* ERROR */ }
HDC hDibDC = CreateCompatibleDC(hDesktopDC);
HGDIOBJ hOldObj = SelectObject(hDibDC, hDib);
/* Copy your array of pixels to buffer allocated above. */
ReleaseDC(GetDesktopWindow(), hDesktopDC);
实现WM_PAINT事件处理程序(hWnd变量包含下面的窗口句柄):
case WM_PAINT:
PAINTSTRUCT paint;
HDC hWndDc = BeginPaint(hWnd, &paint);
BitBlt(hWndDC, 0, 0, /* Width of DIB */, /* Height of DIB */,
/* HDC of DIB (hDibDC in the above) */, 0, 0, SRCCOPY);
EndPaint(hWnd, &paint);
break;
我真的不希望上面的代码片段会直接帮助你。如果您决定使用GDI函数,如上面片段中的函数,我建议您仔细阅读MSDN上的API文档。因为正确释放或删除在使用API期间获取的DC或GDI对象是非常棘手的。
听起来像是将图像(光栅)存储为字符数组(这是一个奇怪的选择,因为对于原始位图图像,通常需要一个无符号字符数组)。
如果您满足某些对齐约束,您可以使用SetDIBits非常直接地显示位图。您填写一个描述像素格式和图像尺寸的BITMAPINFO结构,然后将其与数据一起传递给SetDIBits。它会把他们画成DC。要把所有的参数都弄对可能有点棘手。
对齐要求是每条扫描线必须从4字节的边界开始。如果你不满足这个要求,你会得到类似错误步伐的垃圾。如有必要,可以使用正确的对齐方式复制数据。
相关文章:
- C++字符*缓冲区的大小
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- ostream过载时的缓冲区冲洗
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- Xaudio2在更改缓冲区或循环时弹出声音
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- Vulkan:从屏幕外缓冲区呈现给交换链
- 通过行和列设置控制台屏幕尺寸和屏幕缓冲区
- 如何绘制到目标纹理大于屏幕分辨率的帧缓冲区
- 从交换链获取多个屏幕缓冲区
- 如何制作屏幕缓冲区 c++
- 复制命令/Powershell 窗口屏幕缓冲区
- OSX+屏幕外渲染+CoreGL+帧缓冲区+着色器=头疼
- 如何在一个屏幕中使用两个缓冲区?可能吗?(快板)
- 如何将屏幕图像放入内存缓冲区
- 在Windows中的屏幕上渲染缓冲区
- 使用wxWidgets在内存中绘制8位灰度图像缓冲区到屏幕
- 在将线条渲染到屏幕外缓冲区方面,Direct 2D 会比 Qt 更好吗?
- 为防止屏幕撕裂,每帧分配一个新的缓冲区