在 CF_BITMAP 中,可以使用 CF_DIB 格式来保存位图数据,而不是使用 GlobalSize 和 memcpy 函数来保存字节。

CF_DIB 格式中的数据结构是 BITMAPINFOHEADER 加上位图数据。BITMAPINFOHEADER 结构包含了位图的信息,如宽度、高度、位深等。位图数据就是实际的像素数据。

保存位图数据的方法是首先创建一个 BITMAPINFOHEADER 结构,将位图的信息填充到这个结构中。然后,将位图的像素数据拷贝到一个新的内存块中,再将这个内存块设置为 CF_DIB 格式的剪贴板数据。

以下是一个示例代码,展示了如何保存位图数据到 CF_DIB 格式的剪贴板数据:

HBITMAP hBitmap = ...; // 获取位图句柄

// 获取位图信息
BITMAP bm;
GetObject(hBitmap, sizeof(BITMAP), &bm);

// 创建 BITMAPINFOHEADER 结构并填充信息
BITMAPINFOHEADER bi;
ZeroMemory(&bi, sizeof(BITMAPINFOHEADER));
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = bm.bmWidth;
bi.biHeight = bm.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = bm.bmBitsPixel;
bi.biCompression = BI_RGB;
bi.biSizeImage = bm.bmWidthBytes * bm.bmHeight;

// 创建新的内存块,用于保存位图像素数据
HGLOBAL hDib = GlobalAlloc(GHND, sizeof(BITMAPINFOHEADER) + bi.biSizeImage);
LPVOID lpDib = GlobalLock(hDib);

// 将 BITMAPINFOHEADER 结构拷贝到内存块中
memcpy(lpDib, &bi, sizeof(BITMAPINFOHEADER));

// 将位图像素数据拷贝到内存块中
LPVOID lpBits = (LPBYTE)lpDib + sizeof(BITMAPINFOHEADER);
GetBitmapBits(hBitmap, bi.biSizeImage, lpBits);

// 设置剪贴板数据为 CF_DIB 格式
OpenClipboard(NULL);
EmptyClipboard();
SetClipboardData(CF_DIB, hDib);
CloseClipboard();

// 释放内存块
GlobalUnlock(hDib);
GlobalFree(hDib);

这样,位图数据就会以 CF_DIB 格式保存在剪贴板中了。可以使用 GetClipboardData 函数获取位图数据,并进行后续处理。

CF_BITMAP 保存位图数据:使用 CF_DIB 格式代替 GlobalSize 和 memcpy

原文地址: https://www.cveoy.top/t/topic/qgY5 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录