在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例桌面应用界面/GUI → vc++ 非常好看的桌面下雪效果

vc++ 非常好看的桌面下雪效果

桌面应用界面/GUI

下载此实例
  • 开发语言:C/C++
  • 实例大小:3.97M
  • 下载次数:45
  • 浏览次数:817
  • 发布时间:2018-02-04
  • 实例类别:桌面应用界面/GUI
  • 发 布 人:sia
  • 文件格式:.zip
  • 所需积分:5
 相关标签: c++ c VC++ 桌面

实例介绍

【实例简介】非常好看的桌面下雪效果

================================================================================
MICROSOFT 基础类库: AnimationShow 项目概述
===============================================================================

应用程序向导已为您创建了这个 AnimationShow 应用程序。此应用程序不仅演示 Microsoft 基础类的基本使用方法,还可作为您编写应用程序的起点。

本文件概要介绍组成 AnimationShow 应用程序的每个文件的内容。

AnimationShow.vcproj
这是使用应用程序向导生成的 VC 项目的主项目文件。 
它包含生成该文件的 Visual C 的版本信息,以及有关使用应用程序向导选择的平台、配置和项目功能的信息。

AnimationShow.h
这是应用程序的主要头文件。它包括其他项目特定的头文件(包括 Resource.h),并声明 CAnimationShowApp 应用程序类。

AnimationShow.cpp
这是包含应用程序类 CAnimationShowApp 的主要应用程序源文件。

AnimationShow.rc
这是程序使用的所有 Microsoft Windows 资源的列表。它包括 RES 子目录中存储的图标、位图和光标。此文件可以直接在 Microsoft Visual C 中进行编辑。项目资源位于 2052 中。

res\AnimationShow.ico
这是用作应用程序图标的图标文件。此图标包括在主要资源文件 AnimationShow.rc 中。

res\AnimationShow.rc2
此文件包含不在 Microsoft Visual C 中进行编辑的资源。您应该将不可由资源编辑器编辑的所有资源放在此文件中。

【实例截图】

from clipboard

【核心代码】

#include "StdAfx.h"
#include "SnowWindow.h"
#include <math.h> 

CSnowWindow::CSnowWindow(void)
{

}

