如何得到一个CBitmap对象? 在CDC *pdc中,如何得到一个这个视的显示内容.相当于抓图,把这个视显示内容,存为一个Cbitmap对象.. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://www.vckbase.com/document/viewdoc/?id=263 void CXXXView::OnSavebitmap(){CString FileName;static char BASED_CODE sz_Filter[] = "位图文件 (*.bmp)|*.bmp||";CFileDialog dlg(FALSE, "bmp", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, sz_Filter, NULL);if(dlg.DoModal() == IDOK)FileName=dlg.GetPathName();elsereturn;CBitmap bitmap;CDC pDC; CClientDC dc(this);pDC.CreateCompatibleDC(&dc); CSize size=this->GetTotalSize();if(size.cx%4!=0)size.cx+=4-size.cx%4;bitmap.CreateCompatibleBitmap(&dc, size.cx,size.cy);CBitmap* pOldBitmap = pDC.SelectObject(&bitmap);this->OnDraw(&pDC);//此时已保存为一个CBitmappDC.SelectObject(pOldBitmap);SaveBmp(bitmap,FileName);}BOOL SaveBmp(HBITMAP hBitmap, CString FileName) { //设备描述表 HDC hDC; //当前分辨率下每象素所占字节数 int iBits; //位图中每象素所占字节数 WORD wBitCount; //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数 DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0; //位图属性结构 BITMAP Bitmap; //位图文件头结构 BITMAPFILEHEADER bmfHdr; //位图信息头结构 BITMAPINFOHEADER bi; //指向位图信息头结构 LPBITMAPINFOHEADER lpbi; //定义文件,分配内存句柄,调色板句柄 HANDLE fh, hDib, hPal,hOldPal=NULL; //计算位图文件每个像素所占字节数 hDC = CreateDC("DISPLAY", NULL, NULL, NULL); iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES); DeleteDC(hDC); if (iBits <= 1) wBitCount = 1; else if (iBits <= 4) wBitCount = 4; else if (iBits <= 8) wBitCount = 8; else wBitCount = 24; 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.biClrImportant = 0; bi.biClrUsed = 0; dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight; //为位图内容分配内存 hDib = GlobalAlloc(GHND,dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER)); lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib); *lpbi = bi; // 处理调色板 hPal = GetStockObject(DEFAULT_PALETTE); if (hPal) { hDC = ::GetDC(NULL); hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE); RealizePalette(hDC); } // 获取该调色板下新的像素值 GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) +dwPaletteSize, (BITMAPINFO *)lpbi, DIB_RGB_COLORS); //恢复调色板 if (hOldPal) { ::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE); RealizePalette(hDC); ::ReleaseDC(NULL, hDC); } //创建位图文件 fh = CreateFile(FileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); if (fh == INVALID_HANDLE_VALUE) return FALSE; // 设置位图文件头 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; // 写入位图文件头 WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL); // 写入位图文件其余内容 WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL); //清除 GlobalUnlock(hDib); GlobalFree(hDib); CloseHandle(fh); return TRUE; } 楼上把你的代码改了一下.为什么显示一块黑色的块,不是图片.如能解决,双手捧上100分,决不食言!!! CBitmap bitmap;CDC pDC; CClientDC dc(this); RECT lpRect; GetClientRect(&lpRect); pDC.CreateCompatibleDC(&dc); int cx=lpRect.right-lpRect.left; int cy=lpRect.bottom-lpRect.top; if(cx%4!=0) cx+=4-cx%4;bitmap.CreateCompatibleBitmap(&dc, cx,cy); CDC* adc = CDC::FromHandle(::GetDC(0));// 桌面DCCBitmap* pOldBitmap = pDC.SelectObject(&bitmap);//this->OnDraw(&pDC);//此时已保存为一个CBitmap adc->BitBlt(0, 0, 600,100, &pDC, 0, 0, SRCCOPY);贴于桌面pDC.SelectObject(pOldBitmap); this->OnDraw(&pDC);//你如果把这句话屏蔽了,那pDC中的bitmap就是一幅没有任何像素的图片,全黑了//这句话可以把你这个程序中OnDraw函数绘制的图片绘制到pDC中的bitmap,这样你贴于桌面就不会全黑了 自己搞掂了..少了一个BitBlt();...结贴. 动态创建一个CBCGPGridCheckItem,怎样设置他的属性例如属性Flat 如何禁止菜单栏及工具栏的停靠。 股票作图软件, 有前途吗? 内网realplay 用udp协议,无法打开公网视频流服器rtsp直播路径 我是菜鸟请问个简单问题 如何让字体偏转90度 如何在缩放位图时避免图像失真(在线等) Tree控件问题?100分! 哪位高人告诉我windows的277是什么消息? 用什么函数可以得到一个从摄像头传来的帧 高分请教,联众在大厅中的座位及坐下,开始等,这是怎么实现的,我用SPI++看每个桌子也不是一个窗口? 宏的应用问题?
{CString FileName;
static char BASED_CODE sz_Filter[] = "位图文件 (*.bmp)|*.bmp||";
CFileDialog dlg(FALSE, "bmp", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, sz_Filter, NULL);
if(dlg.DoModal() == IDOK)
FileName=dlg.GetPathName();
else
return;
CBitmap bitmap;
CDC pDC;
CClientDC dc(this);pDC.CreateCompatibleDC(&dc);
CSize size=this->GetTotalSize();
if(size.cx%4!=0)
size.cx+=4-size.cx%4;
bitmap.CreateCompatibleBitmap(&dc, size.cx,size.cy);CBitmap* pOldBitmap = pDC.SelectObject(&bitmap);
this->OnDraw(&pDC);
//此时已保存为一个CBitmap
pDC.SelectObject(pOldBitmap);
SaveBmp(bitmap,FileName);
}
BOOL SaveBmp(HBITMAP hBitmap, CString FileName)
{
//设备描述表
HDC hDC;
//当前分辨率下每象素所占字节数
int iBits;
//位图中每象素所占字节数
WORD wBitCount;
//定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数
DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0;
//位图属性结构
BITMAP Bitmap;
//位图文件头结构
BITMAPFILEHEADER bmfHdr;
//位图信息头结构
BITMAPINFOHEADER bi;
//指向位图信息头结构
LPBITMAPINFOHEADER lpbi;
//定义文件,分配内存句柄,调色板句柄
HANDLE fh, hDib, hPal,hOldPal=NULL;
//计算位图文件每个像素所占字节数
hDC = CreateDC("DISPLAY", NULL, NULL, NULL);
iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
DeleteDC(hDC);
if (iBits <= 1) wBitCount = 1;
else if (iBits <= 4) wBitCount = 4;
else if (iBits <= 8) wBitCount = 8;
else wBitCount = 24;
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.biClrImportant = 0;
bi.biClrUsed = 0;
dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;
//为位图内容分配内存
hDib = GlobalAlloc(GHND,dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
*lpbi = bi;
// 处理调色板
hPal = GetStockObject(DEFAULT_PALETTE);
if (hPal)
{
hDC = ::GetDC(NULL);
hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);
RealizePalette(hDC);
}
// 获取该调色板下新的像素值
GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER)
+dwPaletteSize, (BITMAPINFO *)lpbi, DIB_RGB_COLORS);
//恢复调色板
if (hOldPal)
{
::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
RealizePalette(hDC);
::ReleaseDC(NULL, hDC);
}
//创建位图文件
fh = CreateFile(FileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (fh == INVALID_HANDLE_VALUE) return FALSE;
// 设置位图文件头
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;
// 写入位图文件头
WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
// 写入位图文件其余内容
WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);
//清除
GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(fh);
return TRUE;
}
CBitmap bitmap;
CDC pDC;
CClientDC dc(this);
RECT lpRect;
GetClientRect(&lpRect);
pDC.CreateCompatibleDC(&dc);
int cx=lpRect.right-lpRect.left;
int cy=lpRect.bottom-lpRect.top;
if(cx%4!=0)
cx+=4-cx%4;
bitmap.CreateCompatibleBitmap(&dc, cx,cy);
CDC* adc = CDC::FromHandle(::GetDC(0));// 桌面DCCBitmap* pOldBitmap = pDC.SelectObject(&bitmap);
//this->OnDraw(&pDC);
//此时已保存为一个CBitmap
adc->BitBlt(0, 0, 600,100, &pDC, 0, 0, SRCCOPY);贴于桌面
pDC.SelectObject(pOldBitmap);
//你如果把这句话屏蔽了,那pDC中的bitmap就是一幅没有任何像素的图片,全黑了
//这句话可以把你这个程序中OnDraw函数绘制的图片绘制到pDC中的bitmap,这样你贴于桌面就不会全黑了
...结贴.