工控编程吧
标题:
152上位机VC MFC使用GDI+加载PNG图片实现下雪效果
[打印本页]
作者:
qq263946146
时间:
2016-1-8 21:31
标题:
152上位机VC MFC使用GDI+加载PNG图片实现下雪效果
(, 下载次数: 0)
上传
点击文件名下载附件
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>
功能代码过多,不一一列出,可下载例程源码学习
我们来演示实现的整个过程
[iqiyi]http://player.video.qiyi.com/3e9f4d0dd4bebf5d8c43d277b44fb085/0/0/w_19rtd9acq1.swf-albumId=5154507909-tvId=5154507909-isPurchase=0-cnId=12[/iqiyi]
(, 下载次数: 0)
上传
点击文件名下载附件
[note]1[/note]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4