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

CDC(HDC)绘图类:

五大GDI对象类:CPen,CBrush,CFont,CBitmap,CRgn

24.1 梯形分页的双缓冲改进和尺寸自适应

24.2 蝴蝶跟随鼠标点击运动

class CHitFlyDlg : public CDialogEx
{CMemoryDC m_dc;//缓冲enum { PAGE_COUNT = 7 };CMemoryDC m_dcBack;CMemoryDC m_dcFly[PAGE_COUNT];int m_nIndex;CPoint m_pos,m_des;//中心点与目标public:CHitFlyDlg(CWnd* pParent = NULL);	// 标准构造函数
protected:HICON m_hIcon;virtual BOOL OnInitDialog();afx_msg void OnPaint();
public:afx_msg void OnTimer(UINT_PTR nIDEvent);afx_msg BOOL OnEraseBkgnd(CDC* pDC);afx_msg void OnNcPaint();afx_msg void OnLButtonDown(UINT nFlags, CPoint point);void rePosition();
};
BOOL CHitFlyDlg::OnInitDialog()
{CDialogEx::OnInitDialog();int cx = GetSystemMetrics(SM_CXSCREEN);int cy = GetSystemMetrics(SM_CYSCREEN);m_pos.SetPoint(cx / 2, cy / 2);m_des = m_pos;MoveWindow(0, 0, cx, cy, FALSE);m_dc.Create(cx, cy);//缓冲dcm_dcBack.LoadBitmap(_T("./images/back.bmp"));//背景dcint i = -1;CString str;while (++i<_countof(m_dcFly)){str.Format(_T("./images/%03d.bmp"), i + 1);m_dcFly[i].LoadBitmap(str);//7张蝴蝶dc}SetTimer(1, 20, NULL);SetIcon(m_hIcon, TRUE);			// 设置大图标SetIcon(m_hIcon, FALSE);		// 设置小图标return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}
void CHitFlyDlg::OnPaint()
{CPaintDC dc(this); // 用于绘制的设备上下文CRect 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);if (m_pos != m_des)rePosition();CPoint point = m_pos-CPoint(m_dcFly->GetWidth() / 2, m_dcFly->GetHeight() / 2);m_dcFly[m_nIndex].BitTrans(point.x,point.y, m_dcFly->GetWidth(), m_dcFly->GetHeight(), &m_dc, 0, 0, 0);dc.BitBlt(0, 0, rect.Width(), rect.Height(), &m_dc, 0, 0, SRCCOPY);if (++m_nIndex > 6)m_nIndex = 0;
}
void CHitFlyDlg::OnTimer(UINT_PTR nIDEvent)
{Invalidate(FALSE);CDialogEx::OnTimer(nIDEvent);
}BOOL CHitFlyDlg::OnEraseBkgnd(CDC* pDC)
{return TRUE;
}void CHitFlyDlg::OnNcPaint()
{}void CHitFlyDlg::OnLButtonDown(UINT nFlags, CPoint point)
{m_des = point;CDialogEx::OnLButtonDown(nFlags, point);
}void CHitFlyDlg::rePosition()
{int cx = m_des.x - m_pos.x;int cy = m_des.y - m_pos.y;int r = sqrt(cx*cx + cy*cy);if (r < 5)m_pos = m_des;else{m_pos.x += cx * 5 / r;m_pos.y += cy * 5 / r;}
}

24.3 QQ宠物静止版

void MakeRgn(CRgn& r, COLORREF clTrans)//假设背景颜色是:0,0,0{if (r.GetSafeHandle())r.DeleteObject();r.CreateRectRgn(0, 0, 0, 0);//空RGNint x=0, y=0;int cx = m_size.cx,cy=m_size.cy;while (y < cy){x = 0;while (x < cx){if (GetPixel(x, y) != clTrans){CRgn r1;//一个像素大小的RGNr1.CreateRectRgn(x, y, x + 1, y + 1);//面积为1x1的RGNr.CombineRgn(&r, &r1,RGN_OR);}++x;}++y;}}
BOOL CQQDlg::OnInitDialog()
{CDialogEx::OnInitDialog();m_dcFly.LoadBitmap(_T("./images/001.bmp"));MoveWindow(500, 500, m_dcFly.GetWidth(), m_dcFly.GetHeight(), FALSE);CRgn r;m_dcFly.MakeRgn(r, 0);this->SetWindowRgn(r,FALSE);SetIcon(m_hIcon, TRUE);			// 设置大图标SetIcon(m_hIcon, FALSE);		// 设置小图标return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}
void CQQDlg::OnPaint()
{CPaintDC dc(this); // 用于绘制的设备上下文dc.BitBlt(0, 0, m_dcFly.GetWidth(), m_dcFly.GetHeight(), &m_dcFly, 0, 0, SRCCOPY);/*CRect rect;GetClientRect(rect);dc.FillSolidRect(rect, RGB(255, 0, 0));*/
}
HCURSOR CQQDlg::OnQueryDragIcon()
{return static_cast<HCURSOR>(m_hIcon);
}BOOL CQQDlg::OnEraseBkgnd(CDC* pDC)
{return TRUE;
}
void CQQDlg::OnNcPaint()
{}LRESULT CQQDlg::OnNcHitTest(CPoint point)
{return HTCAPTION;
}

24.4 QQ宠物动画版

class CQQDlg : public CDialogEx
{
// 构造enum {FLY_COUNT=7};CMemoryDC m_dcFly[FLY_COUNT];CRgn m_rs[FLY_COUNT];int m_nIndex;//当前第几帧BOOL CQQDlg::OnInitDialog()
{CDialogEx::OnInitDialog();CString str;int i = 0;while (i < _countof(m_dcFly)){str.Format(_T("./images/%03d.bmp"),i+1);m_dcFly[i].LoadBitmap(str);m_dcFly[i].MakeRgn(m_rs[i], 0);++i;}int x = GetSystemMetrics(SM_CXSCREEN), y = GetSystemMetrics(SM_CYSCREEN);MoveWindow(x/2, y/2, m_dcFly->GetWidth(), m_dcFly->GetHeight(), FALSE);CRgn r;r.CreateRectRgn(0, 0, 0, 0); //必须得先创建一个空白的进行初始化r.CopyRgn(m_rs);//m_rs 等价于 &m_rs[0]this->SetWindowRgn(r,FALSE); //CRgn对象只能设置一次,设置后失效,因此先复制到新对象r中SetIcon(m_hIcon, TRUE);			// 设置大图标SetIcon(m_hIcon, FALSE);		// 设置小图标SetTimer(1, 16, NULL);// TODO: 在此添加额外的初始化代码return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}
void CQQDlg::OnPaint()
{CPaintDC dc(this); // 用于绘制的设备上下文//&m_dcFly[m_nIndex]等价于m_dcFly+m_nIndexdc.BitBlt(0, 0, m_dcFly->GetWidth(), m_dcFly->GetHeight(), m_dcFly+m_nIndex, 0, 0, SRCCOPY);/*CRect rect;GetClientRect(rect);dc.FillSolidRect(rect, RGB(255, 0, 0));*/
}
HCURSOR CQQDlg::OnQueryDragIcon()
{return static_cast<HCURSOR>(m_hIcon);
}BOOL CQQDlg::OnEraseBkgnd(CDC* pDC)
{// TODO: 在此添加消息处理程序代码和/或调用默认值return TRUE;
}void CQQDlg::OnNcPaint()
{}LRESULT CQQDlg::OnNcHitTest(CPoint point)
{// TODO: 在此添加消息处理程序代码和/或调用默认值return HTCAPTION		;
}void CQQDlg::OnTimer(UINT_PTR nIDEvent)
{CRgn r;r.CreateRectRgn(0, 0, 0, 0);r.CopyRgn(&m_rs[m_nIndex]);SetWindowRgn(r, TRUE);//Invalidate(FALSE);if (++m_nIndex > 6)m_nIndex = 0;CDialogEx::OnTimer(nIDEvent);
}

24.5 单文档应用程序——绘图软件

24.5.1 矢量图和非矢量图:

矢量图,也称为面向对象的图像或绘图图像,在数学上定义为一系列由线连接的点。

矢量文件中的图形元素称为对象。每个对象都是一个自成一体的实体,它具有颜色、形状、轮廓、大小和屏幕位置等属性。

矢量图是根据几何特性来绘制图形,矢量可以是一个点或一条线,矢量图只能靠软件生成,文件占用内在空间较小,因为这种类型的图像文件包含独立的分离图像,可以自由无限制的重新组合。

它的特点是放大后图像不会失真,和分辨率无关,适用于图形设计、文字设计和一些标志设计、版式设计等。

矢量图软件包括:

corel draw
adobe flash(HTM5取代)

非矢量图形软件包括:

adobe Photoshop。
windows画笔

24.5.2 图形软件的设计:

a)每个层可是圆形、矩形、圆角矩形、直线、铅笔画等等;

b)如果是圆形或矩形层,就需要记录矩形数据(RECT);

c)如果是直线层,就需要记录两个点;

d)如果是铅笔话,就需要记录动态多个点;

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

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

