改写的CBitmap类,加入了保存显示功能,新加入载入图片功能
来源:互联网 发布:电脑学英语软件 编辑:程序博客网 时间:2024/05/19 02:45
// XMFCBMP.h: interface for the XMFCBMP class.////////////////////////////////////////////////////////////////////////#if !defined(AFX_XMFCBMP_H__329A4A70_251F_42DB_9B9A_1BB13646B3D4__INCLUDED_)#define AFX_XMFCBMP_H__329A4A70_251F_42DB_9B9A_1BB13646B3D4__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000class XMFCBMP : public CBitmap {public:void createFromHBITMAP(HBITMAP *hBMP);void createFromCBitmap(CBitmap *srcBMP);XMFCBMP();virtual ~XMFCBMP();void createBMP(int nWidth, int nHeight, UINT nPlanes, UINT nBitcount, const void* lpBits );bool loadBMP(const CString strBmpPat);CDC* getMemDC(){return &dcMem;}BOOL saveBMP(char* filePath);int getHeight();int getWidth();private:CDC dcMem;CBitmap *pOldBitmap ;};#endif // !defined(AFX_XMFCBMP_H__329A4A70_251F_42DB_9B9A_1BB13646B3D4__INCLUDED_)
/********************************************************************created:2014/04/02created:2:4:2014 10:36filename: F:\Projects\DrawInMem\XMFCBMP.cppfile path:F:\Projects\DrawInMemfile base:XMFCBMPfile ext:cppauthor:XinQpurpose:*********************************************************************/// XMFCBMP.cpp: implementation of the XMFCBMP class.////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "DrawInMem.h"#include "XMFCBMP.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////XMFCBMP::XMFCBMP(){dcMem.CreateCompatibleDC(NULL);//这里我们就在内存中虚拟建造了DC pOldBitmap = dcMem.SelectObject(this);}XMFCBMP::~XMFCBMP(){dcMem.SelectObject(pOldBitmap);dcMem.DeleteDC();//create出来的dc需要delete//get到的dc需要release}//************************************// Method: createBMP// FullName: XMFCBMP::createBMP// Access: public // Returns: void// Qualifier:// Parameter: int nWidth// Parameter: int nHeight// Parameter: UINT nPlanes// Parameter: UINT nBitcount// Parameter: const void * lpBits//************************************void XMFCBMP::createBMP(int nWidth, int nHeight, UINT nPlanes, UINT nBitcount, const void* lpBits ){DeleteObject(); CreateBitmap(nWidth, nHeight, nPlanes, nBitcount, lpBits);dcMem.SelectObject(this);}//************************************// Method: saveBMP// FullName: XMFCBMP::saveBMP// Access: public // Returns: BOOL// Qualifier:// Parameter: char * filePath//************************************BOOL XMFCBMP::saveBMP(char* filePath) { HBITMAP hBitmap;// 为刚才的屏幕位图句柄HDC hDC; //设备描述表 int iBits; //当前显示分辨率下每个像素所占字节数 WORD wBitCount; //位图中每个像素所占字节数DWORD dwPaletteSize = 0, //定义调色板大小dwBmBitsSize, //位图中像素字节大小 dwDIBSize, //位图文件大小dwWritten; //写入文件字节数BITMAP Bitmap; //位图属性结构 BITMAPFILEHEADER bmfHdr; //位图文件头结构 BITMAPINFOHEADER bi; //位图信息头结构 LPBITMAPINFOHEADER lpbi; //指向位图信息头结构 HANDLE fh, //定义文件hDib, //分配内存句柄hPal,//调色板句柄hOldPal = NULL;//计算位图文件每个像素所占字节数 hBitmap = (HBITMAP)*this; 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 if (iBits <= 32)wBitCount = 32;//计算调色板大小 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; 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,(LPBITMAPINFO)lpbi,DIB_RGB_COLORS); //恢复调色板if (hOldPal){ SelectPalette(hDC, (HPALETTE)hOldPal, TRUE); RealizePalette(hDC); ::ReleaseDC(NULL, hDC);} //创建位图文件fh = CreateFile(filePath, 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;} //************************************// Method: loadBMP// FullName: XMFCBMP::loadBMP// Access: public // Returns: bool// Qualifier:// Parameter: const CString strBmpPath//************************************bool XMFCBMP::loadBMP(const CString strBmpPath){HBITMAP bitmap;try{this->DeleteObject();//从文件路径加载图片bitmap =(HBITMAP)::LoadImage(NULL,strBmpPath, IMAGE_BITMAP, 0, 0,LR_CREATEDIBSECTION|LR_LOADFROMFILE|LR_DEFAULTSIZE);if(this->Attach(bitmap)){dcMem.SelectObject(this);return true;}}catch(...){return false;}return true;}int XMFCBMP::getHeight(){BITMAP bm;this->GetObject(sizeof(BITMAP),&bm); return bm.bmHeight;}int XMFCBMP::getWidth(){BITMAP bm;this->GetObject(sizeof(BITMAP),&bm); return bm.bmWidth;}//************************************// Method: createFromCBitmap// FullName: XMFCBMP::createFromCBitmap// Access: public // Returns: void// Qualifier:// Parameter: CBitmap * srcBMP//************************************void XMFCBMP::createFromCBitmap(CBitmap *srcBMP){BITMAP bm;srcBMP->GetBitmap(&bm);DeleteObject();CreateBitmapIndirect(&bm);//创建一样尺寸的CBitmapdcMem.SelectObject(this);//把内容拷贝进来CDC srcDC;CBitmap *pBitmap;srcDC.CreateCompatibleDC(&dcMem);pBitmap = srcDC.SelectObject(srcBMP);dcMem.BitBlt(0, 0, getWidth(), getHeight(), &srcDC, 0, 0, SRCCOPY);//删除srcdcsrcDC.SelectObject(pBitmap);DeleteDC(srcDC);}//************************************// Method: createFromHBITMAP// FullName: XMFCBMP::createFromHBITMAP// Access: public // Returns: void// Qualifier:// Parameter: HBITMAP * hBMP//************************************void XMFCBMP::createFromHBITMAP(HBITMAP *hBMP){CBitmap *pBmp = CBitmap::FromHandle(*hBMP);createFromCBitmap(pBmp);}
使用方法:
CDC *dlgDC = GetDC();//m_bmp.createBMP(200, 200, 1, 32, NULL);//创建BMP或载入bmpm_bmp.loadBMP("1.bmp");CDC *pDC = m_bmp.getMemDC();//绘图pDC->FillSolidRect(0,0,100,100,RGB(255,255,255));//这些时绘图操作,随便你^_^ char str[30];sprintf(str, "H%d*W%d", m_bmp.getHeight(), m_bmp.getWidth());pDC->TextOut(0, 0, str); pDC->Rectangle(20,20,40,40); pDC->FillSolidRect(40,40,50,50,RGB(255,0,0));//显示dlgDC->BitBlt(0,0,m_bmp.getWidth(),m_bmp.getHeight(),pDC,0,0,SRCCOPY);//第一次拷贝到屏幕 m_bmp.saveBMP("123.bmp");//保存到文件
0 0
- 改写的CBitmap类,加入了保存显示功能,新加入载入图片功能
- 需要加入的功能
- dedecms 加入栏目图片功能
- [Rubyist.cn]加入了“显示访客地理位置”功能
- 博客新加入“扫码阅读”功能
- 博客新加入“扫码阅读”功能
- Google最新版本的工具条加入了单词翻译功能
- Snooper taoism的辅助计算工具加入了ecc功能
- 我最喜欢的功能加入了--GPS地图
- updateprogress加入Cancel功能
- tomcat加入log功能
- UMEditor加入音乐功能
- excel 加入swich功能。
- CMake加入GDB功能
- hexo加入留言功能
- 新加入了CSDN
- 新加入了CSDN
- 给程序加入记日志的功能
- 【转】ACM 训练大纲
- 实例讲解Hadoop Map-Reduce过程
- 高效且可伸缩的结果缓存
- 二叉树入门(对称二叉树)
- (Java)微信之个人公众账号开发(二)——接收并处理用户消息(下)
- 改写的CBitmap类,加入了保存显示功能,新加入载入图片功能
- matlab中提取mat文件中的某行某列的值
- How to use FTP from the command line.
- Websocket协议数据帧传输和关闭连接
- python进阶一_简介,安装与环境部署
- 字符串水题
- linux笔记 cp rm mv
- iBatis与MyBatis了解
- POJ 2586&&CF 245E