gpt4 book ai didi

c++ - 来自位的 HBITMAP

转载 作者:可可西里 更新时间:2023-11-01 11:34:34 24 4
gpt4 key购买 nike

在大快捷方式中,我正在尝试编写程序,该程序通过 NamedPipe 位图从另一个应用程序接收到的位图绘制位图。

我将分别发送 BITMAPINFO 结构和从 GetBitmapBits 函数获得的位图位。在接收端,我有一个线程使用 HeapAlloc 覆盖两个全局指针:pbmi_paint(指向 BITMAPINFO)和 lpBitmapBits_paint(用于位图位)。 pbmi_paint 中的数据似乎总是合法的。然后我尝试在 WndProc 中用这段代码绘制它:

case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
if(pbmi_paint != NULL && lpBitmapBits_paint != NULL) {
hBitmap = CreateDIBitmap( hdc,&(pbmi_paint->bmiHeader), CBM_INIT,(LPVOID) lpBitmapBits_paint,pbmi_paint,DIB_RGB_COLORS);
GetObject(hBitmap, sizeof(bitmap), &bitmap);

hdcMem = CreateCompatibleDC(hdc);
oldBitmap = (HBITMAP)SelectObject(hdcMem, hBitmap);
BitBlt(hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY);

SelectObject(hdcMem, oldBitmap);
DeleteDC(hdcMem);
DeleteObject(hBitmap);
}
EndPaint(hWnd, &ps);

然后我什么也得不到(黑色矩形)。我检查了 bitmap.bmBits,它等于 0x00000000(NULL,位图结构的另一个成员设置正确)。我还尝试以这种方式手动设置 bitmap.bmBits:

case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
if(pbmi_paint != NULL && lpBitmapBits_paint != NULL) {
hBitmap = CreateDIBitmap( hdc,&(pbmi_paint->bmiHeader), CBM_INIT,(LPVOID) lpBitmapBits_paint,pbmi_paint,DIB_RGB_COLORS);
GetObject(hBitmap, sizeof(bitmap), &bitmap);
bitmap.bmBits = lpBitmapBits_paint;
hBitmap1 = CreateBitmapIndirect(&bitmap);
hdcMem = CreateCompatibleDC(hdc);
oldBitmap = (HBITMAP)SelectObject(hdcMem, hBitmap1);
BitBlt(hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY);

SelectObject(hdcMem, oldBitmap);
DeleteDC(hdcMem);
DeleteObject(hBitmap);
DeleteObject(hBitmap1);
}

然后 hBitmap1 为 NULL。所以我的问题是为什么我不能在 CreateDIBitmap 或 CreateBitmapIndirect 中使用指向数据的指针?这些函数是否检查数据是否有效?

最佳答案

Windows 中的位图一团糟,尤其是 DDB(设备相关位图)。如果可能的话,我总是更喜欢使用 DIB(设备独立位图)。它们更易于使用,并且在现代硬件中应该没有任何明显的性能差异。

DIB 是用函数 CreateDIBSection() 创建的,像素数据是独立完成的。像这样:

void *pixels;
HBITMAP hBmp = CreateDIBSection(NULL, pbmi_paint, DIB_RGB_COLORS, &pixels, NULL, 0);
memcpy(pixels, lpBitmapBits_paint, NumBytesInBitmapBits_paint);

关于c++ - 来自位的 HBITMAP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14549123/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com