VC 圣诞下雪源代码.docx
- 文档编号:4164840
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:12
- 大小:19.17KB
VC 圣诞下雪源代码.docx
《VC 圣诞下雪源代码.docx》由会员分享,可在线阅读,更多相关《VC 圣诞下雪源代码.docx(12页珍藏版)》请在冰豆网上搜索。
VC圣诞下雪源代码
VC
///.h
#pragmaonce
classHSnow
{
public:
HSnow(void);
~HSnow(void);
voidSnow();
public:
structHSnw{
intprex;
intprey;
intx;
inty;
COLORREFclr;
COLORREFpreclr;
intstepx;
intstepy;
};
voidInit(void);
private:
intnMaxSnow;
HSnw*snow;
intmaxW;//screenwidth
intmaxH;//screenheight
};
////dllmain
#include"stdafx.h"
BOOLAPIENTRYDllMain(HMODULEhModule,
DWORDul_reason_for_call,
LPVOIDlpReserved
)
{
switch(ul_reason_for_call)
{
caseDLL_PROCESS_ATTACH:
srand(UINT(0));break;
caseDLL_THREAD_ATTACH:
caseDLL_THREAD_DETACH:
caseDLL_PROCESS_DETACH:
break;
}
returnTRUE;
}
//////.cpp
#include"StdAfx.h"
#include"HSnow.h"
HSnow:
:
HSnow(void)
{
snow=NULL;
nMaxSnow=500;
}
HSnow:
:
~HSnow(void)
{
if(snow){
delete[]snow;
}
}
voidHSnow:
:
Init()
{
if(nMaxSnow<=0){return;}
if(snow){delete[]snow;snow=NULL;}
snow=newHSnw[nMaxSnow];
HDCdc=GetDC(0);
maxW=:
:
GetSystemMetrics(SM_CXSCREEN);
maxH=:
:
GetSystemMetrics(SM_CYSCREEN);
for(inti=0;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); } voidHSnow: : Snow(void) { if(nMaxSnow<=0){return;} HDCdc=GetDC(0); while(true) { if(GetAsyncKeyState(VK_CONTROL)&&GetAsyncKeyState(VK_F12)) { break;////按CTRL+F12结束 } for(inti=0;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;} ////设置积雪点 intsx=snow[i].x+rand()%3; intsy=snow[i].y+rand()%3; if(sx>maxW||sx<0||sy>maxH||sy<0){continue;} COLORREFsClr=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); } voidDRun(void) { HSnowsnow; snow.Init(); snow.Snow(); } ///.def EXPORTS DRun C# //新作一个,看看是否满足要求,可以修改下雪速度,大小等 publicpartialclassForm1: Form { privateRandomclsRandom=newRandom(); privateint[,]SnowParry=newint[1024,3]; privateintSnowNum=0; publicForm1() { InitializeComponent(); } privatevoidForm1_Load(objectsender,EventArgse) { SnowNum=clsRandom.Next(1024); intpx=clsRandom.Next(1024); intpy=clsRandom.Next(768); this.DoubleBuffered=true; for(inti=0;i { SnowParry[i,0]=px; SnowParry[i,1]=py; SnowParry[i,2]=clsRandom.Next(40); px=clsRandom.Next(1024); py=clsRandom.Next(768); } } privatevoidtimer1_Tick(objectsender,EventArgse) { for(inti=0;i { if(SnowParry[i,1]>768) { SnowParry[i,1]=0; } SnowParry[i,1]+=SnowParry[i,2]; } panel1.Invalidate(); } privatevoidpanel1_Paint(objectsender,PaintEventArgse) { GraphicsMyPaint=e.Graphics; Bitmapbm=newBitmap(5,5);//这里调整点的大小 bm.SetPixel(0,0,Color.White);//设置点的颜色 bm.SetPixel(0,1,Color.White); bm.SetPixel(1,0,Color.White); bm.SetPixel(1,1,Color.White); MyPaint.Clear(Color.Black); for(inti=0;i { MyPaint.DrawImageUnscaled(bm,SnowParry[i,0],SnowParry[i,1]); } } } VB PrivateDeclareFunctionGetDCLib"user32"(ByValhwndAsLong)AsLong'GetDC()功能是获取指定窗体的设备场景的句柄(hDC),用参数0则可以获取整个屏幕的场景句柄PrivateDeclareFunctionGetPixelLib"gdi32"(ByValhdcAsLong,ByValxAsLong,ByValyAsLong)AsLong'GetPixel用于取得场景(这里是整个屏幕)中某点的颜色值PrivateDeclareFunctionSetPixelLib"gdi32"(ByValhdcAsLong,ByValxAsLong,ByValyAsLong,ByValcrColorAsLong)AsLong'SetPixel用于设置场景(这里是整个屏幕)中某点的颜色值PrivateDeclareFunctionReleaseDCLib"user32"(ByValhwndAsLong,ByValhdcAsLong)AsLong'释放由GetDC()获取的设备场景句柄,否则可能造成系统锁死PrivateDeclareFunctionInvalidateRect&Lib"user32"(ByValhwndAsLong,lpRectAsRECT,ByValbEraseAsLong)'清理窗口雪花PrivateTypePOINTAPI'定义坐标点结构xAsLongyAsLongEndTypePrivateTypeRECT'定义“区域”数据结构,但实际上并没有用到,因为仅需在函数InvalidateRect中传递一个空的RECT参数leftAsLongtopAsLongrightAsLongbottomAsLongEndTypeDimrect1AsRECTPrivateConstScrnWidth=1024'屏幕宽度(单位: 像素)PrivateConstScrnHight=768'屏幕高度(单位: 像素)PrivateConstSnowCol=&HFEFFFE'雪花颜色PrivateConstSnowColDown=&HFFFFFF'积雪颜色PrivateConstSnowColDuck=&HFFDDDD'深色积雪颜色PrivateConstSnowNum=500'同一时间飘动的雪花数量DimhDC1AsLong'存储桌面窗口设备句柄DimpData(SnowNum)AsPOINTAPI'存储每个雪花的位置信息DimpColor(SnowNum)AsLong'存储画出雪花前屏幕原来的颜色DimVxAsInteger'雪花总体水平飘行速度DimVyAsInteger'雪花总体垂直下落速度DimPVxAsInteger'单个雪花实际水平飘行速度DimPVyAsInteger'单个雪花实际垂直飘行速度'初始化雪花位置PrivateSubInitP(iAsInteger)pData(i).x=Rnd()*ScrnWidthpData(i).y=Rnd()*2pColor(i)=GetPixel(hDC1,pData(i).x,pData(i).y)'取得屏幕原来的颜色值EndSub'取得某一点与周围点的对比度,确定是否在此位置堆积雪花PrivateFunctionGetContrast(iAsInteger)AsLongDimColorCmpAsLong'存储用作对比的点的颜色值DimtempRAsLong'存储CorlorCmp的红色部分,下同DimtempGAsLongDimtempBAsLongDimSlopeAsInteger'存储雪花飘落方向: Vx/Vy'计算雪花飘落方向IfPVy<>0ThenSlope=PVx/PVyElseSlope=2EndIf'根据雪花飘落方向决定取哪一点作对比点,'若PVx/PVy在-1到1之间,即Slope=0,就取正下面的象素点'若PVx/PVy>1,取右下方的点,PVx/PVy<-1则取左下方IfSlope=0ThenColorCmp=GetPixel(hDC1,pData(i).x,pData(i).y+1)ElseIfSlope>1ThenColorCmp=GetPixel(hDC1,pData(i).x+1,pData(i).y+1)ElseColorCmp=GetPixel(hDC1,pData(i).x-1,pData(i).y+1)EndIfEndIf'确定当前位置没有与另一个雪花重叠,否则返回0,用于防止由于不同雪花重叠造成雪花乱堆IfColorCmp=SnowColThenGetContrast=0ExitFunctionEndIf'分别获取ColorCmp与对比点的蓝、绿、红部分的差值tempB=Abs((ColorCmpAnd&HFF0000)-(pColor(i)And&HFF0000))/&H10000tempG=Abs((ColorCmpAnd&HFF00&)-(pColor(i)And&HFF00&))/&H100&tempR=Abs((ColorCmpAnd&HFF&)-(pColor(i)And&HFF&))'返回对比度值GetContrast=(tempR+tempG+tempB)/3EndFunction'画出一帧,即重画所有雪花位置一次PrivateSubDrawP()DimiAsIntegerFori=0ToSnowNum'防止雪花重叠造成干扰IfpColor(i)<>SnowColThen'还原上一个位置的颜色SetPixelhDC1,pData(i).x,pData(i).y,pColor(i)EndIf'设置新的位置,iMod3用于将雪花分为三类采用不同速度,以便形成层次感PVx=Rnd()*2-1+Vx*(iMod3)PVy=Vy*(iMod3+1)pData(i).x=pData(i).x+PVxpData(i).y=pData(i).y+PVy'取得新位置原始颜色值,用于下一步雪花飘过时恢复此处颜色pColor(i)=GetPixel(hDC1,pData(i).x,pData(i).y)'如果获取颜色失败,表明雪花已飘出屏幕,重新初始化IfpColor(i)=-1ThenInitPiElse'否则若雪花没有重叠IfpColor(i)<>SnowColThen'若对比度较小(即不能堆积),就画出雪花'Rnd()>0.3用于防止某些连续而明显的边界截获所有雪花IfRnd()>0.3OrGetContrast(i)<50ThenSetPixelhDC1,pData(i).x,pData(i).y,SnowCol'否则表明找到明显的边界,画出堆积的雪,并初始化以便画新的雪花ElseSetPixelhDC1,pData(i).x,pData(i).y-1,SnowColDuckSetPixelhDC1,pData(i).x-1,pData(i).y,SnowColDuckSetPixelhDC1,pData(i).x+1,pData(i).y,SnowColDownInitPiEndIfEndIfEndIfNextEndSubPrivateSubForm_Load()DimjAsIntegerMe.Caption="桌面飘雪"'设置窗口标题'设置计时器,Timer1用于画单帧,Timer2用于风向变化Timer1.Enabled=TrueTimer1.Interval=10Timer2.Enabled=TrueTimer2.Interval=2000Randomize'初始化随机数种子hDC1=GetDC(0)'获取桌面窗口设备场景句柄'初始化整个屏幕Forj=0ToSnowNumpData(j).x=Rnd()*ScrnWidthpData(j).y=Rnd()*ScrnHightpColor(j)=GetPixel(hDC1,pData(j).x,pData(j).y)NextEndSubPrivateSubForm_Unload(CancelAsInteger)ReleaseDC0,hDC1'释放桌面窗口设备句柄InvalidateRect0,rect1,0'清除所有雪花,恢复桌面EndSubPrivateSubTimer1_Timer()DrawP'画出一帧EndSubPrivateSubTimer2_Timer()'改变风向Vx=Rnd()*4-2Vy=Rnd()+2EndSub'完,最后,需要两个Timer: Timer1、Timer2 VB 是exe格式的那种桌面下雪的小程序怎么制作 [此问题的推荐答案] 用vb编程,知道是什么吧,然后在里面输代码: '源代码 PrivateDeclareFunctionGetDCLib"user32"(ByValhwndAsLong)AsLong 'GetDC()功能是获取指定窗体的设备场景的句柄(hDC),用参数0则可以获取整个屏幕的场景句柄 PrivateDeclareFunctionGetPixelLib"gdi32"(ByValhdcAsLong,ByValxAsLong,ByValyAsLong)AsLong 'GetPixel用于取得场景(这里是整个屏幕)中某点的颜色值 PrivateDeclareFunctionSetPixelLib"gdi32"(ByValhdcAsLong,ByValxAsLong,ByValyAsLong,ByValcrColorAsLong)AsLong 'SetPixel用于设置场景(这里是整个屏幕)中某点的颜色值 PrivateDeclareFunctionReleaseDCLib"user32"(ByValhwndAsLong,ByValhdcAsLong)AsLong '释放由GetDC()获取的设备场景句柄,否则可能造成系统锁死 PrivateDeclareFunctionInvalidateRect&Lib"user32"(ByValhwndAsLong,lpRectAsRECT,ByValbEraseAsLong) '清理窗口雪花 PrivateTypePOINTAPI'定义坐标点结构 xAsLong yAsLong EndType PrivateTypeRECT'定义“区域”数据结构,但实际上并没有用到,因为仅需在函数InvalidateRect中传递一个空的RECT参数 leftAsLong topAsLong rightAsLong bottomAsLong EndType Dimrect1AsRECT PrivateConstScrnWidth=1024'屏幕宽度(单位: 像素) PrivateConstScrnHight=768'屏幕高度(单位: 像素) PrivateConstSnowCol=&HFEFFFE'雪花颜色 PrivateConstSnowColDown=&HFFFFFF'积雪颜色 PrivateConstSnowColDuck=&HFFDDDD'深色积雪颜色 PrivateConstSnowNum=500'同一时间飘动的雪花数量 DimhDC1AsLong'存储桌面窗口设备句柄 DimpData(SnowNum)AsPOINTAPI'存储每个雪花的位置信息 DimpColor(SnowNum)AsLong'存储画出雪花前屏幕原来的颜色 DimVxAsInteger'雪花总体水平飘行速度 DimVyAsInteger'雪花总体垂直下落速度 DimPVxAsInteger'单个雪花实际水平飘行速度 DimPVyAsInteger'单个雪花实际垂直飘行速度 '初始化雪花位置 PrivateSubInitP(iAsInteger) pData(i).x=Rnd()*ScrnWidth pData(i).y=Rnd()*2 pColor(i)=GetPixel(hDC1,pData(i).x,pData(i).y)'取得屏幕原来的颜色值 EndSub '取得某一点与周围点的对比度,确定是否在此位置堆积雪花 PrivateFunctionGetContrast(iAsInteger)AsLong DimColorCm
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 圣诞下雪源代码 圣诞 下雪 源代码