VC MFC 屏幕画图 桌面下雪效果 源码 圣诞礼物

本文介绍了一段使用MFC编写的DLL代码,实现了屏幕下雪的视觉效果。通过创建雪花结构体,定义了雪花的位置、颜色和移动方向。在DLL的主函数中,使用GetDC获取屏幕设备上下文,不断更新雪花位置并绘制,最终达到动态下雪的效果。用户可以通过按CTRL+F12组合键结束程序。

///.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
呵呵,终于看出来这样的效果,激动啊

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值