WINAPI 拷贝指定的hDC的lpRect部分到文件Dstfile中(BMP文件格式)
2012-08-05 11:31
239 查看
#include <stdio.h> #include <tchar.h> //WINAPI 拷贝指定的hDC的lpRect部分到文件Dstfile中(BMP文件格式) BOOL SaveHDCToFile(HDC hDC, LPRECT lpRect, LPCTSTR Dstfile) { int Width = lpRect->right - lpRect->left; int Height = lpRect->bottom - lpRect->top; HDC memDC = CreateCompatibleDC(hDC);//内存DC HBITMAP memBitmap = CreateCompatibleBitmap(hDC, Width, Height); //建立和屏幕兼容的bitmap HBITMAP hOldBitmap = (HBITMAP)SelectObject(memDC, memBitmap);//将memBitmap选入内存DC BitBlt(memDC, 0, 0, Width, Height, hDC, lpRect->left, lpRect->top, SRCCOPY);//复制屏幕图像到内存DC //以下代码保存memDC中的位图到文件 BITMAP bmpInfo; GetObject(memBitmap, sizeof(bmpInfo), &bmpInfo);//获得位图信息 DWORD bmpBytesSize = bmpInfo.bmWidthBytes * bmpInfo.bmHeight; BITMAPFILEHEADER bfh = {0};//位图文件头 bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);//到位图数据的偏移量 bfh.bfSize = bfh.bfOffBits + bmpBytesSize ;//文件总的大小 bfh.bfType = (WORD)0x4d42; BITMAPINFOHEADER bih = {0};//位图信息头 bih.biBitCount = bmpInfo.bmBitsPixel;//每个像素字节大小 bih.biCompression = BI_RGB; bih.biHeight = bmpInfo.bmHeight;//高度 bih.biPlanes = 1; bih.biSize = sizeof(BITMAPINFOHEADER); bih.biSizeImage = bmpBytesSize;//图像数据大小 bih.biWidth = bmpInfo.bmWidth;//宽度 BYTE * p = new BYTE[bmpBytesSize];//申请内存保存位图数据 GetDIBits(memDC, memBitmap, 0, Height, p,(LPBITMAPINFO) &bih, DIB_RGB_COLORS);//获取位图数据 //正常的还要对256及以下的颜色加颜色映射表, // 但是现在的显示模式基本上都是真彩(24或32位)显示,因此忽略此项 //保存到文件 HANDLE hFile = CreateFile(Dstfile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); if(hFile != INVALID_HANDLE_VALUE) { DWORD dwBytesWritten; WriteFile(hFile, &bfh, sizeof(BITMAPFILEHEADER), &dwBytesWritten, NULL);//写入位图文件头 WriteFile(hFile, &bih, sizeof(BITMAPINFOHEADER), &dwBytesWritten, NULL);//写入位图信息头 WriteFile(hFile, p, bmpInfo.bmWidthBytes * bmpInfo.bmHeight, &dwBytesWritten, NULL);//写入位图数据 CloseHandle(hFile); } else { TCHAR szMsg[256]; _stprintf_s(szMsg, _T("CreateFile error=%lu"), GetLastError()); MessageBox(NULL, szMsg, _T("Error"), MB_OK); } //结束清理工作 delete [] p; SelectObject(memDC, hOldBitmap); DeleteObject(memBitmap); DeleteDC(memDC); return(true); }
//测试用例,按下任意键时保存成为位图 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_PAINT: //绘图代码 { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &ps); TextOut(hdc, 0, 0, _T("ABCD"), 4); EndPaint(hWnd, &ps); break; } case WM_KEYDOWN: //按下一个按键的时候保存成位图文件 { LPCTSTR szFileName = _T("C:\\test.bmp"); HDC hDC = GetDC(hWnd); RECT rcRect; GetClientRect(hWnd, &rcRect); SaveHDCToFile(hDC, &rcRect, szFileName); ReleaseDC(hWnd, hDC); //ShellExecute(NULL, _T("open"), szFileName, NULL, NULL, SW_SHOWNORMAL);//打开图片查看 break; } case WM_DESTROY: { PostQuitMessage(0); break; } default: { return DefWindowProc(hWnd, message, wParam, lParam); } } return 0; }
相关文章推荐
- 拷贝pWnd指向窗口的lpRect部分 写成BMP文件
- BMP文件格式详解(BMP file format)
- (转)BMP文件格式详解(BMP file format)[图文解说]
- 【转】BMP文件格式详解(BMP file format)
- BMP文件格式详解(BMP file format)
- BMP文件格式详解(BMP file format)
- BMP文件格式详解(BMP file format)
- (转)BMP文件格式详解(BMP file format)[图文解说]
- BMP文件格式详解(BMP file format)
- BMP文件格式详解(BMP file format)
- BMP文件格式详解(BMP file format)
- BMP文件格式详解(BMP file format)[图文解说]
- BMP文件格式详解(BMP file format)
- Jsoup学习笔记7之File类操作文件:复制只包含指定类型文件的文件夹,并在新创建的同名文件夹中创建同名的另一种格式的文件
- BMP文件格式详解(BMP file format)
- BMP文件格式详解(BMP file format)
- _winapi Createprocess FileNotFoundError: [WinError 2] 系统找不到指定的文件
- [转]BMP文件格式详解(BMP file format)
- BMP文件格式详解(BMP file format)
- BMP文件格式详解(BMP file format)