HBITMAP from bits
HBITMAP from bits
在大快捷方式中,我正在尝试编写程序,该程序从另一个应用程序的NamedPipe位图中通过NamedPipe位图接收到位图。
我正在分别发送从GetBitmapBits函数获得的BITMAPINFO结构和位图位。在接收端,我有一个线程,它使用 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为空。所以我的问题是为什么我不能在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);
相关文章:
- 如何解决"invalid conversion from 'char' to 'const char*'"
- std::async from std::async in windows xp
- std::is_reference from std::any
- std::time_point from and to std::string
- "No suitable conversion function from 'std::string' to 'const char *' exists"
- std::chrono::time_point from std::string
- Visual accept std::string from std::byte iterator
- 我在 #include < bits/stdc++h.> 放置时出错"No such file or directory"
- C++中链表的错误"Abort signal from abort(3) (sigabrt) "
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- C++ 中的"template <typename From, typename Tag> struct Alias;"是什么?
- from std::vector to adept::avector
- qt get child (Callout) from QChart
- Webassembly from Javascript
- Generate boost::uuids::uuid from boost::compute::detail::sha
- bits/stdc++.h 包含哪些头文件?
- 什么是"Reading unbounded stream from standard input (Memory Management)"的例子
- Calling C++ dll from python
- opencv Mat 16 bits from QVector
- HBITMAP from bits