CMemoryDC封装类
来源:互联网 发布:仓廪实则知礼节 编辑:程序博客网 时间:2024/06/06 20:51
#ifndef __MEMDC_H__ #define __MEMDC_H__ //Author:www.baojy.com class CMemoryDC :public CDC { CSize m_size; public: //析构函数,释放加载的位图资源~CMemoryDC() { DeleteDC(); }CMemoryDC() { m_size.cx = m_size.cy = 0; } //在构造对象的同时,根据资源ID加载位图CMemoryDC(UINT nBitmapID,CDC* pDC=NULL) { LoadBitmap(nBitmapID,pDC); } //在构造对象的同时,从进程外,根据位图文件绝对路径名加载位图CMemoryDC(LPCTSTR szBitmapFile,CDC* pDC=NULL) { LoadBitmap(szBitmapFile,pDC); }//在构造对象的同时,创建一块空白画布CMemoryDC(int cx,int cy,CDC* pDC = NULL) { Create(cx,cy,pDC); } //根据资源ID加载位图 BOOL LoadBitmap(UINT nBitmapID,CDC* pDC=NULL) { CBitmap bitmap; bitmap.LoadBitmap(nBitmapID); BITMAP bm; bitmap.GetBitmap(&bm); m_size.cx = bm.bmWidth; m_size.cy = bm.bmHeight; CreateCompatibleDC(pDC); SelectObject(bitmap); return TRUE; } //从进程外,根据位图文件绝对路径名加载位图BOOL LoadBitmap(LPCTSTR szBitmapFile,CDC* pDC=NULL) { HBITMAP hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(), szBitmapFile,IMAGE_BITMAP,0,0,LR_LOADFROMFILE); BITMAP bm; GetObject(hBitmap,sizeof(bm),&bm); m_size.cx = bm.bmWidth; m_size.cy = bm.bmHeight; CreateCompatibleDC(pDC); SelectObject(hBitmap); return TRUE; } //绘制透明位图void BitTrans( int nXDest, // 目标起点X int nYDest, // 目标起点Y int nWidthDest, // 目标宽度 int nHeightDest,// 目标高度 CDC* pDC, // 目标DC int nXSrc, // 来源起点X int nYSrc, // 来源起点Y COLORREF crTrans// 透明色 ) { CMemoryDC dcImage(nWidthDest, nHeightDest,pDC);//临时DC CBitmap bmpMask; bmpMask.CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL); // 创建单色掩码位图 CDC dcMask;//掩码DC dcMask.CreateCompatibleDC(pDC); dcMask.SelectObject(bmpMask); //将载入位图的内存DC中的位图,拷贝到临时DC中 dcImage.BitBlt( 0, 0, nWidthDest, nHeightDest, this, nXSrc, nYSrc, SRCCOPY); // 设置临时DC的透明色 dcImage.SetBkColor(crTrans); //掩码DC的透明区域为白色其它区域为黑色 dcMask.BitBlt(0, 0, nWidthDest, nHeightDest, &dcImage, 0, 0, SRCCOPY); //临时DC透明区域为黑色,其它区域保持不变 dcImage.SetBkColor(RGB(0,0,0)); dcImage.SetTextColor(RGB(255,255,255)); dcImage.BitBlt( 0, 0, nWidthDest, nHeightDest, &dcMask, 0, 0, SRCAND); // 目标DC透明部分保持屏幕不变,其它部分变成黑色 pDC ->SetBkColor(RGB(255,255,255)); pDC ->SetTextColor(RGB(0,0,0)); pDC ->BitBlt(nXDest, nYDest, nWidthDest, nHeightDest, &dcMask, 0, 0, SRCAND); pDC ->BitBlt(nXDest, nYDest, nWidthDest, nHeightDest, &dcImage, 0, 0, SRCPAINT); } //绘制具有可拉伸的透明位图void StretchTrans( int nXDest, // 目标起点X int nYDest, // 目标起点Y int nWidthDest, // 目标宽度 int nHeightDest, // 目标高度 CDC* pDC, // 目标DC int nXSrc, // 来源起点X int nYSrc, // 来源起点Y int nWidthSrc, // 来源宽度 int nHeightSrc, // 来源高度 COLORREF crTrans // 透明色 ) { CMemoryDC dcImage(nWidthDest, nHeightDest,pDC);//临时DC CBitmap bmpMask; // 创建单色掩码位图 bmpMask.CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL); CDC dcMask; dcMask.CreateCompatibleDC(pDC); dcMask.SelectObject(bmpMask); // 将载入位图的内存DC中的位图,拷贝到临时DC中 if (nWidthDest == nWidthSrc && nHeightDest == nHeightSrc) dcImage.BitBlt(0, 0, nWidthDest, nHeightDest, this, nXSrc, nYSrc, SRCCOPY); else dcImage.StretchBlt(0, 0, nWidthDest, nHeightDest, this, nXSrc, nYSrc, nWidthSrc, nHeightSrc, SRCCOPY); // 设置临时DC的透明色 dcImage.SetBkColor( crTrans); //掩码DC的透明区域为白色其它区域为黑色 dcMask.BitBlt(0,0,nWidthDest, nHeightDest,&dcImage,0,0,SRCCOPY); //临时DC透明区域为黑色,其它区域保持不变 dcImage.SetBkColor(RGB(0,0,0)); dcImage.SetTextColor(RGB(255,255,255)); dcImage.BitBlt(0, 0, nWidthDest, nHeightDest, &dcMask, 0, 0, SRCAND); // 目标DC透明部分保持屏幕不变,其它部分变成黑色 pDC ->SetBkColor(RGB(255,255,255)); pDC ->SetTextColor(RGB(0,0,0)); pDC ->BitBlt(nXDest, nYDest, nWidthDest, nHeightDest, &dcMask, 0, 0, SRCAND); pDC ->BitBlt(nXDest, nYDest, nWidthDest, nHeightDest, &dcImage, 0, 0, SRCPAINT); } //创建一张空白内存画布 BOOL Create(int cx,int cy,CDC* pDC = NULL) { this->CreateCompatibleDC(pDC); CBitmap bitmap; if(pDC) bitmap.CreateCompatibleBitmap(pDC,cx,cy); else bitmap.CreateCompatibleBitmap(&CClientDC(NULL),cx,cy); m_size.cx = cx; m_size.cy = cy; this->SelectObject(bitmap); return TRUE; } //摧毁 BOOL DeleteDC() { if(!GetSafeHdc()) return TRUE; CBitmap * pBitmap = GetCurrentBitmap(); pBitmap ->DeleteObject(); return CDC::DeleteDC(); } //根据当前DC中的位图和透明色,去掉透明色,生成一个除透明色外不规则的区域void GenerateRgn(CRgn &DesRgn,COLORREF clTrans){DesRgn.CreateRectRgn(0,0,0,0);int i(0),j(0);while (i < m_size.cx){j = 0;while (j < m_size.cy){if (GetPixel(i,j) - clTrans){CRgn rgTemp;rgTemp.CreateRectRgn(i,j,i+1,j+1);DesRgn.CombineRgn(&DesRgn,&rgTemp,RGN_OR);}j++;}i++;}} inline int Width(){return m_size.cx;} inline int Height(){return m_size.cy;} }; #endif //__MEMDC_H__
阅读全文
0 0
- CMemoryDC封装类
- CPaintDC CClientDC CWindowDC CMemoryDC wtl中关于hdc的封装事实。摘录如下:
- 封装类
- 封装类
- 封装类
- 封装类
- 类、封装
- 类封装
- 类 封装
- 类 封装
- 封装类
- 封装类
- 封装类
- 强大的封装标签封装类
- 什么是封装,封装类的使用!
- java的封装(如何封装类)
- 工具类的封装--Log封装
- 工具类的封装--SharedPreferences封装
- 技术团队的情绪与效率
- grub rescue恢复
- 每日一练(20171031)
- 2017CCPC秦皇岛站总结
- 报名 | IBM苏中:从深蓝到AlphaGo,从大数据到认知商业
- CMemoryDC封装类
- Vue 2.0 真实点餐项目实战
- 拓展欧几里得
- BZOJ 2143 飞飞侠 (最短路变形)
- 一些很好的技术资源链接
- 「用户故事」竟然还可以这样写!?
- 【第1096期】组件化设计思维 – 从规范到工具的构建与探索
- 嵌入式Linux下ALSA音频架构ALSA-lib移植与编译心得
- 图片