在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); 

有没有办法做类似的事情?

+1

这个问题很广泛,也许你想要[winapi DrawText](http://*.com/search?q= [winapi] + drawtext)? – 2012-04-05 22:02:50

+0

你是否将文字绘制到自己的窗口或其他程序的窗口上? – chris 2012-04-05 22:11:42

+0

@ Jesse,chris你们如何得出我想在窗口上画文字的结论?'^^ – 2012-04-07 09:17:26

我认为你需要创建一个设备无关位图(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字节边界开始。如果你不符合这个要求,你会得到类似于错误步幅的垃圾。如有必要,您可以使用正确的对齐方式复制数据。

+0

谢谢,我会检查出来的!你是对的,你通常对RGB值使用'unsigned char',在写这个问题时不记得那个。 – 2012-04-07 09:24:41