MFC和GDI+制作雪花飞舞小程序
基于CWnd对话框,利用GDI+和PNG素材实现雪花飞舞唯美场景小程序。程序技术简单,仅供新手参考学习使用。
先看疗效:
下面来说说程序原理吧:
工程:VS2005,MFC(对话框)工程。
窗口:主窗口宽高为0,主要接收菜单传来的消息。绘图窗口宽高为屏幕的宽高,主要绘制雪花。
元素:雪花种类共12种,GDI+绘制不同的资源图片到窗口上。
动作:动作有3种,左移动、右移动、下移动。
动作原理:绘图窗口有一个定时器Timer,定时器根据时间来判断是否需要加入新的雪花图片,图片随机。
程绘图原理:
1.获取窗口DC。
2.创建位图、画刷。
3.随着TIMER,随机产生图像,同时定义好图像坐标与大小。
4.绘制图像到画刷中。
5.更新位图到窗口上。
用到的技术点:
窗口透明:
WS_EX_TOPMOST(顶层)
WS_EX_LAYERED(透明异形)
WS_EX_TRANSPARENT(消息穿透)
窗口绘图:
UpdateLayeredWindow();
GDI+:graphics.DrawImage、CDC 等。
托盘:Shell_NotifyIcon
菜单:TrackPopupMenu
关键代码与实现:
注册窗口类:
WNDCLASS wndcls;memset(&wndcls, 0, sizeof(WNDCLASS));wndcls.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;wndcls.lpfnWndProc = ::DefWindowProc;wndcls.hInstance = AfxGetInstanceHandle();wndcls.hIcon = NULL;wndcls.hCursor = ::LoadCursor(NULL,IDC_ARROW);wndcls.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);wndcls.lpszMenuName = NULL;wndcls.lpszClassName = lpszClassName;if(!AfxRegisterClass(&wndcls)){return FALSE;}
窗口透明异形:
int nWidth = GetSystemMetrics (SM_CXSCREEN);int nHeight = GetSystemMetrics (SM_CYSCREEN);DWORD dwExStyle = WS_EX_TOOLWINDOW | WS_EX_TOPMOST | WS_EX_LAYERED | WS_EX_TRANSPARENT;DWORD dwStyle = WS_POPUP | WS_VISIBLE | WS_SYSMENU;m_pSnowWnd = new CSnowWnd;BOOL bRes = m_pSnowWnd->CreateEx(dwExStyle, _T("CSnowWnd"), _T("Snow"), dwStyle, 0, 0, nWidth, nHeight, m_hWnd, NULL);m_pSnowWnd->ShowWindow(SW_SHOW);
创建画刷:
void CSnowWnd::MakeBkgndDC()
{CDC *pDC = GetDC();CBitmap hBackground;hBackground.CreateCompatibleBitmap(pDC, m_rcWnd.Width(), m_rcWnd.Height());if(m_dcBack.m_hDC == NULL)m_dcBack.CreateCompatibleDC(pDC);CBitmap *pOldBmp = m_dcBack.SelectObject(&hBackground);pOldBmp->DeleteObject();hBackground.DeleteObject();ReleaseDC(pDC);
}
雪花位置、大小、移动数据的产生:
void CSnowWnd::DownSnow()
{DWORD dwRes = 0;for(int i = m_nImgCount - 1; i >= 0; i--){PIMG pImage = m_ImgDrawSto[i];pImage->Y+= pImage->nSpeed;//下移if(pImage->Y > m_rcWnd.Height())//超出{m_ImgDrawSto.RemoveAt(i);//移除delete pImage;continue;}if(dwRes == 0)dwRes = GetTickCount() - pImage->dwTickCount;//横向移动 if (pImage->Init){pImage->Init = FALSE;pImage->StepTpye = GetRand(1, 3);}switch (pImage->StepTpye){case 1:pImage->X--;break;case 2:pImage->X++;break;}}m_nImgCount = m_ImgDrawSto.GetCount();if(dwRes > 1800)//增加雪花时间控制AddSnow(GetRand(0, m_nRowMaxCount));DrawWnd();
}
绘图:
void CSnowWnd::DrawWnd()
{MakeBkgndDC();CDC * pDC = GetDC();Graphics g(m_dcBack.GetSafeHdc());for(int i=0;i<m_nImgCount;i++){PIMG pImage = m_ImgDrawSto[i];g.DrawImage(pImage->pImage, pImage->X, pImage->Y, pImage->Width, pImage->Height);}CPoint DestPt(0,0);CSize psize(m_rcWnd.Width(),m_rcWnd.Height());BLENDFUNCTION blend;blend.AlphaFormat = AC_SRC_ALPHA;blend.BlendFlags = 0;blend.BlendOp = AC_SRC_OVER;blend.SourceConstantAlpha = 255;UpdateLayeredWindow(pDC, NULL, &psize, &m_dcBack, &DestPt, 0, &blend, ULW_ALPHA);ReleaseDC(pDC);
}
好了,主要的代码已经贴出来,如有疑问可以留言。
源程序下载链接:
http://download.csdn.net/detail/xinsuiyishunjian/9587916
MFC和GDI+制作雪花飞舞小程序相关推荐
- 用MFC制作一个倒计时小程序
用MFC制作一个倒计时小程序 1.思路: 1)初始步骤1:新建一个工程,选择MFC AppWizard(exe),工程名命名为CdTimer,选择基于对话框形式的应用程序,将此主对话框用于显示剩余的时 ...
- 生日快乐程序_别@官方了!云开发教你制作个性头像小程序,以后过节想加啥就加啥!...
导语 别再@官方啦!云开发教你轻松制作个性头像小程序,趣味挂件.个性icon--想加啥就加啥!以后的每个节日,不求官方只求自己!快来get一下! 今年是祖国成立70周年(1949-2019) 提前祝祖 ...
- 云开发表情包制作神器微信小程序源码下载,支持各种自定义
该款小程序是一个表情包制作 内容毕竟丰富,另外自定义制作方面也是特别的自由 支持自主上传图片,自定义文章,另外拥有多种素材模板以供选择 这是一款云开发的小程序,但是安装还是挺简单的 搭建教程: 首先使 ...
- 【小程序源码】云开发表情包制作神器微信小程序源码下载,支持各种自定义
该款小程序是一个表情包制作 内容毕竟丰富,另外自定义制作方面也是特别的自由 支持自主上传图片,自定义文章,另外拥有多种素材模板以供选择 这是一款云开发的小程序,但是安装还是挺简单的 搭建教程: 首先使 ...
- 强大的装逼,表白,炫富,恶搞短视频制作神器微信小程序源码支持多种流量主
大家好给大家带来一款强大的微信小程序源码 该源码是属于制作短视频类型的 支持一键制作成各种短视频,比如装逼,表白,炫富,恶搞-..等等 里面拥有各种各样的模板,和抖音一键制作视频一个道理 另外里面小编 ...
- 如何制作一个微信小程序【微信小程序是怎么做的】
为什么现在这么多人使用微信小程序呢?因为微信小程序除了便捷易开发,公司企业可以用来做小程序展示官网,商家也可以做小程序商城,甚至个人也可以拥有自己的小程序.那么如何制作一个微信小程序?微信小程序是怎么 ...
- 全新圣诞节头像框制作生成微信小程序源码下载支持多模板
一款可以制作圣诞帽头像的一款小程序 里面有多种模板选择,当然啦里面不只是可以制作圣诞帽 还可以制作贴图头像框,各种卡通,卡哇伊,男神女神标等等模板可以制作的 另外还支持检测你的手机型号,自动辨别手机真 ...
- 不用写一行代码,就能用ivx制作一个“微信小程序“,超牛逼
今天需要为大家介绍一款神器ivx. 它是通用无代码开发平台,是面向新一代全栈开发人员的通过不编写代码的方式实现快速开发的软件开发平台,提供图形化逻辑编排编程语言.抽象组件.集成开发环境等能力,能够支持 ...
- 商家如何自己零成本免费制作点餐小程序
现在点餐小程序成为餐饮店的标配,顾客只要扫码,即可进入小程序点餐.顾客付款后,后厨自动打印出订单并开始制作.整个过程非常方便流畅,甚至还可以免去收银(或服务)人员.那么,这种餐饮小程序要如何搭建呢?找 ...
最新文章
- Java开发中Netty线程模型原理解析!
- Oracle备份解决方案
- Java 结构体之 JavaStruct 使用教程一 初识 JavaStruct
- 51nod-1131: 覆盖数字的数量
- MantisBT 缺陷管理系统
- Fusion Studio 17 for Mac(视频后期特效合成软件)
- 谷粒学院项目总结(持续更新)
- 单纯形法中大m法_单纯形法(大M法)
- PIC单片机-Mplab的使用与实践
- Excel表格中正数设置为红色负为绿色
- 基于人脸识别的门禁系统设计与实现--论文
- pdf合并成一个pdf怎么合并
- 【数学建模学习④】飞行管理问题
- 金融科技争做“超级接口”,度小满有了“送水工”的样子
- 关于爱情和婚姻的经典故事
- python变量命名规则
- 论文排版——Latex页眉页脚设定(中英都可以适用)
- Vertu TI root教程_方法
- unity-调用动态库so-android篇
- 那些年啊,那些事——一个程序员的奋斗史 ——113