在Windows屏幕上渲染缓冲区
我正在寻找一种方法将字符缓冲区渲染到窗口的内容区域。这只是伪造的,但意在展示我真正想要做的事情:在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)。如果已经有一个像素数组已准备好放在应用程序窗口上,则可能需要将整个数组复制到由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对象是非常棘手的。
这听起来像你有一个图像(光栅)存储为一个字符数组(这是一个奇怪的选择,因为你通常需要一个无符号字符数组的原始位图图像)。
如果您遇到一定的对齐限制,您可以直接用SetDIBits直接显示您的位图。您填写描述像素格式和图像尺寸的BITMAPINFO结构,然后将其与数据一起传递给SetDIBits。它会将它们绘制成DC。让所有参数正确可能有点棘手。
对齐要求是每条扫描线必须以4字节边界开始。如果你不符合这个要求,你会得到类似于错误步幅的垃圾。如有必要,您可以使用正确的对齐方式复制数据。
谢谢,我会检查出来的!你是对的,你通常对RGB值使用'unsigned char',在写这个问题时不记得那个。 – 2012-04-07 09:24:41
这个问题很广泛,也许你想要[winapi DrawText](http://*.com/search?q= [winapi] + drawtext)? – 2012-04-05 22:02:50
你是否将文字绘制到自己的窗口或其他程序的窗口上? – chris 2012-04-05 22:11:42
@ Jesse,chris你们如何得出我想在窗口上画文字的结论?'^^ – 2012-04-07 09:17:26