QQ登录

只需一步,快速开始

152上位机VC MFC使用GDI+加载PNG图片实现下雪效果

[ 复制链接 ]

其中InitImage();函数为加载PNG雪花图片,AddSnow()为当前显示在窗口的雪花图片初始化,我们再添加定时器处 ...

其中InitImage();函数为加载PNG雪花图片,AddSnow()为当前显示在窗口的雪花图片初始化,我们再添加定时器处 ...
152上位机VC MFC使用GDI+加载PNG图片实现下雪效果
功能展示
前面几个例程我们利用GDI+ 实现了许多关于图片的效果,我们当前例程利用GDI+加载PNG图片,实现桌面下雪的特效,效果如图;
要点提示
通过微软的GDI+能够快速轻松实现 对图片各种操作;
GDI+使用前,得下载微软的GDIPLUS支持包,可从微软的管网下载,我们这里给大家进行了打包;
然后是添加头文件再进行简单的初始化操作,在CWinApp派生类的InitInstance函数中进行此项工作是最好的;
当前例程使用了函数UpdateLayeredWindow()使用窗口透明化,窗口透明得具有WS_EX_LAYERED(0x80000)属性
实现功能
1.新建基于对话框的应用程序
2.使用前准备GDI+:将例程根目录Include文件夹复制到自己工程根目录。
在StdAfx.h头文件包含GDI+ 头文件及库文件//使用GDI+第一步
#define UNICODE
#ifndef ULONG_PTR
#define ULONG_PTR unsigned long*
#endif
#include "Include/gdiplus.h"
using namespace Gdiplus;
#pragma comment(lib, "Include/gdiplus.lib")
在APP类的InitInstance()中进行初始化
//使用GDI+第二步
  GdiplusStartupInputgdiplusStartupInput;  ULONG_PTR           gdiplusToken;
  GdiplusStartup(&gdiplusToken,&gdiplusStartupInput, NULL);
在程序退出时 进行GDI+ 环境的关闭
//使用GDI+第三步   GdiplusShutdown(gdiplusToken); //关闭gdiplus的环境
3,准备好GDI+后,便是使用GDI+ 实现我们想要的功能:
准备雪花图片放入工程根目录res下;自定义结构体
  1. typedef struct tagAnimationImage
  2. {
  3.         Gdiplus::Image* pImage;
  4.         int X;                                //图片的X坐标
  5.         int Y;                                //图片的Y坐标
  6.         int Width;                        //图片显示高度
  7.         int Height;                        //图片显示宽度
  8.         int Angle;                        //旋转角度
  9.         bool firstInit;                //是否初步初始化,用于在初次初始化时设定该雪花是往左走还是往右走还是直线下落
  10.         int OffsetMode;                //图片的行走方式,向左、向右、向下三种
  11. } AnimationImage, *PAnimationImage,*LPAnimationImage;
复制代码
  1. 再添加变量
  2.         functionpointer UpdateLayeredWindow;//窗口透明函数;
  3.         int m_nWidth;//雪花所在窗口的宽
  4.         int m_nHeight;//雪花所在窗口的高
  5.         CArray<LPAnimationImage,LPAnimationImage> m_ImageArray;//图片数组
  6.         
  7.         void AddResImg(CString sName,int nAngle);
  8.         int m_RowCount;//每行图片数量
  9.         int m_AllCount;//可显示图片总数
  10.         CArray<LPAnimationImage,LPAnimationImage> m_SnowArray;//雪花图片数组
  11. 最后在OnInitDialog()初始化,在OnDestroy()中释放
  12.         m_nWidth = GetSystemMetrics (SM_CXSCREEN);
  13.         m_nHeight =  GetSystemMetrics (SM_CYSCREEN);
  14.         InitImage();//加载图片
  15. //><窗口透明属性
  16.         DWORD dwExStyle=GetWindowLong(m_hWnd,GWL_EXSTYLE);
  17.         SetWindowLong(m_hWnd,GWL_EXSTYLE,dwExStyle|0x80000);
  18.         ModifyStyle(WS_CAPTION,0,0);//去除边框
  19.         SetWindowPos(&wndNoTopMost,0,0,m_nWidth,m_nHeight,SWP_NOACTIVATE);//窗口最大化
  20.         HMODULE h = LoadLibrary("User32.DLL");
  21.         UpdateLayeredWindow = (functionpointer)GetProcAddress(h, "UpdateLayeredWindow");
  22.         SetTimer(1,100,NULL);
  23.         
复制代码
  1. void CGkbc8Dlg::OnDestroy()
  2. {
  3.         CDialog::OnDestroy();
  4. //><
  5.         int nCount;
  6.         nCount=m_ImageArray.GetSize();
  7.         for(int i=0;i<nCount;i++)
  8.         {
  9.                 LPAnimationImage pImage=m_ImageArray.GetAt(i);
  10.                 delete pImage;
  11.         }
  12.         m_ImageArray.RemoveAll();

  13.         //
  14.         nCount=m_SnowArray.GetSize();
  15.         for(i=0;i<nCount;i++)
  16.         {
  17.                 LPAnimationImage pImage=m_SnowArray.GetAt(i);
  18.                 delete pImage;
  19.         }
  20.         m_SnowArray.RemoveAll();
  21. }
复制代码
其中InitImage();函数为加载PNG雪花图片,AddSnow()为当前显示在窗口的雪花图片初始化,我们再添加定时器处理函数调用DownSnow();实现雪花下称效果; DownSnow()函数内部过多, 所以它还调用了函数ReDrawWindow();函数ReDrawWindow();以调用 了OnDrawWindow(&g);函数
在计算旋转时会用到些三角函数,所以得添加其所以头文件#include <Afxtempl.h>
#include<math.h>
功能代码过多,不一一列出,可下载例程源码学习
我们来演示实现的整个过程
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:152.上位机VC MFC使用GDI 加载PNG图片实现下雪效果.rar 
文件大小:985.35 KB  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我

  

您的支持是我们创作的动力!  

  

您可花点闲钱积分自助任意充值

  

成为VIP会员 全站资源任意下载永久更新!


回复

使用道具 举报

快速回复 返回列表 客服中心 搜索