毕设内容,碰到需要将单文档视图中view的显示内容存为bmp。找了很多资料都没有找到如何将CView中CDC转换为hDib的方法,请做过这方面内容的大虾帮帮忙,谢谢了!
解决方案 »
- win32如何绘制static控件消除白色背景刷
- 使用vc6.0建立的一个workspace,添加另一个工程后,怎么调试另一个工程的代码?
- 基于对话框的应用程序中控件自适应窗口的问题?
- 多网卡如何配置?
- 如何截取路径名字
- 请教DBGrid在显示Table内容的问题
- 学习好能找到好工作吗?
- 98ddk 中的视频卡驱动示例要VC5.0,有没变通的法子用6.0. vc5.0哪里有下载的?
- 谁能给我查看.pwl文件口令的原代码和查看编辑控件中的'**'的功能的原代码?
- 如何解密ACCESS数据库??回答正确绝对有分
- 请问有没有开发三维引擎的专门开发工具
- 我 要 用上下左右键,是不 是要在OnChar()中添加消息处理。
Just See link below:
http://www.codeproject.com/bitmap/jscdibdata.asp
// BOOL CDibData::SaveDIB(LPCTSTR lpszPathName,
// CBitmap* pbmpSrc = NULL, BOOL bCompress = FALSE)
/**
\par Return Value:
Nonzero on success; otherwise 0.\par
To get extended error information, call GetLastError. \par Parameters:
lpszPathName
[in] Pointer to a null-terminated string that specifies
the name of the file to create or open.
\par
pbmpSrc
[in] Points to the source bitmap to save.\par
bCompress
[in] A flag indicating whether the resulting DIB should
be compressed or not.\par Res:
If pbmpSrc is not NULL then it is saved to file, otherwise
the internally stored DIB is saved to file.\par
If bCompress is TRUE than the DIB is stored in compressed
format, provided that the compressed format is smaller than the
uncompressed format.\par
Note: bCompress only applies to 4 and 8 bits-per-pixel DIBs.
*/
BOOL CDibData::SaveDIB(LPCTSTR lpszPathName,
CBitmap* pbmpSrc/* = NULL*/, BOOL bCompress/* = FALSE*/)
HBITMAP GetSrcBit(HDC hDC,DWORD BitWidth, DWORD BitHeight)
{
HDC hBufDC;
HBITMAP hBitmap, hBitTemp; //创建设备上下文(HDC)
hBufDC = CreateCompatibleDC(hDC); //创建HBITMAP
hBitmap = CreateCompatibleBitmap(hDC, BitWidth, BitHeight);
hBitTemp = (HBITMAP) SelectObject(hBufDC, hBitmap);
//得到位图缓冲区
StretchBlt(hBufDC, 0, 0, BitWidth, BitHeight,
hDC, 0, 0, BitWidth, BitHeight, SRCCOPY); //得到最终的位图信息
hBitmap = (HBITMAP) SelectObject(hBufDC, hBitTemp); //释放内存 ::DeleteDC(hBufDC); return hBitmap;
}然后保存文件
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;
}