CSnowWindow::~CSnowWindow(void)
{

}
BOOL CSnowWindow::Create(HWND hWndParent)
{
	m_nWidth = GetSystemMetrics (SM_CXSCREEN);
	m_nHeight =  GetSystemMetrics (SM_CYSCREEN);
	int x = 0;
	int y = 0;
	DWORD dwExStyle = WS_EX_TOOLWINDOW | WS_EX_TOPMOST | WS_EX_LAYERED | WS_EX_TRANSPARENT;
	DWORD dwStyle = WS_POPUP | WS_VISIBLE | WS_SYSMENU;

	if(!CWnd::CreateEx(dwExStyle,APP_CLASSNAME,APP_SOFTNAME,dwStyle,x,y,m_nWidth,m_nHeight,hWndParent,NULL))
		return FALSE;

	srand( (unsigned)time( NULL ) );
	InitImage();
	SetTimer(1,100,NULL);
	return TRUE;
}
void CSnowWindow::InitImage()
{
	AddAnimation(_T("Snow01.png"),0);
	AddAnimation(_T("Snow02.png"),0);
	AddAnimation(_T("Snow03.png"),-1);
	AddAnimation(_T("Snow04.png"),-1);
	AddAnimation(_T("Snow05.png"),0);
	AddAnimation(_T("Snow06.png"),0);
	AddAnimation(_T("Snow07.png"),0);
	AddAnimation(_T("Snow08.png"),0);
	AddAnimation(_T("Snow09.png"),0);
	AddAnimation(_T("Snow10.png"),0);
	AddAnimation(_T("Snow11.png"),0);
	AddAnimation(_T("Snow12.png"),0);


	m_RowCount=m_nWidth/(m_ImageArray[0]->Width 20);
	m_AllCount=m_RowCount*(m_nHeight/(m_ImageArray[0]->Height 20));
	AddSnow(m_RowCount);
}
void CSnowWindow::AddAnimation(LPCTSTR lpName,int nAngle)
{
	LPAnimationImage pImage=AddImage(lpName);
	pImage->Angle=nAngle;
}
//添加雪花图片
void CSnowWindow::AddSnow(int nCount)
{
	for(int i=0;i<nCount;i  )
	{
		//随机取一张图片
		int nIndex=GetRndNum(0,m_ImageCount-1);
		LPAnimationImage pImage=new AnimationImage;
		LPAnimationImage pSrcImage=m_ImageArray[nIndex];
		CopyMemory(pImage,pSrcImage,sizeof(AnimationImage));

		//随机设置图片的初始位置
		pImage->X=GetRndNum(0,m_nWidth);
		pImage->Y=0-GetRndNum(pImage->Height,pImage->Height*2);

		//随机缩放图片
		float f=(float)GetRndNum(50,100);
		f=f/(float)100;
		pImage->Width=(int)((float)pImage->Width*f);
		pImage->Height=(int)((float)pImage->Height*f);

		//随机设置初始角度
		if(pImage->Angle>=0)
			pImage->Angle=GetRndNum(0,360);

		m_SnowArray.Add(pImage);

	}
	m_SnowCount=m_SnowArray.GetCount();
}
//下移雪花图片
void CSnowWindow::DownSnow()
{
	int nTop=25;
	for(int i=m_SnowCount-1;i>=0;i--)
	{
		LPAnimationImage pImage=m_SnowArray[i];
		pImage->Y =5;//下移
		if(pImage->Y>m_nHeight)//超出屏幕高度
		{
			m_SnowArray.RemoveAt(i);//移除这张图片
			delete pImage;
			continue;//转到下一次循环
		}
		//-------------
		if(pImage->Y<nTop)
			nTop=pImage->Y;
		//-------------
		//旋转图片
		if(pImage->Angle>=0)
		{
			pImage->Angle =10;
			if(pImage->Angle>=360)
				pImage->Angle=0;
		}
		//-------------
		//横向移动 
		if(pImage->OffsetPos==0 || pImage->OffsetPos>pImage->OffsetMax)
		{
			pImage->OffsetPos=0;
			pImage->OffsetMax=GetRndNum(30,120);
			pImage->OffsetMode=GetRndNum(1,3);
		}
		pImage->OffsetPos  ;
		switch (pImage->OffsetMode)
		{
		case 1:
			pImage->X--;
			break;
		case 2:
			pImage->X  ;
			break;
		}
	}
	m_SnowCount=m_SnowArray.GetCount();
	int nCount=m_AllCount-m_SnowCount;
	if(nCount>0 && nTop>20)
	{
		if(nCount>m_RowCount)
			nCount=m_RowCount;
		AddSnow(nCount);
	}
	ReDrawWindow();
}
int CSnowWindow::GetRndNum(int nMin,int nMax)
{
	int r=nMin   rand() % (nMax-nMin 1);
	return r;
}
// 虚函数 绘制窗口
void CSnowWindow::OnDrawWindow(Gdiplus::Graphics* pGraphics)
{
	for(int i=0;i<m_SnowCount;i  )
	{
		LPAnimationImage pImage=m_SnowArray[i];
		if(pImage->Angle>0)
		{
			int nNewWidth=0;
			int nNewHeight=0;
			Gdiplus::Image* pNewImage=MakeAngleImage(pImage,nNewWidth,nNewHeight);
			pGraphics->DrawImage(pNewImage,pImage->X,pImage->Y,nNewWidth,nNewHeight);
			delete pNewImage;
		}else{
			
			pGraphics->DrawImage(pImage->pImage,pImage->X,pImage->Y,pImage->Width,pImage->Height);
		}
		
	}
}
//旋转图片
Gdiplus::Image* CSnowWindow::MakeAngleImage(LPAnimationImage pImage,int& nNewWidth,int& nNewHeight)
{
	double Width=(double)pImage->Width;//原图尺寸
	double Height=(double)pImage->Height;//原图尺寸
	double fAngle=(double)pImage->Angle;//旋转角度
	double pi=3.1415926535f;
	double AngleSin=sin(double(fAngle*pi/180.0f));
	double AngleCos=cos(fAngle*pi/180.0f);
	nNewWidth=(INT)(abs(Height*AngleSin) abs(Width*AngleCos));//计算转换的图像的宽度
	nNewHeight=(INT)(abs(Height*AngleCos) abs(Width*AngleSin));//计算转换的图像的高度
	Gdiplus::Image* pNewImage=new Gdiplus::Bitmap(nNewWidth,nNewHeight,PixelFormat32bppARGB);

	Matrix matrix;
	//matrix.Translate(((float)nNewWidth - Width) / 2.0f, ((float)nNewHeight - Height) / 2.0f,MatrixOrderPrepend); // 偏移坐标,使新旧图像坐标中心中心重叠
	//matrix.Translate( Width / 2.0f, Height / 2.0f,MatrixOrderPrepend); // 偏移坐标,使旧图像左上角的点在新图像中心
	//matrix.Rotate(fAngle,MatrixOrderPrepend); // 旋转坐标
	//matrix.Translate( -(Width / 2.0f), -(Height / 2.0f),MatrixOrderPrepend); // 偏移坐标,使新旧图像坐标中心中心重新重叠
	PointF ptCenter(Width / 2.0f, Height / 2.0f);
	matrix.RotateAt(fAngle,ptCenter,MatrixOrderPrepend);

	Gdiplus::Graphics g(pNewImage);
	g.SetTransform(&matrix); // 应用设定矩阵

	g.DrawImage(pImage->pImage,0,0,pImage->Width,pImage->Height);

	//g.ResetTransform();    //将坐标系复位

	return pNewImage;
}
BEGIN_MESSAGE_MAP(CSnowWindow, CLayeredWnd)
ON_WM_TIMER()
END_MESSAGE_MAP()

void CSnowWindow::OnTimer(UINT_PTR nIDEvent)
{
	CLayeredWnd::OnTimer(nIDEvent);
	DownSnow();
}

标签: c++ c VC++ 桌面

实例下载地址

vc++ 非常好看的桌面下雪效果

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警