相关文章

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;…

Excel之抽奖器实现

Excel实现一个抽奖器&#xff0c;关键在于学会几个Excel中的函数即可轻松实现。 单人抽奖 RANDBETWEEN 例&#xff1a; INDEX(A2:A61,RANDBETWEEN(1,60))缺点&#xff1a;这种方式生成的抽奖器&#xff0c;在多人情况下&#xff0c;由于RANDBETWEEN函数的返回值有可能是相同…

【RS码1】系统RS码编码原理及MATLAB实现(不使用MATLAB库函数)

关注公号【逆向通信猿】更精彩!!! 基础知识 要想搞懂本节知识,需要先熟悉掌握以下前几篇博客 【多元域乘法】多项式乘法电路原理及MATLAB详解 【多元域除法】多项式除法电路原理及MATLAB详解 RS码编码原理 RS码的编码与BCH码类似,区别在于RS码为多进制的 生成多项式…

【RS码2】RS码的BM迭代译码原理详解及MATLAB实现(不使用MATLAB库函数【全部代码需私信另外付费获取】)

理论基础 订阅《信道编码》专栏,首先查阅各子程序的详解 【有限域生成】本原多项式生成有限域的原理及MATLAB实现 【有限域除法】二元多项式除法电路原理及MATLAB详解 【有限域元素加法和乘法】有限域元素加法和乘法的原理及MATLAB实现 【多元域乘法】多项式乘法电路原理…

QT开发基础

QT中可以使用qmake来生成Makefile&#xff0c;由.pro文件生成Makefile的命令如下&#xff1a; qmake hello.pro -o Makefile make模板(TEMPLATE) 模板变量告诉qmake为这个应用程序生成哪种makefile。下面是可供使用的选择&#xff1a; app - 建立一个应用程序的makefile。这…

Shebang来Java了吗?

尽管添加对Unix风格的shebang &#xff08; #! &#xff09;的支持从来不是 JEP 330 [“启动单文件源代码程序”] 的中心目标 &#xff0c;但围绕JEP 330“单个文件源程序”的潜在功能存在一些问题。为了支持Unix风格的shebang &#xff0c;在OpenJDK jdk-dev邮件列表上引起了广…