MFC内存绘图设备封装类
来源:互联网 发布:三浦翔平人不好知乎 编辑:程序博客网 时间:2024/05/01 22:29
#ifndef MEMDC_H
#define MEMDC_H
class CMemoryDC :public CDC
{
CSize m_size;
public:
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);}CMemoryDC(){ m_size.cx = m_size.cy = 0;}//从资源中加载位图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;}CMemoryDC(UINT nBitmapID, CDC* pDC = NULL){ LoadBitmap(nBitmapID, pDC);}//从.bmp文件中加载位图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;}CMemoryDC(LPCTSTR szBitmapFile, CDC* pDC = NULL){ LoadBitmap(szBitmapFile, pDC);}//创建一张空白内存画布BOOL Create(int cx, int cy, CDC* pDC = NULL){ 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; SelectObject(bitmap); return TRUE;}CMemoryDC(int cx, int cy, CDC* pDC = NULL){ Create(cx, cy, pDC);}//摧毁BOOL DeleteDC(){ if (!GetSafeHdc()) return TRUE; CBitmap * pBitmap = GetCurrentBitmap(); pBitmap->DeleteObject(); return CDC::DeleteDC();}~CMemoryDC(){ DeleteDC();}inline int Width() { return m_size.cx; }inline int Height() { return m_size.cy; }void CMemoryDC::BitRgn(CRgn &rgn,/*目标区域*/COLORREF crTrans/*透明色*/){ //根据当前位图和透明色生成一个不规则区域 int i = 0, j = 0; rgn.CreateRectRgn(0, 0, 0, 0); while (i < m_size.cx) { j = 0; while (j < m_size.cy) { if (GetPixel(i, j) - crTrans) { //如果不是透明色就在区域内增加一个点 CRgn r; r.CreateRectRgn(i, j, i + 1, j + 1); rgn.CombineRgn(&rgn, &r, RGN_OR); } ++j; } ++i; }}
};
#endif //MEMDC_H
- MFC内存绘图设备封装类
- MFC-双缓冲绘图-CMemDC的封装
- MFC绘图控制-设备描述表
- [MFC]设备描述表属性、绘图模式
- MFC 绘图类
- MFC绘图类
- 内存设备绘图 BitBlt的使用
- c++/MFC 封装好的文件内存映射类
- VC/MFC 封装好的文件内存映射类
- 绘图设备
- MFC绘图
- MFC绘图
- MFC绘图
- MFC绘图
- mfc 绘图
- MFC绘图
- MFC 绘图
- MFC 绘图
- NYISTME 1300 递推求值
- poj-2773(数论+容斥原理+二分)
- Reader 和 Writer
- Linux设备驱动模型框架分析(五)——LDDM的展现:sysfs
- hdu 6127 计算几何模拟题(旋转扫描线)
- MFC内存绘图设备封装类
- Game of the Rows CodeForces
- 【yoyo】关于java中内部类的使用
- AngularJs学习之路(九)
- LeetCode200. Number of Islands 基础dfs
- MOOC清华《面向对象程序设计》第2章:函数参数的缺省值实验
- OpenCart 3.x版本简体中文语言包安装教程
- 怪盗基德的挑战书
- A water problem(大数取模)