C++:本地图片拷贝到剪切板
程序员文章站
2022-06-16 10:48:44
...
1、本地图片转换为HBITMAP
HBITMAP CNoteWindow::CopySelectRectBitmap(LPCTSTR lpszPath)
{
HBITMAP hBitmap = NULL;
//背景色设置为白色。
Color backColor = Color(255,255,255,255);
//Status sts
if (PathFileExists(lpszPath))
{
Bitmap* pBitmap = Bitmap::FromFile(lpszPath);
Status sts = pBitmap->GetLastStatus();
sts = pBitmap->GetHBITMAP(backColor, &hBitmap);
if (sts == Ok)
{
int k = 0;
}
}
int error = GetLastError();
return hBitmap;
}
2、HBITMAP 拷贝到剪切板
bool CNoteWindow::BitmapToClipboard(HBITMAP hBM, HWND hWnd)
{
if (!::OpenClipboard(hWnd))
return false;
::EmptyClipboard();
BITMAP bm;
::GetObject(hBM, sizeof(bm), &bm);
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;
if (bi.biBitCount <= 1) // make sure bits per pixel is valid
bi.biBitCount = 1;
else if (bi.biBitCount <= 4)
bi.biBitCount = 4;
else if (bi.biBitCount <= 8)
bi.biBitCount = 8;
else // if greater than 8-bit, force to 24-bit
bi.biBitCount = 24;
// Get size of color table.
SIZE_T dwColTableLen = (bi.biBitCount <= 8) ? (1 << bi.biBitCount) * sizeof(RGBQUAD) : 0;
// Create a device context with palette
HDC hDC = ::GetDC(NULL);
HPALETTE hPal = static_cast<HPALETTE>(::GetStockObject(DEFAULT_PALETTE));
HPALETTE hOldPal = ::SelectPalette(hDC, hPal, FALSE);
::RealizePalette(hDC);
// Use GetDIBits to calculate the image size.
::GetDIBits(hDC, hBM, 0, static_cast<UINT>(bi.biHeight), NULL,
reinterpret_cast<LPBITMAPINFO>(&bi), DIB_RGB_COLORS);
// If the driver did not fill in the biSizeImage field, then compute it.
// Each scan line of the image is aligned on a DWORD (32bit) boundary.
if (0 == bi.biSizeImage)
bi.biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8) * bi.biHeight;
// Allocate memory
HGLOBAL hDIB = ::GlobalAlloc(GMEM_MOVEABLE, sizeof(BITMAPINFOHEADER) + dwColTableLen + bi.biSizeImage);
if (hDIB)
{
union tagHdr_u
{
LPVOID p;
LPBYTE pByte;
LPBITMAPINFOHEADER pHdr;
LPBITMAPINFO pInfo;
} Hdr;
Hdr.p = ::GlobalLock(hDIB);
// Copy the header
::CopyMemory(Hdr.p, &bi, sizeof(BITMAPINFOHEADER));
// Convert/copy the image bits and create the color table
int nConv = ::GetDIBits(hDC, hBM, 0, static_cast<UINT>(bi.biHeight),
Hdr.pByte + sizeof(BITMAPINFOHEADER) + dwColTableLen,
Hdr.pInfo, DIB_RGB_COLORS);
::GlobalUnlock(hDIB);
if (!nConv)
{
::GlobalFree(hDIB);
hDIB = NULL;
}
}
if (hDIB)
::SetClipboardData(CF_DIB, hDIB);
::CloseClipboard();
::SelectPalette(hDC, hOldPal, FALSE);
::ReleaseDC(NULL, hDC);
return NULL != hDIB;
}
参考:
https://www.codeproject.com/Questions/344732/copy-hbitmap-to-clipboard%20%E5%9B%9E%E5%A4%8D%20%E8%B5%9E
上一篇: 【转】京东云缓存JIMDB建设之路
下一篇: 如何用PHP实现插入排序?_PHP