c++ - Windows 屏幕上的渲染缓冲区

标签 c++ c windows buffer render

我正在寻找一种将字符缓冲区渲染到窗口内容区域的方法。这只是伪的,但旨在演示我真正想做的事情:

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)。如果您已经有一个准备放在应用程序窗口上的像素数组,则可能需要将整个数组复制到 CreateDIBSection 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对象是非常棘手的。

关于c++ - Windows 屏幕上的渲染缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54965559/

相关文章:

c - 将接收到的、格式化的 UDP 字符数组分配给 C 中的无符号整数

c - 处理 Linux 内核数据包路由的更好方法

c++ - C::PlaySound循环开始端的循环声音

windows - 任何我不应该在我的Visual C++程序中添加GUID验证的原因?

c++ - 在不传递参数的情况下重载 C++ 函数

c++ - Vector 没有退缩

c++ - 在c或c++中使用int32_t?

c++ - Windows CreateFile - 文件打开时的动态共享模式?

C++根据重量计算运费

c++ - 基本类型数组的迭代器类型