我的工程是单文档的,在视图上有幅图像,如何才能保存为Bitmap格式的?
试了好多次就是不成...
试了好多次就是不成...
解决方案 »
- vc sql2000 连接数据库失败! Unknown error 0x800A0CC1
- 谁了解硬盘的各种术语和物理结构
- vc窗口文本编辑,光标用位图的形式怎么显示不出来,帮忙看看。
- Tab控件中标签页的缩放
- 项目路径问题
- RegDBSetKeyValueEx设置REGDB_BINARY值的问题,急!............100分
- 高分求C++,VC低层的知识!
- 菜鸟问题:如何把写好的程序编制成 .dll 文件。(大送分了:100)
- 诚求“bp神经网络整定pid参数的matlab程序”
- VC Win32 下, 程序窗口如何自绘?
- 100分的题...
- 调试错误Unhandled exception in***.exe
BOOL SaveBmp(HBITMAP hBitmap, CString FileName)
{
021 //设备描述表
022 HDC hDC;
023 //当前分辨率下每象素所占字节数
024 int iBits;
025 //位图中每象素所占字节数
026 WORD wBitCount;
027 //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数
028 DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0;
029 //位图属性结构
030 BITMAP Bitmap;
031 //位图文件头结构
032 BITMAPFILEHEADER bmfHdr;
033 //位图信息头结构
034 BITMAPINFOHEADER bi;
035 //指向位图信息头结构
036 LPBITMAPINFOHEADER lpbi;
037 //定义文件,分配内存句柄,调色板句柄
038 HANDLE fh, hDib, hPal,hOldPal=NULL;
039 //计算位图文件每个像素所占字节数
040 hDC = CreateDC("DISPLAY", NULL, NULL, NULL);
041 iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
042 DeleteDC(hDC);
043 if (iBits <= 1) wBitCount = 1;
044 else if (iBits <= 4) wBitCount = 4;
045 else if (iBits <= 8) wBitCount = 8;
046 else wBitCount = 24;
047 GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap);
048 bi.biSize = sizeof(BITMAPINFOHEADER);
049 bi.biWidth = Bitmap.bmWidth;
050 bi.biHeight = Bitmap.bmHeight;
051 bi.biPlanes = 1;
052 bi.biBitCount = wBitCount;
053 bi.biCompression = BI_RGB;
054 bi.biSizeImage = 0;
055 bi.biXPelsPerMeter = 0;
056 bi.biYPelsPerMeter = 0;
057 bi.biClrImportant = 0;
058 bi.biClrUsed = 0;
059 dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;
060 //为位图内容分配内存
061 hDib = GlobalAlloc(GHND,dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));
062 lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
063 *lpbi = bi;
064 // 处理调色板
065 hPal = GetStockObject(DEFAULT_PALETTE);
066 if (hPal)
067 {
068 hDC = ::GetDC(NULL);
069 hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);
070 RealizePalette(hDC);
071 }
072 // 获取该调色板下新的像素值
073 GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER)
074 +dwPaletteSize, (BITMAPINFO *)lpbi, DIB_RGB_COLORS);
075 //恢复调色板
076 if (hOldPal)
077 {
078 ::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
079 RealizePalette(hDC);
080 ::ReleaseDC(NULL, hDC);
081 }
082 //创建位图文件
083 fh = CreateFile(FileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS,
084 FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
085 if (fh == INVALID_HANDLE_VALUE) return FALSE;
086 // 设置位图文件头
087 bmfHdr.bfType = 0x4D42; // "BM"
088 dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;
089 bmfHdr.bfSize = dwDIBSize;
090 bmfHdr.bfReserved1 = 0;
091 bmfHdr.bfReserved2 = 0;
092 bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;
093
094 // 写入位图文件头
095 WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
096 // 写入位图文件其余内容
097 // WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL); //清除
098 GlobalUnlock(hDib);
099 GlobalFree(hDib);
100 CloseHandle(fh);
101 return TRUE;
102 }
CDIB *pSRC;
pDC=pSRC->BeginPaint(NULL);
..........
pSRC->EndPaint();
pSRC->Save("c:/a.bmp");
HBITMAP 参数如何设定才可以保证是当前视图的内容?
//
CClientDC dc(this);
hdc = dc.m_hDC;
hdcMem = CreateCompatibleDC(hdc);
hBitMap = CreateDIBSection(hdcMem,lpbmih,DIB_PAL_COLORS,(void **)&pBits,NULL,0);
SaveBmp02( hBitMap, _T("E:\\RRR.bmp") );
return;但是不行,只有一个BMP文件生成了,没有图像
//-------------------------------------------------------------
// Function : GetWindowBitmap
// Description : Copy a block bitmap from the window
// or screen Specifies location
// Paratmeters :
//-------------------------------------------------------------
HBITMAP GetWindowBitmap(HWND hwnd, LPRECT lpRect)
{
if( !lpRect )
return NULL; HDC hDC;
HDC hMemDC;
HBITMAP hBitmap = NULL;
HBITMAP hOldBitmap;
// Get window or screen DC
if( hwnd == NULL )
hDC = GetDC(HWND_DESKTOP);
else
hDC = GetWindowDC(hwnd); if( hDC == NULL )
return NULL; hMemDC = CreateCompatibleDC(hDC);
hBitmap = CreateCompatibleBitmap(hDC, lpRect->right - lpRect->left, lpRect->bottom - lpRect->top);
if( hBitmap == NULL)
return NULL; hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
BitBlt(hMemDC, 0, 0, lpRect->right - lpRect->left, lpRect->bottom - lpRect->top, hDC, lpRect->left, lpRect->top, SRCCOPY);
SelectObject(hMemDC, hOldBitmap);
DeleteDC(hMemDC);
ReleaseDC(hwnd, hDC); return hBitmap;
}