看到网上有个老外写的蝴蝶飞舞程序,一时兴起,开发个功能相似的小程序。实现功能:屏幕上有蝴蝶或苍蝇飞舞。素材是通过提取工具提取出来的。老外程序的网址记不清了。程序原理比较简单,本文仅供新手学习参考用。

先看效果:


下面来说说程序原理吧:

工程: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+制作蝴蝶苍蝇飞舞小程序相关推荐

  1. java聊天室小程序论文_在Java项目中利用continue与break制作一个聊天室小程序

    在Java项目中利用continue与break制作一个聊天室小程序 发布时间:2020-12-08 16:03:27 来源:亿速云 阅读:98 作者:Leah 在Java项目中利用continue与 ...

  2. pb程序怎么发布到iis_怎么使用抖音小程序第三方平台系统开发制作发布抖音小程序+教程...

    怎么使用抖音小程序第三方平台系统开发制作发布抖音小程序+教程 抖音短视频APP发布<2019年抖音数据报告>显示,其日活跃用户已经于2020年1月达到4亿,抖音APP受到广大用户追捧的同时 ...

  3. 制作自己的微信小程序要怎么做?

    现在不少人都想要制作自己的微信小程序,不管是企业还是商家都在咨询相关的问题.那么制作自己的微信小程序要怎么做?流程和费用分别又是怎么样的呢?下面个大家一起来看看. 步骤一:要有自己的小程序账号 首先我 ...

  4. 怎么能免费制作自己的微信小程序?

    怎么能免费制作自己的微信小程序? 看下方,小程序的制作有以下四种主要方式: 免费小程序(这里分为三种小程序类型,1.个人小程序2.个体小程序3.企业小程序) [一般个人小程序的话不建议申请,因为权限接 ...

  5. html制作炸金花,微信小程序怎么制作炸金花?微信小程序制作炸金花的方法

    很多朋友喜欢玩炸金花游戏,那么怎么在微信小程序上制作炸金花呢?下面就是小编带来的完整详细的教程,想要学习的小伙伴就赶紧看过来吧. 微信小程序怎么制作炸金花?微信小程序制作炸金花的方法 app.json ...

  6. 基于Java+SpringBoot制作一个校园圈子小程序

    制作一个校园圈子小程序,有效连接信息供需双方,用户可获取和发布需求信息.参与互动交流,适用于同校.同城.社区交流.客户互动.同学/老师注册发布信息等场景. 微信小程序实战开发专栏 一.小程序 1.1 ...

  7. 云开发制作二手商城微信小程序

    从零到有云开发制作二手商城微信小程序 步入大三,和几个小伙伴用三周时间一起制作了一个小程序. 我们刚开始尝试了微信JS前端+JAVA后台的方法,但是由于缺少前端后台传数据的知识,最终选择了云开发的方式 ...

  8. 微信小程序|基于小程序+C#制作一个考试答题小程序

    基于小程序+C#制作一个考试答题小程序打破传统线下考试答题的边界线问题,使考试不用再局限与某个统一的场所,只要有设备,哪里都能考试. 一.小程序

  9. C++培训_004_制作可视化wifi发射小程序

    前言 这次培训的内容在有一部分在前面的笔记,目录在 同学问的问题 分类下.软工答疑和计科答疑的笔记中.这篇笔记主要讲制作 可视化WIFI发射小程序.因为培训只有一小时的时间限制,当然这不完善,要做出完 ...

最新文章

  1. php页面在线人数,也谈php网站在线人数统计
  2. DCMTK:终止服务类用户
  3. MySQL聚簇索引:叶子保存主键或unique字段+data 非聚簇保存索引字段
  4. Centos 7 搭建nginx 服务 使得别人能够访问自己的个人网站
  5. h5 端图片上传-模拟多张上传
  6. Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(三)
  7. joc杂志影响因子2019_排名 ‖ 2019年中国体育学期刊影响因子
  8. kubernetes 实战 使用 nfs 作为动态 storageClass 存储
  9. oracle12cr2发布时间,Oracle 12cR2 发布在即
  10. 理解BERT Transformer:Attention is not all you need!
  11. 机器人操作系统ROS浅析
  12. MDK5之.map文件解析
  13. 漫画C语言 做个聊天软件你不懂也得懂
  14. 10 杀手级的网络管理员的工具
  15. 秒启万台主机,腾讯云云硬盘数据调度架构演进
  16. 浅析错误:software IO TLB: coherent allocation failed for device
  17. MySQL编程:将查询到的字段赋值给变量
  18. 【Linux】WSL
  19. python实现简陋的贪吃蛇小游戏
  20. SparkCore之共享变量的解释

热门文章

  1. 2022国赛11:神州无线AC和AP三种认证方法
  2. Nginx配置+转发8080端口+页面静态缓存+https配置
  3. Unity使用Shader实现3D模型外描边效果ObjectOutline.shader
  4. HHDEBC与其他主流软件SQL格式化功能的对比
  5. 在虚拟机中安装Linux系统 (附上每一步操作截图及说明)【一看就懂】
  6. 支付宝账单下载读文件解析
  7. IT公司(只是看看,不可全信)
  8. ros-noetic安装教程
  9. 【Java学习0331】多线程
  10. 华为服务器防护系统,服务器主机安全防护