如何将DC中的数据转存为bmp?? 如题 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 创建一个CBitmap,然后把DC中的内容BitBlt到已经选入这个CBitmap的DC中,代码不想写 这是截取界面上一部分内容的代码,你可以看一看!HBITMAP CPaintArea::CopyScreenToBitmap(LPRECT lpRect) { HDC hScrDC, hMemDC; HBITMAP hBitmap,hOldBitmap; int nX, nY, nX2, nY2; int nWidth, nHeight; int xScrn, yScrn; if (IsRectEmpty(lpRect)) return NULL; hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL); hMemDC = CreateCompatibleDC(hScrDC); nX = lpRect->left; nY = lpRect->top; nX2 = lpRect->right; nY2 = lpRect->bottom; xScrn = GetDeviceCaps(hScrDC, HORZRES); yScrn = GetDeviceCaps(hScrDC, VERTRES); if (nX < 0) nX = 0; if (nY < 0) nY = 0; if (nX2 > xScrn) nX2 = xScrn; if (nY2 > yScrn) nY2 = yScrn; nWidth = nX2 - nX; nHeight = nY2 - nY; hBitmap=CreateCompatibleBitmap(hScrDC,nWidth,nHeight); hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBitmap); BitBlt(hMemDC,0,0, nWidth,nHeight,hScrDC, nX, nY, SRCCOPY); hBitmap=(HBITMAP)SelectObject(hMemDC,hOldBitmap); DeleteDC(hScrDC); DeleteDC(hMemDC); return hBitmap; } BOOL CPaintArea::SaveBitmapToFile(HBITMAP hBitmap, LPSTR lpFileName) { HDC hDC; CDC dc; int iBits; // Bits per pixel in current resolution WORD wBitCount; // Bits per pixel in bitmap DWORD dwPaletteSize = 0, dwBmBitsSize, dwDIBSize, dwWritten; BITMAP Bitmap; BITMAPFILEHEADER bmfHdr; BITMAPINFOHEADER bi; LPBITMAPINFOHEADER lpbi; HANDLE fh, hDib, hPal; HPALETTE hOldPal = NULL; // Compute use bits per pixel of bitmap dc.CreateDC("DISPLAY", NULL, NULL, NULL); iBits = GetDeviceCaps(dc, BITSPIXEL) * GetDeviceCaps(dc, PLANES); DeleteDC(dc); if (iBits <= 1) wBitCount = 1; else if (iBits <= 4) wBitCount = 4; else if (iBits <= 8) wBitCount = 8; else if (iBits <= 24) wBitCount = 24; else if (iBits <= 32) wBitCount = 32; // Compute palette size if (wBitCount <= 8) dwPaletteSize=(1< // Set bitmap header GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap); bi.biSize = sizeof(BITMAPINFOHEADER); bi.biWidth = Bitmap.bmWidth; bi.biHeight = Bitmap.bmHeight; bi.biPlanes = 1; bi.biBitCount = wBitCount; bi.biCompression = BI_RGB; bi.biSizeImage = 0; bi.biXPelsPerMeter = 0; bi.biYPelsPerMeter = 0; bi.biClrUsed = 0; bi.biClrImportant = 0; dwBmBitsSize = ((Bitmap.bmWidth*wBitCount+31)/32)*4*Bitmap.bmHeight; // Allocate memory for bitmap hDib = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER)); lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib); *lpbi = bi; // Process palette hPal = GetStockObject(DEFAULT_PALETTE); if (hPal) { hDC = ::GetDC(NULL); hOldPal = SelectPalette(hDC,(HPALETTE)hPal,FALSE); RealizePalette(hDC); } // Gain pixel value in new palette GetDIBits(hDC,hBitmap,0,(UINT)Bitmap.bmHeight,(LPSTR)lpbi+sizeof(BITMAPINFOHEADER)+dwPaletteSize, (BITMAPINFO *)lpbi,DIB_RGB_COLORS); // Restore palette if (hOldPal) { SelectPalette(hDC, hOldPal, TRUE); RealizePalette(hDC); ::ReleaseDC(NULL, hDC); } // Create bitmap file fh = CreateFile(lpFileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); if (fh==INVALID_HANDLE_VALUE) return FALSE; // Set bitmap file header bmfHdr.bfType = 0x4D42; // "BM" dwDIBSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwBmBitsSize; bmfHdr.bfSize = dwDIBSize; bmfHdr.bfReserved1 = 0; bmfHdr.bfReserved2 = 0; bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER)+dwPaletteSize; // Write bitmap file header WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL); // Write bitmap body WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL); // Memory release GlobalUnlock(hDib); GlobalFree(hDib); CloseHandle(fh); return TRUE; } 你说的是windows系统的吗?应用程序应该没什么问题啊!系统的好象是个固定值! 单文档视类拆分问题 MFC 里面的多个按钮响应 LButtonDown,LButtonUp消息.. vs2010的问题,关于CString、 三维重建 VTK 那些基本objects的使用说明有吗?? 高手来帮忙看看,关于函数指针的问题,非高手也学习学习吧, 为什么枚举不了win2000登录窗口的子窗口? 请问,在InstallShield安装程序中加序列号检验是怎么实现的? vc获取本地ipv6地址的出错? dll中无法显示DialogBox,大家帮忙看看原因。 航空姿态仪表 哪里有vc工具软件??????? 帮我看看这是什么错误啊?如何解决啊?
代码不想写
HBITMAP CPaintArea::CopyScreenToBitmap(LPRECT lpRect)
{
HDC hScrDC, hMemDC;
HBITMAP hBitmap,hOldBitmap;
int nX, nY, nX2, nY2;
int nWidth, nHeight;
int xScrn, yScrn; if (IsRectEmpty(lpRect))
return NULL;
hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
hMemDC = CreateCompatibleDC(hScrDC); nX = lpRect->left;
nY = lpRect->top;
nX2 = lpRect->right;
nY2 = lpRect->bottom; xScrn = GetDeviceCaps(hScrDC, HORZRES);
yScrn = GetDeviceCaps(hScrDC, VERTRES); if (nX < 0)
nX = 0;
if (nY < 0)
nY = 0;
if (nX2 > xScrn)
nX2 = xScrn;
if (nY2 > yScrn)
nY2 = yScrn;
nWidth = nX2 - nX;
nHeight = nY2 - nY;
hBitmap=CreateCompatibleBitmap(hScrDC,nWidth,nHeight);
hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBitmap);
BitBlt(hMemDC,0,0, nWidth,nHeight,hScrDC, nX, nY, SRCCOPY); hBitmap=(HBITMAP)SelectObject(hMemDC,hOldBitmap); DeleteDC(hScrDC);
DeleteDC(hMemDC); return hBitmap;
} BOOL CPaintArea::SaveBitmapToFile(HBITMAP hBitmap, LPSTR lpFileName)
{
HDC hDC;
CDC dc;
int iBits; // Bits per pixel in current resolution
WORD wBitCount; // Bits per pixel in bitmap
DWORD dwPaletteSize = 0, dwBmBitsSize, dwDIBSize, dwWritten;
BITMAP Bitmap;
BITMAPFILEHEADER bmfHdr;
BITMAPINFOHEADER bi;
LPBITMAPINFOHEADER lpbi;
HANDLE fh, hDib, hPal;
HPALETTE hOldPal = NULL; // Compute use bits per pixel of bitmap
dc.CreateDC("DISPLAY", NULL, NULL, NULL);
iBits = GetDeviceCaps(dc, BITSPIXEL) * GetDeviceCaps(dc, PLANES);
DeleteDC(dc); if (iBits <= 1)
wBitCount = 1;
else if (iBits <= 4)
wBitCount = 4;
else if (iBits <= 8)
wBitCount = 8;
else if (iBits <= 24)
wBitCount = 24;
else if (iBits <= 32)
wBitCount = 32; // Compute palette size
if (wBitCount <= 8)
dwPaletteSize=(1<
// Set bitmap header
GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = Bitmap.bmWidth;
bi.biHeight = Bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = wBitCount;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0; dwBmBitsSize = ((Bitmap.bmWidth*wBitCount+31)/32)*4*Bitmap.bmHeight; // Allocate memory for bitmap
hDib = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
*lpbi = bi; // Process palette
hPal = GetStockObject(DEFAULT_PALETTE);
if (hPal)
{
hDC = ::GetDC(NULL);
hOldPal = SelectPalette(hDC,(HPALETTE)hPal,FALSE);
RealizePalette(hDC);
} // Gain pixel value in new palette
GetDIBits(hDC,hBitmap,0,(UINT)Bitmap.bmHeight,(LPSTR)lpbi+sizeof(BITMAPINFOHEADER)+dwPaletteSize, (BITMAPINFO *)lpbi,DIB_RGB_COLORS); // Restore palette
if (hOldPal)
{
SelectPalette(hDC, hOldPal, TRUE);
RealizePalette(hDC);
::ReleaseDC(NULL, hDC);
} // Create bitmap file
fh = CreateFile(lpFileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (fh==INVALID_HANDLE_VALUE)
return FALSE; // Set bitmap file header
bmfHdr.bfType = 0x4D42; // "BM"
dwDIBSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwBmBitsSize;
bmfHdr.bfSize = dwDIBSize;
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER)+dwPaletteSize; // Write bitmap file header
WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL); // Write bitmap body
WriteFile(fh, (LPSTR)lpbi, dwDIBSize,
&dwWritten, NULL); // Memory release
GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(fh);
return TRUE;
}