其中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下;自定义结构体 - typedef struct tagAnimationImage
- {
- Gdiplus::Image* pImage;
- int X; //图片的X坐标
- int Y; //图片的Y坐标
- int Width; //图片显示高度
- int Height; //图片显示宽度
- int Angle; //旋转角度
- bool firstInit; //是否初步初始化,用于在初次初始化时设定该雪花是往左走还是往右走还是直线下落
- int OffsetMode; //图片的行走方式,向左、向右、向下三种
- } AnimationImage, *PAnimationImage,*LPAnimationImage;
复制代码- 再添加变量
- functionpointer UpdateLayeredWindow;//窗口透明函数;
- int m_nWidth;//雪花所在窗口的宽
- int m_nHeight;//雪花所在窗口的高
- CArray<LPAnimationImage,LPAnimationImage> m_ImageArray;//图片数组
-
- void AddResImg(CString sName,int nAngle);
- int m_RowCount;//每行图片数量
- int m_AllCount;//可显示图片总数
- CArray<LPAnimationImage,LPAnimationImage> m_SnowArray;//雪花图片数组
- 最后在OnInitDialog()初始化,在OnDestroy()中释放
- m_nWidth = GetSystemMetrics (SM_CXSCREEN);
- m_nHeight = GetSystemMetrics (SM_CYSCREEN);
- InitImage();//加载图片
- //><窗口透明属性
- DWORD dwExStyle=GetWindowLong(m_hWnd,GWL_EXSTYLE);
- SetWindowLong(m_hWnd,GWL_EXSTYLE,dwExStyle|0x80000);
- ModifyStyle(WS_CAPTION,0,0);//去除边框
- SetWindowPos(&wndNoTopMost,0,0,m_nWidth,m_nHeight,SWP_NOACTIVATE);//窗口最大化
- HMODULE h = LoadLibrary("User32.DLL");
- UpdateLayeredWindow = (functionpointer)GetProcAddress(h, "UpdateLayeredWindow");
- SetTimer(1,100,NULL);
-
复制代码- void CGkbc8Dlg::OnDestroy()
- {
- CDialog::OnDestroy();
- //><
- int nCount;
- nCount=m_ImageArray.GetSize();
- for(int i=0;i<nCount;i++)
- {
- LPAnimationImage pImage=m_ImageArray.GetAt(i);
- delete pImage;
- }
- m_ImageArray.RemoveAll();
- //
- nCount=m_SnowArray.GetSize();
- for(i=0;i<nCount;i++)
- {
- LPAnimationImage pImage=m_SnowArray.GetAt(i);
- delete pImage;
- }
- m_SnowArray.RemoveAll();
- }
复制代码其中InitImage();函数为加载PNG雪花图片,AddSnow()为当前显示在窗口的雪花图片初始化,我们再添加定时器处理函数调用DownSnow();实现雪花下称效果; DownSnow()函数内部过多, 所以它还调用了函数ReDrawWindow();函数ReDrawWindow();以调用 了OnDrawWindow(&g);函数 在计算旋转时会用到些三角函数,所以得添加其所以头文件#include <Afxtempl.h> #include<math.h> 功能代码过多,不一一列出,可下载例程源码学习 我们来演示实现的整个过程
|