我在寻找一种方式呈现一个字符缓冲区到窗口的内容区域。 这仅仅是伪,但为了证明我真正想要做的:
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);
有没有办法做同样的事情?
我在寻找一种方式呈现一个字符缓冲区到窗口的内容区域。 这仅仅是伪,但为了证明我真正想要做的:
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字节的边界上。 如果你不符合这个要求,你会得到与具有错误的步幅垃圾。 您可以进行数据的拷贝以正确的定位,如果必要的。