///.h
#pragma once
class HSnow
{
public:
HSnow(void);
~HSnow(void);
void Snow();
public:
struct HSnw{
int prex;
int prey;
int x;
int y;
COLORREF clr;
COLORREF preclr;
int stepx;
int stepy;
};
void Init(void) ;
private:
int nMaxSnow;
HSnw* snow;
int maxW; //screen width
int maxH; //screen height
};
//// dllmain
#include "stdafx.h"
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
srand( UINT(0) ); break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
//////.cpp
#include "StdAfx.h"
#include "HSnow.h"
HSnow::HSnow(void)
{
snow = NULL;
nMaxSnow = 500;
}
HSnow::~HSnow(void)
{
if( snow ){
delete [] snow;
}
}
void HSnow::Init()
{
if( nMaxSnow <= 0 ) { return ;}
if( snow ) { delete [] snow; snow = NULL;}
snow = new HSnw[nMaxSnow];
HDC dc = GetDC(0);
maxW = ::GetSystemMetrics( SM_CXSCREEN );
maxH = ::GetSystemMetrics( SM_CYSCREEN );
for( int i = 0; i < nMaxSnow; i++ ){
snow[i].x = snow[i].prex = rand() % maxW;
snow[i].y = snow[i].prey = rand() % maxH;
snow[i].preclr = snow[i].clr = ::GetPixel( dc,snow[i].x,snow[i].y );
snow[i].stepx = (rand()%2==1)?1:-1;
snow[i].stepy = (rand() % 5)+1;
}
::ReleaseDC(0,dc);
}
void HSnow::Snow(void)
{
if( nMaxSnow <= 0 ){ return; }
HDC dc = GetDC(0);
while( true )
{
if(GetAsyncKeyState(VK_CONTROL) && GetAsyncKeyState(VK_F12 ))
{
break; ////按CTRL+F12 结束
}
for( int i = 0; i<nMaxSnow; i++ )
{
SetPixel( dc, snow[i].prex,snow[i].prey, snow[i].preclr );
snow[i].prex = snow[i].x ;
snow[i].prey = snow[i].y ;
snow[i].preclr = snow[i].clr ;
snow[i].x += snow[i].stepx ;
snow[i].y += snow[i].stepy ;
if( snow[i].x < 0 ) { snow[i].x = maxW ; }
if( snow[i].x >maxW){ snow[i].x = 0 ; }
if( snow[i].y < 0 ) { snow[i].y = maxH ; }
if( snow[i].y >maxH){ snow[i].y = 0 ; }
snow[i].clr = GetPixel( dc, snow[i].x, snow[i].y ) ;
if( 0xffffff - snow[i].clr < 5000 ){ continue; } ///和白色相近就忽略
SetPixel( dc, snow[i].x, snow[i].y , 0xffffff ); ////设置雪点
if( rand()%4 != 1 ){ continue; }
////设置积雪点
int sx = snow[i].x + rand()%3;
int sy = snow[i].y + rand()%3;
if( sx>maxW || sx<0 || sy>maxH || sy<0 ){ continue; }
COLORREF sClr = GetPixel(dc,sx,sy);
if( abs(0xffffff-sClr)<5000 || abs( snow[i].clr - sClr ) > 600000 ) //如果颜色相差太大就设置积雪点
{
SetPixel(dc,sx,sy,0xffffff);
}
}
Sleep(1);
}
::ReleaseDC(0,dc);
::InvalidateRect(0,0,1);
}
void DRun(void)
{
HSnow snow;
snow.Init();
snow.Snow();
}
///.def
EXPORTS
DRun
弄好了,这是写的DLL,不是可执行,要用RUNDLL32来运行
Rundll32 HSnow.dll,DRun
呵呵,终于看出来这样的效果,激动啊
本文介绍了一段使用MFC编写的DLL代码,实现了屏幕下雪的视觉效果。通过创建雪花结构体,定义了雪花的位置、颜色和移动方向。在DLL的主函数中,使用GetDC获取屏幕设备上下文,不断更新雪花位置并绘制,最终达到动态下雪的效果。用户可以通过按CTRL+F12组合键结束程序。
1709

被折叠的 条评论
为什么被折叠?



