桌面下雪程序的编写

一. 综述
考虑到雪花将会很多,并且每个雪花都有自己的行为路径,统一处理比较麻烦,因此自定义一个类CSnowflake,它所呈现的主要接口有两个:下落和“死亡”判断。下落路径由雪花对象自身处理,主框架中只是采用定时器来控制其下落。当然,雪花落到屏幕底后就相当于“死亡”了,为了保持活动雪花总数大致不变,我又开启了一个定时器,用来产生雪花。在用户交互上我做了一个托盘,可以显示提示,右键弹出菜单。还有一个小问题——程序运行之后即隐藏界面,自己试了许多方法,也在网上差了许多,最后还是在消息WM_WINDOWPOSCHANGING响应中添加lpwndpos->flags&=SWP_HIDEWINDOW并且去掉MFC生成的代码这个方法来的彻底。
二. 程序显示
1. 雪花
 
2. 托盘

 


三. 雪花snowflake类
主要描述其下落方法。
BOOL CSnowflake::Down()
{if (bDie)return FALSE;CRect rtNewLocation;srand((UINT)time(NULL));//随机种子if (rand()%2)rtNewLocation.left=rtLocation.left+rand()%10;elsertNewLocation.left=rtLocation.left-rand()%5;rtNewLocation.right=rtNewLocation.left+rtLocation.Width();rtNewLocation.top=rtLocation.top+iSpeed;rtNewLocation.bottom=rtNewLocation.top+rtLocation.Height();if (rtNewLocation.bottom>=rtDesktop.bottom)//超出绘制屏幕{bDie=TRUE;//设置死亡标志return FALSE;}else//下落{//擦除原雪花RedrawWindow(hwndDesktop,&rtLocation,NULL,RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW);HDC hDesktopDC=GetDC(hwndDesktop);CDC desktopDC;desktopDC.Attach(hDesktopDC);//桌面窗口DCCBitmap bmp;switch(bmpID){case 0:bmp.LoadBitmap(IDB_BITMAP1);break;case 1:bmp.LoadBitmap(IDB_BITMAP2);break;case 2:bmp.LoadBitmap(IDB_BITMAP3);break;case 3:bmp.LoadBitmap(IDB_BITMAP4);break;default:break;}//重绘原矩形区域CDC bmpDC;bmpDC.CreateCompatibleDC(&desktopDC);CBitmap *poldbmp=bmpDC.SelectObject(&bmp);desktopDC.TransparentBlt(rtNewLocation.left,rtNewLocation.top,rtNewLocation.Width(),rtNewLocation.Height(),&bmpDC,0,0,rtNewLocation.Width(),rtNewLocation.Height(),RGB(0,0,0));//将底色白色设为透明bmpDC.SelectObject(poldbmp);desktopDC.Detach();ReleaseDC(hwndDesktop,hDesktopDC);rtLocation=rtNewLocation;//赋新位置return TRUE;}
}




说明:
其中的hwndDesktop是在构造函数中使用以下代码获得的
HWND hProgMan=::FindWindowW(L"ProgMan",NULL);
if(hProgMan)
{HWND hShellDefView=::FindWindowEx(hProgMan,NULL,L"SHELLDLL_DefView",NULL);if(hShellDefView)hwndDesktop=::FindWindowEx(hShellDefView,NULL,L"SysListView32",L"FolderView");
}
if (hwndDesktop==NULL)bDie=TRUE;


其中的rtLocation指的是雪花当前矩形位置,rtDesktop指的是绘制屏幕矩形范围。


