如题,代码如下:
HDC hBufDC,hDC;
HBITMAP hBitmap,hBitTemp;
//CClientDC dc(this); hDC = CreateCompatibleDC(m_WriteDlg.m_dc.m_hDC);
//创建设备上下文(HDC)
hBufDC = CreateCompatibleDC(NULL); //创建HBITMAP
hBitmap = CreateCompatibleBitmap(hDC,800,330);//CDC::FromHandle(::GetDC(NULL)),800,600
hBitTemp = (HBITMAP)SelectObject(hBufDC,hBitmap); ::BitBlt(hBufDC,0,0,800,330,hDC,0,0,SRCCOPY); //得到最终的位图信息
hBitmap = (HBITMAP)SelectObject(hBufDC,hBitTemp);
SelectObject(hBufDC,hBitmap); SaveBMP(hBitmap,"D:\\KLW.bmp",hDC);
//释放内存
DeleteObject(hBitTemp);
::DeleteDC(hBufDC);
SaveBMP(HBITMAP hBitmap,LPCTSTR lpFileName,HDC hWndDC)
{
/**/HDC hDC;//设备描述表
CDC dc;
int iBits;//当前显示分辨率下每个像素所占字节数
WORD wBitCount;//位图中每个像素所占字节数
DWORD dwPaletteSize = 0,dwBmBitSize,dwDIBSize,dwWritten;
//定义调色板大小,为图中像素字节大小,位图文件大小,写入文件字节数
BITMAP Bitmap;//位图属性结构
BITMAPFILEHEADER bmfHdr;//位图信息头结构
BITMAPINFOHEADER bi;//位图信息头结构
LPBITMAPINFOHEADER lpbi;//指向位图信息头结构 HANDLE fh,hDib,hPal,hOldPal = NULL;//定义文件,分配内存句柄,调色板句柄 //计算位图文件每个像素所占字节数
//hDC = ::CreateCompatibleDC(hWndDC);
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 if(iBits <=24)
wBitCount = 24;
else
wBitCount = 24; //计算调色板大小
if(wBitCount <= 8)
dwPaletteSize = (1 << wBitCount)*sizeof(RGBQUAD); //设置位图信息头结构
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; dwBmBitSize = ((Bitmap.bmWidth * wBitCount + 31)/32)* 4 * Bitmap.bmHeight; //为位图内容分配内存
hDib = GlobalAlloc(GHND,dwBmBitSize + 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,(LPBITMAPINFO)lpbi,DIB_RGB_COLORS);
//恢复调色板
if(hOldPal)
{
SelectPalette(hDC,(HPALETTE)hOldPal,TRUE);
RealizePalette(hDC);
::ReleaseDC(NULL,hDC);
} fh = CreateFile(lpFileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,NULL); if(fh==INVALID_HANDLE_VALUE)
return FALSE; //设置位图文件头
bmfHdr.bfType=0x4D42;
dwDIBSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwPaletteSize+
dwBmBitSize;
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;
}
HDC hBufDC,hDC;
HBITMAP hBitmap,hBitTemp;
//CClientDC dc(this); hDC = CreateCompatibleDC(m_WriteDlg.m_dc.m_hDC);
//创建设备上下文(HDC)
hBufDC = CreateCompatibleDC(NULL); //创建HBITMAP
hBitmap = CreateCompatibleBitmap(hDC,800,330);//CDC::FromHandle(::GetDC(NULL)),800,600
hBitTemp = (HBITMAP)SelectObject(hBufDC,hBitmap); ::BitBlt(hBufDC,0,0,800,330,hDC,0,0,SRCCOPY); //得到最终的位图信息
hBitmap = (HBITMAP)SelectObject(hBufDC,hBitTemp);
SelectObject(hBufDC,hBitmap); SaveBMP(hBitmap,"D:\\KLW.bmp",hDC);
//释放内存
DeleteObject(hBitTemp);
::DeleteDC(hBufDC);
SaveBMP(HBITMAP hBitmap,LPCTSTR lpFileName,HDC hWndDC)
{
/**/HDC hDC;//设备描述表
CDC dc;
int iBits;//当前显示分辨率下每个像素所占字节数
WORD wBitCount;//位图中每个像素所占字节数
DWORD dwPaletteSize = 0,dwBmBitSize,dwDIBSize,dwWritten;
//定义调色板大小,为图中像素字节大小,位图文件大小,写入文件字节数
BITMAP Bitmap;//位图属性结构
BITMAPFILEHEADER bmfHdr;//位图信息头结构
BITMAPINFOHEADER bi;//位图信息头结构
LPBITMAPINFOHEADER lpbi;//指向位图信息头结构 HANDLE fh,hDib,hPal,hOldPal = NULL;//定义文件,分配内存句柄,调色板句柄 //计算位图文件每个像素所占字节数
//hDC = ::CreateCompatibleDC(hWndDC);
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 if(iBits <=24)
wBitCount = 24;
else
wBitCount = 24; //计算调色板大小
if(wBitCount <= 8)
dwPaletteSize = (1 << wBitCount)*sizeof(RGBQUAD); //设置位图信息头结构
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; dwBmBitSize = ((Bitmap.bmWidth * wBitCount + 31)/32)* 4 * Bitmap.bmHeight; //为位图内容分配内存
hDib = GlobalAlloc(GHND,dwBmBitSize + 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,(LPBITMAPINFO)lpbi,DIB_RGB_COLORS);
//恢复调色板
if(hOldPal)
{
SelectPalette(hDC,(HPALETTE)hOldPal,TRUE);
RealizePalette(hDC);
::ReleaseDC(NULL,hDC);
} fh = CreateFile(lpFileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,NULL); if(fh==INVALID_HANDLE_VALUE)
return FALSE; //设置位图文件头
bmfHdr.bfType=0x4D42;
dwDIBSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwPaletteSize+
dwBmBitSize;
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;
}
解决方案 »
- 通过spy++怎样获取工具条内的按钮句柄?
- VS2005中如何把char*指针指向的内容赋给CString对象?
- 找不到winmm.lib(在线等解答)
- 我在看王艳平编著的《windows程序设计》(人民邮电出版社出的那本书)时遇到一个关于模块句柄的问题,请指教
- GlobalLock的返回值
- 五一不能到处玩玩,郁闷ing
- 关于时间日期的简单操作(急用)
- 如何用API写一个Hello World?晕。。。
- 在线等待 ! 在多文档的 CMainFrame::中那个位置 可以获得 CCreateContext* pContext 不为空
- 这个三维坐标用GDI+/GDI可以绘制吗? 怎么绘制呢? 如图
- 图像处理的分割问题
- 出薪 求做一个MFC程序 有意者进
bitmap1.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());
bitmap2.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());
CDC* p_richDC = this->GetWindowDC();
tempDC.CreateCompatibleDC(p_richDC);
tempDC2.CreateCompatibleDC(p_richDC);
CBitmap *oldBitmap1,*oldBitmap2;
oldBitmap1 = tempDC.SelectObject(&bitmap1);
oldBitmap2 = tempDC2.SelectObject(&bitmap2);
tempDC2.FillSolidRect(0,0,new_rc.Width(),new_rc.Height(),RGB(255,0,0));//画一块红色的画布
tempDC.BitBlt(0,0,rc.Width(),rc.Height(),&tempDC2,0,0,SRCCOPY);
tempDC.SelectObject(oldBitmap1);
tempDC2.SelectObject(oldBitmap2); ....//这里写你保存位图的操作,位图是bitmap1 tempDC.DeleteDC();
tempDC2.DeleteDC();
ReleaseDC(pDC);
ReleaseDC(p_richDC);
bitmap1.DeleteObject();
bitmap2.DeleteObject();
oldBitmap1 = NULL;
oldBitmap2 = NULL;