返回顶部

收藏

屏幕下雪程序

更多

一个窗口程序,使屏幕下满星星点点的雪花。

#include <windows.h> 
#include <time.h>             
const int ScrnWidth=1024; 
const int ScrnHight=768; 
const long SnowCol =0xFEFFFE; 
const long SnowColDown =0xFFFFFF; 
const long SnowColDuck =0xFFDDDD; 
const int SnowNum = 500; 
const int ID_TIMER = 1; 

const char g_szClassName[] = "myWindowClass"; 

typedef struct POINTAPI 
{ 
    long x; 
    long y; 
}a; 

static HDC hDC1; 
static struct POINTAPI pData[500]; 
static long pColor[500]; 
static int Vx,Vy,PVx,PVy,timecont; 

long Abs(long num) 
{ 
    if(num>=0)return(num); 
    else return(-num); 
} 

int Random(int max) 
{ 
    return(rand()%max); 
} 

int InitP(int i) 
{ 
    pData[i].x=Random(ScrnWidth); 
    pData[i].y = Random(5); 
    pColor[i] = GetPixel(hDC1, pData[i].x, pData[i].y); 
    return 0;
} 

long GetContrast(int i) 
{ 
    long ColorCmp; 
    long tempR; 
    long tempG; 
    long tempB; 
    int Slope; 

    if(PVy!=0) Slope = PVx / PVy; 
    else Slope = 2; 

    if(Slope==0) ColorCmp = GetPixel(hDC1, pData[i].x, pData[i].y + 1); 
    else if(Slope > 1) ColorCmp = GetPixel(hDC1, pData[i].x + 1, pData[i].y + 1); 
    else ColorCmp = GetPixel(hDC1, pData[i].x - 1, pData[i].y + 1); 

    if(ColorCmp==SnowCol)return 0; 

    tempB = Abs((ColorCmp>>16)&0xff - (pColor[i]>>16)&0xff); 
    tempG = Abs((ColorCmp>>8)&0xff - (pColor[i]>>8)&0xff); 
    tempR = Abs((ColorCmp)&0xff - (pColor[i])&0xff); 

    //return(tempR * 0.114 + tempG * 0.587 + tempB * 0.299); 
    return((tempR + tempG + tempB) / 3); 
} 

void DrawP(void) 
{ 
    int i; 
    // srand(time(0)); 
    for(i=0;i<SnowNum;i++) 
    { 
        if(pColor[i]!=SnowCol&&pColor[i]!=-1)SetPixel(hDC1, pData[i].x, pData[i].y, pColor[i]); 

        PVx = Random(2) - 1 + Vx * (i % 3); 
        PVy = Vy * (i % 3 + 1); 
        pData[i].x = pData[i].x + PVx; 
        pData[i].y = pData[i].y + PVy; 
        pColor[i] = GetPixel(hDC1, pData[i].x, pData[i].y); 

        if(pColor[i] ==-1)InitP(i); 
        else
            if(pColor[i]!=SnowCol) 
                if (Random(16) > 5 || GetContrast(i) < 50)SetPixel(hDC1, pData[i].x, pData[i].y, SnowCol); 
                else
                { 
                    SetPixel(hDC1, pData[i].x, pData[i].y - 1, SnowColDuck); 
                    SetPixel(hDC1, pData[i].x - 1, pData[i].y, SnowColDuck); 
                    SetPixel(hDC1, pData[i].x + 1, pData[i].y, SnowColDown); 
                    InitP(i); 
                } }}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{    
    switch(msg) 
    { 
    case WM_TIMER:
        { 
            if(timecont>200) 
            { 
                timecont=0; 
                Vx = Random(4) - 2; 
                Vy = Random(2) + 2; 
            } 
            else timecont+=1; 
            DrawP(); 
        } 
        break; 
    case WM_CREATE: 
        { 
            int j; 
            srand(time(0)); 
            Vx = Random(4) - 2; 
            Vy = Random(2) + 2; 
            for(j = 0;j<SnowNum;j++) 
            { 
                pData[j].x = Random(ScrnWidth); 
                pData[j].y = Random(ScrnHight); 
                pColor[j] = GetPixel(hDC1, pData[j].x, pData[j].y); 
            } 
            SetTimer(hwnd, ID_TIMER, 10, NULL); 
            hDC1 = GetDC(0); 
            timecont=0; 
        } 
        break; 
    case WM_CLOSE: 
        ReleaseDC(0, hDC1); 
        DestroyWindow(hwnd); 
        break; 
    case WM_DESTROY: 
        KillTimer(hwnd, ID_TIMER); 
        PostQuitMessage(0); 
        break; 
    default: 
        return DefWindowProc(hwnd, msg, wParam, lParam); 
    } 
    return 0; 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
                   LPSTR lpCmdLine, int nCmdShow) 
{ 
    WNDCLASSEX wc; 
    HWND hwnd; 
    MSG msg; 

    wc.cbSize = sizeof(WNDCLASSEX); 
    wc.style = 0; 
    wc.lpfnWndProc = WndProc; 
    wc.cbClsExtra = 0; 
    wc.cbWndExtra = 0; 
    wc.hInstance = hInstance; 
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); 
    wc.hCursor = LoadCursor(NULL, IDC_ARROW); 
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); 
    wc.lpszMenuName = NULL; 
    wc.lpszClassName = g_szClassName; 
    wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); 

    if(!RegisterClassEx(&wc)) 
    { 
        MessageBox(NULL, "窗体注册失败!", "错误!outofmemory.cn 
            MB_ICONEXCLAMATION | MB_OK); 
        return 0; 
    } 

    hwnd = CreateWindowEx( 
        WS_EX_CLIENTEDGE, 
        g_szClassName, 
        "desktop snowing...... ", 
        WS_OVERLAPPEDWINDOW, 
        CW_USEDEFAULT, CW_USEDEFAULT, 240, 120, 
        NULL, NULL, hInstance, NULL); 

    if(hwnd == NULL) 
    { 
        MessageBox(NULL, "窗体创建失败!", "错误!outofmemory.cn 
            MB_ICONEXCLAMATION | MB_OK); 
        return 0; 
    } 

    ShowWindow(hwnd, nCmdShow); 
    UpdateWindow(hwnd); 

    while(GetMessage(&msg, NULL, 0, 0) > 0) 
    { 
        TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    } 
    return msg.wParam; 
}
//该片段来自于http://outofmemory.cn

标签:c++,图形

收藏

0人收藏

支持

0

反对

0

发表评论