MFC和GDI+制作蝴蝶苍蝇飞舞小程序
看到网上有个老外写的蝴蝶飞舞程序,一时兴起,开发个功能相似的小程序。实现功能:屏幕上有蝴蝶或苍蝇飞舞。素材是通过提取工具提取出来的。老外程序的网址记不清了。程序原理比较简单,本文仅供新手学习参考用。
先看效果:
下面来说说程序原理吧:
工程:VS2005,MFC(对话框)工程。
窗口:每个飞舞的元素(蝴蝶/苍蝇)各是一个窗口,这些窗口的父窗口是Desktop,这些窗口具有透明异形的属性,这些窗口的大小与元素大小相同,这些窗口随着元素的形状改变而变化。
元素:蝴蝶/苍蝇 随着动作的变化,GDI+也跟着绘制新的资源图片到窗口上。
动作:动作有2种,一种是元素自身的动作,即摆动翅膀飞舞、原地休息、原地摆动翅膀等动作。另一种动作是元素的移动,即元素在屏幕上任意方向飞舞移动。
动作原理:每个元素窗口都有一个定时器Timer,两种动作会根据自己的随机时间来选择随机的动作与运动方向。
元素动作类型:蝴蝶18种走法,苍蝇16种走法。分别是:不同的方向动作、原地动作。
用到的技术点:
窗口透明:
SetWindowLong(m_hWnd,GWL_EXSTYLE,dwExStyle^0x80000);
窗口异形:
UpdateLayeredWindow(pDC, &ptWinPos, &sizeWindow, &m_dcBack, &ptSrc, 0, &m_Blend, 2);
GDI+:graphics.DrawImage、CDC 等。
托盘:Shell_NotifyIcon
菜单:TrackPopupMenu
关键代码与实现:
窗口透明设置:
ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW,0);//变窗口为透明类型DWORD dwExStyle=GetWindowLong(m_hWnd,GWL_EXSTYLE);if((dwExStyle&0x80000)!=0x80000)SetWindowLong(m_hWnd,GWL_EXSTYLE,dwExStyle^0x80000);
创建画刷:
void CFlyWnd::MakeBkgndDC()
{CRect rtClient;GetClientRect(&rtClient);CDC *pDC = GetDC();CBitmap hBackground;hBackground.CreateCompatibleBitmap(pDC,rtClient.Width(),rtClient.Height());if(m_dcBack.m_hDC == NULL){m_dcBack.CreateCompatibleDC(pDC);}CBitmap *pOldBmp = m_dcBack.SelectObject(&hBackground);pOldBmp->DeleteObject();hBackground.DeleteObject();ReleaseDC(pDC);
}
动作产生后,更新画刷:
void CFlyWnd::UpdateMemoDC()
{MakeBkgndDC();CRect rcClient;GetWindowRect(&rcClient);CDC * pDC = GetDC();if(m_dcBack.GetSafeHdc() == NULL)return;Gdiplus::Graphics graphics(m_dcBack.GetSafeHdc());if(m_nInectType == 0){RectF rtGdiplus(0,0,m_InectSize.cx, m_InectSize.cy);//画刷新图标graphics.DrawImage(g_pFly[m_nIndex[0]][m_nIndex[1]], rtGdiplus, 0, 0, m_InectSize.cx, m_InectSize.cy, UnitPixel);POINT ptWinPos = {rcClient.left, rcClient.top};SIZE sizeWindow={m_InectSize.cx, m_InectSize.cy};//图片尺寸POINT ptSrc={0,0};UpdateLayeredWindow(pDC, &ptWinPos, &sizeWindow, &m_dcBack, &ptSrc, 0, &m_Blend, 2);}else if(m_nInectType ==1){RectF rtGdiplus(0,0,m_InectSize.cx, m_InectSize.cy);//画刷新图标graphics.DrawImage(g_pButterFly[m_nIndex[0]][m_nIndex[1]], rtGdiplus, 0, 0, m_InectSize.cx, m_InectSize.cy, UnitPixel);POINT ptWinPos = {rcClient.left, rcClient.top};SIZE sizeWindow={m_InectSize.cx, m_InectSize.cy};//图片尺寸POINT ptSrc={0,0};UpdateLayeredWindow(pDC, &ptWinPos, &sizeWindow, &m_dcBack, &ptSrc, 0, &m_Blend, 2);}ReleaseDC(pDC);
}
动作的控制:
//由于此部分代码量比较大,请下载源程序参阅
SetTimer(1, m_nElapse, NULL);
....
void CFlyWnd::OnTimer(UINT nIDEvent)
{if(m_nInectType == 0){//苍蝇Step();}else if(m_nInectType == 1){//蝴蝶ButterflyStep();}
}void CFlyWnd::UpdateFlyPos(CRect rcNewPos)
{MoveWindow(&rcNewPos, FALSE);
}
源程序下载链接:
http://download.csdn.net/detail/xinsuiyishunjian/9561944
MFC和GDI+制作蝴蝶苍蝇飞舞小程序相关推荐
- java聊天室小程序论文_在Java项目中利用continue与break制作一个聊天室小程序
在Java项目中利用continue与break制作一个聊天室小程序 发布时间:2020-12-08 16:03:27 来源:亿速云 阅读:98 作者:Leah 在Java项目中利用continue与 ...
- pb程序怎么发布到iis_怎么使用抖音小程序第三方平台系统开发制作发布抖音小程序+教程...
怎么使用抖音小程序第三方平台系统开发制作发布抖音小程序+教程 抖音短视频APP发布<2019年抖音数据报告>显示,其日活跃用户已经于2020年1月达到4亿,抖音APP受到广大用户追捧的同时 ...
- 制作自己的微信小程序要怎么做?
现在不少人都想要制作自己的微信小程序,不管是企业还是商家都在咨询相关的问题.那么制作自己的微信小程序要怎么做?流程和费用分别又是怎么样的呢?下面个大家一起来看看. 步骤一:要有自己的小程序账号 首先我 ...
- 怎么能免费制作自己的微信小程序?
怎么能免费制作自己的微信小程序? 看下方,小程序的制作有以下四种主要方式: 免费小程序(这里分为三种小程序类型,1.个人小程序2.个体小程序3.企业小程序) [一般个人小程序的话不建议申请,因为权限接 ...
- html制作炸金花,微信小程序怎么制作炸金花?微信小程序制作炸金花的方法
很多朋友喜欢玩炸金花游戏,那么怎么在微信小程序上制作炸金花呢?下面就是小编带来的完整详细的教程,想要学习的小伙伴就赶紧看过来吧. 微信小程序怎么制作炸金花?微信小程序制作炸金花的方法 app.json ...
- 基于Java+SpringBoot制作一个校园圈子小程序
制作一个校园圈子小程序,有效连接信息供需双方,用户可获取和发布需求信息.参与互动交流,适用于同校.同城.社区交流.客户互动.同学/老师注册发布信息等场景. 微信小程序实战开发专栏 一.小程序 1.1 ...
- 云开发制作二手商城微信小程序
从零到有云开发制作二手商城微信小程序 步入大三,和几个小伙伴用三周时间一起制作了一个小程序. 我们刚开始尝试了微信JS前端+JAVA后台的方法,但是由于缺少前端后台传数据的知识,最终选择了云开发的方式 ...
- 微信小程序|基于小程序+C#制作一个考试答题小程序
基于小程序+C#制作一个考试答题小程序打破传统线下考试答题的边界线问题,使考试不用再局限与某个统一的场所,只要有设备,哪里都能考试. 一.小程序
- C++培训_004_制作可视化wifi发射小程序
前言 这次培训的内容在有一部分在前面的笔记,目录在 同学问的问题 分类下.软工答疑和计科答疑的笔记中.这篇笔记主要讲制作 可视化WIFI发射小程序.因为培训只有一小时的时间限制,当然这不完善,要做出完 ...
最新文章
- php页面在线人数,也谈php网站在线人数统计
- DCMTK:终止服务类用户
- MySQL聚簇索引:叶子保存主键或unique字段+data 非聚簇保存索引字段
- Centos 7 搭建nginx 服务 使得别人能够访问自己的个人网站
- h5 端图片上传-模拟多张上传
- Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(三)
- joc杂志影响因子2019_排名 ‖ 2019年中国体育学期刊影响因子
- kubernetes 实战 使用 nfs 作为动态 storageClass 存储
- oracle12cr2发布时间,Oracle 12cR2 发布在即
- 理解BERT Transformer:Attention is not all you need!
- 机器人操作系统ROS浅析
- MDK5之.map文件解析
- 漫画C语言 做个聊天软件你不懂也得懂
- 10 杀手级的网络管理员的工具
- 秒启万台主机,腾讯云云硬盘数据调度架构演进
- 浅析错误:software IO TLB: coherent allocation failed for device
- MySQL编程:将查询到的字段赋值给变量
- 【Linux】WSL
- python实现简陋的贪吃蛇小游戏
- SparkCore之共享变量的解释