Nik*_*s R 4 c c++ windows buffer render
我正在寻找一种将char缓冲区渲染到窗口内容区域的方法.这只是伪的,但旨在展示我真正想做的事情:
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);
Run Code Online (Sandbox Code Playgroud)
有没有办法做类似的事情?
小智 8
我认为你需要创建一个独立于设备的位图(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);
Run Code Online (Sandbox Code Playgroud)
实现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;
Run Code Online (Sandbox Code Playgroud)
我真的不希望上面的代码片段会直接帮到你.如果您决定使用上述代码段中的GDI函数,我建议您仔细阅读MSDN上的API文档.因为正确释放或删除在使用API期间获取的DC或GDI对象非常棘手.