位图我画了四个,随机选择一个。
四. 主对话框中的处理
1. 定时器处理
void CSnow2Dlg::OnTimer(UINT_PTR nIDEvent)
{switch(nIDEvent){case 1://控制雪花下落{if(WAIT_TIMEOUT==WaitForSingleObject(m_handleEvent,100))break;ResetEvent(m_handleEvent);std::vector<CSnowflake> tempflakes;for (std::vector<CSnowflake>::iterator iter=snowflakes.begin();iter!=snowflakes.end();++iter){if (iter->IsDie()==FALSE){iter->Down();tempflakes.push_back(*iter);}}snowflakes.clear();snowflakes=tempflakes;SetEvent(m_handleEvent);}break;case 2://判断雪花死亡状态,产生新雪花{if(WAIT_TIMEOUT==WaitForSingleObject(m_handleEvent,100))break;ResetEvent(m_handleEvent);if (snowflakes.size()<MAX_COUNT_FLAKES){srand(static_cast<UINT>(time(NULL)));static int count=1;for (int i=0;i!=count;++i){CSnowflake flake(rand()%MAX_BMP_COUNT,15,15,rand()%m_iDesktopWidth+1,rand()%5+2,CRect(0,0,m_iDesktopWidth,m_iDesktopHeight));snowflakes.push_back(flake);}++count;if (count>10)count=10;}SetEvent(m_handleEvent);}break;default:break;}CDialog::OnTimer(nIDEvent);
}


说明:此处有一std::vector<CSnowflake>类型的snowflakes成员变量,这个保存了当前所有活动雪花,若雪花已“死”,将会被移除出此向量,这样“死亡”的雪花就可在屏幕任务栏积累。然而在两个定时器中都会访问这个向量,于是为了防止访问冲突,设置了一个同步事件m_handleEvent。


2. 托盘处理
托盘的添加是在OnInitDialog中的:
m_nid.cbSize=sizeof(NOTIFYICONDATA);
m_nid.hWnd=this->m_hWnd;
m_nid.uID=IDR_MAINFRAME;
m_nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP|NIF_INFO;
m_nid.uCallbackMessage=UM_TRAY;//自定义的消息名称
m_nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
wcscpy_s(m_nid.szTip,L"桌面下雪程序");//信息提示条
wcscpy_s(m_nid.szInfo,L"哦,下雪了");//信息提示条
wcscpy_s(m_nid.szInfoTitle,L"桌面下雪程序提示");//信息提示条
m_nid.dwInfoFlags=NIIF_INFO;
Shell_NotifyIcon(NIM_ADD,&m_nid);//在托盘区添加图标


对其图标的消息处理函数为:
LRESULT CSnow2Dlg::OnTray(WPARAM wParam,LPARAM lParam)
{if(wParam!=IDR_MAINFRAME) return 1;switch(lParam) {case WM_RBUTTONDOWN:{CPoint pos;GetCursorPos(&pos);//得到鼠标位置 CMenu menu;menu.LoadMenuW(IDR_TRAYMENU);CMenu *psubmenu=menu.GetSubMenu(0);SetForegroundWindow(); //使在菜单外点击时菜单消失psubmenu->TrackPopupMenu(TPM_LEFTALIGN,pos.x,pos.y,this);//确定弹出式菜单的位置} break;default:break;} return 0;
}


此处有一个右键弹出菜单。菜单的命令响应就不列出了。


五. 结束语
1. Bug
点击托盘菜单时,雪花会停止下落。
2. 说明
本程序只适于静态桌面环境下。
3. 奋斗无止境
4. 代码下载地址
点击打开链接

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

桌面下雪软件测试工程师,Xsnow - 在Ubuntu 18.04及更高版本的桌面上下雪

原标题&#xff1a;Xsnow - 在Ubuntu 18.04及更高版本的桌面上下雪 Xsnow&#xff0c;让它在你的桌面上下雪吧&#xff0c;现在正在Ubuntu 18.04或更高版本的Gnome, KDE, FVWM桌面上工作。 Xsnow是一个方便的命令工具&#xff0c;可以将圣诞节带到您的桌面。但是&#xff0c;它…

linux桌面下雪,分享|Linux/Unix 桌面趣事:让桌面下雪

在这个节日里感到孤独么&#xff1f;试一下 Xsnow 吧。它是一个可以在 Unix/Linux 桌面下下雪的应用。圣诞老人和他的驯鹿会在屏幕中奔跑&#xff0c;伴随着雪片让你感受到节日的感觉。 我第一次安装它还是在 13、4 年前。它最初是在 1984 年 Macintosh 系统中创造的。你可以用…

桌面下雪软件测试工程师,Win7系统如何设置桌面下雪屏保?

一个好看的屏保会带给用户一个好的心情&#xff0c;有很多用户包括小编都很喜欢让桌面下雪的屏保&#xff0c;但是有很多用户并不知道要如何设置桌面下雪屏保&#xff0c;下面&#xff0c;小编就来教教大家在Win7系统下设置桌面下雪屏保的方法。 方法/步骤 1、下载解压缩“桌面…

圣诞节到了!!你的桌面下雪了吗?? - Qt趣味开发之让你的桌面下雪

圣诞节到了&#xff0c;写个桌面下雪的程序庆祝一下。过节也是要有仪式感的&#xff01;&#xff01; 显示效果如下&#xff1a; 具有如下功能&#xff1a; 托盘菜单&#xff0c;可以配置、关于作者、退出。可以配置是否下雪、烟花效果&#xff0c;配置雪的浓度和下降的速度…

vue2 路由进阶,VueCli 自定义创建项目

一、声明式导航-导航链接 1.需求 实现导航高亮效果 如果使用a标签进行跳转的话&#xff0c;需要给当前跳转的导航加样式&#xff0c;同时要移除上一个a标签的样式&#xff0c;太麻烦&#xff01;&#xff01;&#xff01; 2.解决方案 vue-router 提供了一个全局组件 router…

【springboot】Spring Cache缓存:

文章目录 一、导入Maven依赖&#xff1a;二、实现思路&#xff1a;三、代码开发&#xff1a; 一、导入Maven依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId><…

sql:SQL优化知识点记录(四)

&#xff08;1&#xff09;explain之ref介绍 type下的ref是非唯一性索引扫描具体的一个值 ref属性 例如&#xff1a;ti表先加载&#xff0c;const是常量 t1.other_column是个t1表常量 test.t1.ID&#xff1a;test库t1表的ID字段 t1表引用了shared库的t2表的col1字段&#x…

【算法训练-链表】反转链表、区间反转链表、K个一组反转链表

从今天开始进行高频算法的训练&#xff0c;一方面训练自己的逻辑思维&#xff0c;一方面保持自己的竞争力。训练过程有这么两个基准原则&#xff1a; 首先训练题的来源呢有三个&#xff0c;首选的是三个都出现过的高频题&#xff0c;以&#xff1a;牛客101为基准分类&#xff…

梯度下降算法简单理解:一阶泰勒展开式,梯度下降数学原理

目录 梯度下降算法简单理解 一阶泰勒展开式 梯度下降数学原理 梯度下降算法简单理解 梯度下降算法的公式非常简单&#xff0c;”沿着梯度的反方向&#xff08;坡度最陡&#xff09;“是我们日常经验得到的&#xff0c;其本质的原因到底是什么呢&#xff1f;为什么局部下降最…

Oracle的学习心得和知识总结(二十九)|Oracle数据库数据库回放功能之论文三翻译及学习

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《Oracle Database SQL Language Reference》 2、参考书籍&#xff1a;《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Gui…

免费的客户管理软件有哪些推荐?

目前市面上的客户管理系统不少&#xff0c;也各有特色&#xff0c;但永久免费而又灵活好用的却不多。以下是几个推荐&#xff0c;需要的可逐一试用再作选择&#xff1a; 一、蓝点客户关系管理系统 蓝点的客户管理系统胜在强大的自定义能力&#xff0c;你可以在它基础上方便地…

Mybatis-Plus快速入门

目录 一、基础工程 1、创建一个数据库&#xff1a;mp 2、添加数据 3、创建初始工程 4、添加依赖 二、Mybatis Mybatis-Plus 1、创建子工程&#xff1a;mybatis-plus-simple 2、在子工程下添加配置 2.1Mybatis实现查询User 2.1.1、编写User实体对象 2.1.2、编写UserMa…

外贸CRM软件排行榜:优化客户关系管理,跟进客户并提升销售业绩

在外贸行业中&#xff0c;建立良好的客户关系和有效地跟进客户是取得成功的关键。为了更好地管理客户关系并提升销售业绩&#xff0c;外贸企业越来越多地依赖于CRM&#xff08;客户关系管理&#xff09;软件。然而&#xff0c;市场上存在各种不同的外贸CRM软件选择&#xff0c;…

开发信外贸客户开发工具

电话开发外贸客户是外贸业务中不可或缺的一部分。然而&#xff0c;如何进行电话开发外贸客户&#xff0c;却是许多公司一直在思考的问题。本文将介绍一些电话开发外贸客户的技巧和方法&#xff0c;希望能够为您的业务开拓提供帮助。 首先&#xff0c;你需要了解你的目标客户。了…

推荐好用的CRM客户管理软件?

有没有好用的CRM客户管理软件推荐&#xff1f;综合来看&#xff0c;比较推荐您使用Zoho CRM。在功能方面&#xff0c;Zoho CRM的完整性能和领头羊SF有的一拼&#xff0c;但相同版本的价格还不到三分之一&#xff1b;在本土化方面&#xff0c;Zoho CRM在国内设立了多个办公室&am…

外贸客户管理系统(外贸CRM)有哪些功能?

对外贸企业来说,客户是血液,客户管理直接影响到企业的销售业绩和盈利能力。因此选择一个功能强大的客户管理系统,对外贸企业来说是非常重要的。下面我来全面介绍一下外贸客户管理系统的主要功能: 一、客户信息管理客户信息管理是客户管理系统的基础功能。该模块可以建立客户数据…

运维Shell脚本小试牛刀(一)

一: Shell中循环剖析....... #!/bin/bash - # # # # FILE: countloop.sh # USAGE: ./countloop.sh # DESCRIPTION: # OPTIONS: ------- # REQUIREMENTS: --------- # # BUGS: ------ # N…

雄牛PVC地板革新胶地板行业成环保绿色新选择

在欧美国家&#xff0c;PVC地板已将发展成为流行性新型轻体装修材料&#xff0c;因采用了聚乙烯材料生产&#xff0c;所以耐用性和环保程度都比较高。这种PVC地板一般多用于大型楼宇、CBD或者机场、火车站等&#xff0c;耐磨程度和使用寿命都优于传统地板。 国内也有不少企业推…

防静电地板施工规范

防静电地板施工规范 一般规定 防静电聚氯乙烯&#xff08;PVC&#xff09;地面施工内容包括基层处理、接地系统安装、胶水配制、防静电聚氯乙烯&#xff08;PVC&#xff09;贴面板&#xff08;以下简称&#xff09;贴面板的铺贴与清洗施工、测试及质量检验。 施工现场温度应…

蓝桥杯第七届决赛JAVA真题----广场舞

广场舞 LQ市的市民广场是一个多边形&#xff0c;广场上铺满了大理石的地板砖。 地板砖铺得方方正正&#xff0c;就像坐标轴纸一样。 以某四块砖相接的点为原点&#xff0c;地板砖的两条边为两个正方向&#xff0c;一块砖的边长为横纵坐标的单位长度&#xff0c;则所有横纵坐标…