实例介绍
【实例简介】非常好看的桌面下雪效果
================================================================================
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 中进行编辑的资源。您应该将不可由资源编辑器编辑的所有资源放在此文件中。
【实例截图】
【核心代码】
#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();
}
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论