【MFC系列-第23天】CMemoryDC的封装过程

CDC(HDC)绘图类:
五大GDI对象类:CPen,CBrush,CFont,CBitmap,CRgn

23.1 LoadImage API

HANDLE LoadImage(HINSTANCE hinst,LPCTSTR lpszName, UINT uType, int cxDesired,int cyDesired,UINT fuLoad 
);

uType参数填写以下三种:

IMAGE_BITMAP Loads a bitmap.IMAGE_CURSOR Loads a cursor.IMAGE_ICON Loads an icon

从HINSTANCE内部加载

void CTestImageDlg::OnBnClickedButton1()
{static HICON hIcon = (HICON)::LoadImage(theApp.m_hInstance, (LPCTSTR)IDI_TEST, IMAGE_ICON, 0, 0, LR_DEFAULTCOLOR);SetIcon(hIcon, TRUE);SetIcon(hIcon, FALSE);//*.cur
}m_hBitmap = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP1),IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);m_hBitmap = ::LoadBitmap(theApp.m_hInstance, MAKEINTRESOURCE(IDB_BITMAP1));

从文件中直接加载

m_hBitmap =  (HBITMAP)::LoadImage(NULL, _T("./ban.bmp"),IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE);HICON hIcon = (HICON)::LoadImage(NULL, _T("DfIcon.ico"),IMAGE_BITMAP, 0, 0,  LR_LOADFROMFILE| LR_DEFAULTSIZE);SetIcon(hIcon, TRUE);SetIcon(hIcon, FALSE);

显示

//CDC mdc;
//BITMAP bm;
//::GetObject(m_hBitmap, sizeof(bm), &bm);
//mdc.CreateCompatibleDC(&dc);
//mdc.SelectObject(m_hBitmap);
dc.BitBlt(10, 40, m_mdc.GetWidth(), mdc.GetHeight(), &m_mdc, 0, 0, SRCCOPY);

23.2 解决闪烁问题:

1、禁用非客户区输出,让非客户区WM_NCPAINT产生空输出。
2、禁用客户区背景输出:WM_ERASEBKGRAND消息是Invalidate(TRUE)要调用的背景输出。
3、调用Invalidate函数时,尽量使用FALSE
4、当有多层次输出时,使用双缓冲技术,在内存中做好多次输出的草稿。

23.3 CMemoryDC类

#ifndef __MEMDC_H__
#define __MEMDC_H__
//Author:www.baojy.comclass CMemoryDC :public CDC
{CSize m_size;
public:void BitTrans(int nXDest,		// 目标起点Xint nYDest,		// 目标起点Yint nWidthDest,	// 目标宽度int nHeightDest,// 目标高度CDC* pDC,		// 目标DCint nXSrc,		// 来源起点Xint nYSrc,		// 来源起点YCOLORREF crTrans// 透明色){CMemoryDC dcImage(nWidthDest, nHeightDest,pDC);//临时DCCBitmap 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,			// 目标起点Xint nYDest,			// 目标起点Yint nWidthDest,     // 目标宽度int nHeightDest,    // 目标高度CDC* pDC,			// 目标DCint nXSrc,			// 来源起点Xint nYSrc,			// 来源起点Yint nWidthSrc,		// 来源宽度int nHeightSrc,		// 来源高度COLORREF crTrans	// 透明色){CMemoryDC dcImage(nWidthDest, nHeightDest,pDC);//临时DCCBitmap 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);elsedcImage.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);elsebitmap.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;}
};
#endif //__MEMDC_H__

23.4 采用CMemoryDC类实现图片旋转

//1、加载资源位图
//2、加载外部位图
//3、创建空白位图(黑色:指定高宽)
//4、显示透明和伸缩透明图片
CMemoryDC m_dcBack; // 定义全局变量
m_dcBack.LoadBitmap(IDB_BITMAP1); // 初始化void CPageDlg::OnPaint()
{CPaintDC dc(this); // 用于绘制的设备上下文CRect rect;GetClientRect(rect);CMemoryDC mdc(rect.Width(), rect.Height(),&dc);//缓冲DC:黑色mdc.FillSolidRect(rect, GetSysColor(COLOR_3DFACE)); // 缓冲DC:灰色mdc.StretchBlt(m_nLeft, 0, rect.Width() - m_nLeft * 2, rect.Height(),&m_dcBack, 0, 0, rect.Width(), rect.Height(), SRCCOPY); // 绘图输出到缓冲DC中dc.BitBlt(0, 0, rect.Width(),rect.Height(), &mdc, 0, 0, SRCCOPY);//一次性对界面(dc)输出
}

23.5 采用CMemoryDC类实现蝴蝶动画

#include "MemoryDC.h"
#pragma once// CfsDlg 对话框
class CfsDlg : public CDialogEx
{CMemoryDC m_dc;//缓冲enum { PAGE_COUNT =7};CMemoryDC m_dcBack;CMemoryDC m_dcFly[PAGE_COUNT];struct SData{CPoint pos;CPoint dir;//5,5    -5,5       5,-5    -5,-5int nIndex;};CArray<SData> m_arr;//动态数组
public:CfsDlg(CWnd* pParent = NULL);	// 标准构造函数
protected:HICON m_hIcon;virtual BOOL OnInitDialog();afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()
public:afx_msg BOOL OnEraseBkgnd(CDC* pDC);afx_msg void OnNcPaint();afx_msg void OnLButtonDown(UINT nFlags, CPoint point);afx_msg void OnTimer(UINT_PTR nIDEvent);
};BOOL CfsDlg::OnInitDialog()
{CDialogEx::OnInitDialog();srand(time(NULL));m_dcBack.LoadBitmap(_T("./images/back.bmp"));int cx = GetSystemMetrics(SM_CXSCREEN);int cy = GetSystemMetrics(SM_CYSCREEN);SetWindowPos(NULL, 0, 0, cx, cy, 0);m_dc.Create(cx, cy);int i = -1;CString str;while (++i<_countof(m_dcFly)){str.Format(_T("./images/%03d.bmp"), i + 1);m_dcFly[i].LoadBitmap(str);}SetTimer(1, 20, NULL);SetIcon(m_hIcon, TRUE);			// 设置大图标SetIcon(m_hIcon, FALSE);		// 设置小图标return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}void CfsDlg::OnPaint()
{CPaintDC dc(this); //界面dcCRect rect;GetClientRect(rect);//dc.BitBlt(0, 0, m_dcBack.GetWidth(), m_dcBack.GetHeight(), &m_dcBack, 0, 0, SRCCOPY);m_dc.StretchBlt(0, 0, rect.Width(), rect.Height(), &m_dcBack, 0, 0, m_dcBack.GetWidth(), m_dcBack.GetHeight(), SRCCOPY);int i = 0,nSize = m_arr.GetSize();while (i < nSize){SData& d = m_arr[i];m_dcFly[d.nIndex].BitTrans(d.pos.x,d.pos.y ,m_dcFly->GetWidth(),m_dcFly->GetHeight(),&m_dc,0,0,0);if (++d.nIndex > 6)d.nIndex = 0;d.pos.Offset(d.dir);GetClientRect(rect);if (d.pos.x >= rect.right - m_dcFly->GetWidth() || d.pos.x <= 0)d.dir.x *= -1;if (d.pos.y >= rect.bottom - m_dcFly->GetHeight() || d.pos.y <= 0)d.dir.y *= -1;	++i;}dc.BitBlt(0, 0, rect.Width(), rect.Height(), &m_dc, 0, 0, SRCCOPY);
}BOOL CfsDlg::OnEraseBkgnd(CDC* pDC)
{return TRUE;
}void CfsDlg::OnNcPaint()
{}void CfsDlg::OnLButtonDown(UINT nFlags, CPoint point)
{//无限增长的蝴蝶个数SData data = { point,{5,5},0 };if(rand()%2) //893253%2 data.dir.x *= -1;if (rand() % 2) //547547%2 data.dir.y *= -1;m_arr.Add(data);CDialogEx::OnLButtonDown(nFlags, point);
}void CfsDlg::OnTimer(UINT_PTR nIDEvent)
{Invalidate(FALSE);CDialogEx::OnTimer(nIDEvent);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346969.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JDK 8与JDK 10:三元/拆箱的区别

最近的Nicolai Parlog &#xff08; nipafx &#xff09; 鸣叫引起了我的注意&#xff0c;因为它引用了关于JDK 8和JDK 10之间行为更改的有趣StackOverflow讨论 &#xff0c;并询问“为什么&#xff1f;” SerCe 在StackOverflow线程上引用的问题最终归结为在JDK 8和JDK 10之间…

【多元域乘法】多项式乘法电路原理及MATLAB详解

关注公号【逆向通信猿】更精彩!!! 关于二元域上的两个元素的乘法、多项式除法,在之前的博客 【有限域除法】二元多项式除法电路原理及MATLAB详解 子程序:sub_poly_div.m 【有限域元素加法和乘法】有限域元素加法和乘法的原理及MATLAB实现 子程序:sub_gf_add.m、sub_gf_…

my CSAPP Attack lab堆栈详解

关注公号【逆向通信猿】更精彩!!! 这个实验时学习了简书上的一篇文章后,自己根据课程例子进行的一次小测试,phase 4和5的堆栈图解还没有画,等后续有时间会进行补充。 本人转载的简书原文: https://blog.csdn.net/wlwdecs_dn/article/details/121249364#comments_19237…

Spring MVC教程

1.简介 作为企业Java开发人员&#xff0c;这项工作的主要重点之一是开发Web应用程序。 对于Web应用程序&#xff0c;后果还包括许多挑战。 具体来说&#xff0c;其中一些是状态管理&#xff0c;工作流和验证。 HTTP协议的无状态性质只会使事情变得更加复杂。 Spring的Web框架旨…

【MFC系列-第24天】梯形分页和蝴蝶QQ宠物的实现

CDC(HDC)绘图类&#xff1a; 五大GDI对象类&#xff1a;CPen&#xff0c;CBrush&#xff0c;CFont&#xff0c;CBitmap&#xff0c;CRgn 24.1 梯形分页的双缓冲改进和尺寸自适应 24.2 蝴蝶跟随鼠标点击运动 class CHitFlyDlg : public CDialogEx {CMemoryDC m_dc;//缓冲enu…

ubuntu22.04 下载路径

ftp下载路径 csdn下载 ubuntu22.04下载路径ubuntu-22.04-desktop-amd64.7z.001资源-CSDN文库 ubuntu22.04下载路径ubuntu-22.04-desktop-amd64.7z.002资源-CSDN文库 【免费】ubuntu-22.04-desktop-amd64.7z.003资源-CSDN文库 【免费】ubuntu-22.04-desktop-amd64.7z.004资源-…

camel seda 协议_探索Apache Camel Core – Seda组件

camel seda 协议Apache Camel中的seda组件与我在先前的博客中介绍的direct组件非常相似&#xff0c;但是以异步的方式。 为此&#xff0c;它使用java.util.concurrent.BlockingQueue作为默认实现来使消息排队并与主Route线程断开连接&#xff0c;然后在单独的线程中处理消息。 …

【MFC系列-第25、26天】绘图软件

25.1 绘图软件的绘制原理 纯虚函数&#xff1a;抽象函数&#xff0c;强制在派生类中进行实现&#xff1b; 虚函数&#xff1a;有函数体&#xff0c;可在基类也可在派生类中实现。 基类CLayer class CLayer {//抽象类 public:CLayer();~CLayer();virtual void OnDraw(CDC* pDC…

Java 10:“ var”关键字

Java 10使用关键字var引入了局部变量类型推断 。 这意味着无需编写&#xff1a; Map<Department, List<Employee>> map new HashMap<>(); // ... for (Entry<Department, List<Employee>> dept : map.entrySet()) {List<Employee> emplo…

【MFC系列-第32天】控件自绘技术

32.1 对话框背景设置 方法一 BOOL CClDlg::OnEraseBkgnd(CDC* pDC) {CRect rect;GetClientRect(rect);pDC->FillSolidRect(rect, RGB(200, 255, 255));return TRUE; }方法二&#xff1a;WM_CTRLCOLOR消息 按类型按句柄按控件ID HBRUSH CMFCApplication1Dlg::OnCtlColor(…

Spring Reactor教程

在RESTful服务的世界中&#xff0c;实际上实际上是在幕后进行许多工作&#xff0c;我们通常必须在应用程序中进行很多处理&#xff0c;而实际上并不会影响需要发送给真实用户的响应。 可以被动地做出这些业务决策&#xff0c;以便它们对与应用程序交互的用户没有任何影响。 Spr…

MFC多线程处理界面假死之红外图像数据获取和excel写入

在MFC主界面某个Button Click事件中起一个线程去做处理一些事情,在起的线程运行完毕后,接着跑Click起线程后的代码,已达到按顺序执行,保证时许正确的目的。 问题 通常处理一个线程等待用 WaitForSingleObject,这个放在主界面线程成中会造成主界面“卡死”,其原因是它将…

api签名_使用签名保护基于HTTP的API

api签名我在EMC上的一个平台上可以构建SaaS解决方案。 与越来越多的其他应用程序一样&#xff0c;该平台具有基于RESTful HTTP的API。 使用JAX-RS之类的开发框架&#xff0c;构建这样的API相对容易。 但是&#xff0c; 正确构建它们并不容易。 建立基于HTTP的API的问题 问…

【多元域除法】多项式除法电路原理及MATLAB详解

关注公号【逆向通信猿】更精彩!!! 关于二元域上的两个元素的加法和乘法、多项式除法,在之前的博客 【有限域除法】二元多项式除法电路原理及MATLAB详解 子程序:sub_poly_div.m 【有限域元素加法和乘法】有限域元素加法和乘法的原理及MATLAB实现 子程序:sub_gf_add.m、s…

用Rocker制作模板

在本文中&#xff0c;我们将快速介绍Rocker &#xff0c;这是一个静态类型化的快速Java 8模板引擎。 必需的依赖项 要开始使用Rocker&#xff0c;我们需要在项目中添加以下依赖项&#xff1a; <dependency><groupId>com.fizzed</groupId><artifactId>…

win10高分辨率下修改字体显示大小(不是缩放百分比)

问题 不通过修改设置缩放百分比来增大win10的字体显示大小&#xff0c;缩放百分比调大后会导致很多问题出现&#xff01;&#xff01;&#xff01; 修改 打开设置&#xff0c;或者右键个性化&#xff0c;在搜索栏输入&#xff1a;“放大文本大小”&#xff0c;搜索框下面会自…

【MFC系列-第33天】链接控件自绘技术

33.1 常用的字体复制 方法一 CFont* pFont pDC->GetCurrentFont(); LOGFONT lf; pFont->GetLogFont(&lf); m_fontN.CreateFontIndirect(&lf); lf.lfUnderline TRUE; m_fontT.CreateFontIndirect(&lf);方法二 HFONT hFont (HFONT)GetStockObject(DEFAUL…

guava读取配置文件_使用Guava MapSplitters配置Hadoop

guava读取配置文件在本文中&#xff0c;我们将为通过Context对象将配置参数传递给Hadoop Mapper提供新的思路。 通常&#xff0c;我们在启动map-reduce作业时将配置参数设置为Context对象上的键/值对。 然后在Mapper中&#xff0c;我们使用键来检索要用于我们的配置需求的值。 …

应用程序无法正常启动 0xc0150002

Visual Studio 2017在debug下运行程序报错 应用程序无法正常启动 0xc0150002 分析原因 可能是&#xff1a;原程序是低版本的VS所编写的&#xff0c;缺少低版本的运行库&#xff0c;所以报错 解决 安装了VS2010后即可正常运行 error LNK2019: 无法解析的外部符号 __vsnwprin…

Zuul 2 –样本过滤器

Zuul 2终于开源了 。 我第一次听到Zuul 2年Spring由米奇科恩一个2016的讲就是可以在这里找到 &#xff0c;这是好事&#xff0c;终于可以用它玩。 为了快速实现Zuul 2之类的网关的目的–网关提供了微服务生态系统的切入点。 由于所有客户的请求都是通过网关路由的&#xff0c;…