签到

06月20日
尚未签到

共有回帖数 0

    晚街听风

    等级:
    用的是C语言,编译用的是DEV CPP。
    是模仿国外一个人编写的一个叫做snow的程序,雪花可以在窗体、图像边缘堆积。
    先贴上效果图��

    //代码开始:(原谅没有注释,因为我原来是用VB写的,然后直接改写成C语言,要注释到:http://post.baidu.com/f?kz=253376021,参照VB版的注释)

    #include windows.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.x=Random(ScrnWidth);
    pData.y = Random(5);
    pColor = GetPixel(hDC1, pData.x, pData.y);
    }

    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.x, pData.y + 1);
    else if(Slope  1) ColorCmp = GetPixel(hDC1, pData.x + 1, pData.y + 1);
    else ColorCmp = GetPixel(hDC1, pData.x - 1, pData.y + 1);

    if(ColorCmp==SnowCol)return 0;

    tempB = Abs((ColorCmp16)&0xff - (pColor16)&0xff);
    tempG = Abs((ColorCmp8)&0xff - (pColor8)&0xff);
    tempR = Abs((ColorCmp)&0xff - (pColor)&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;iSnowNum;i++)
    {
    if(pColor!=SnowCol&&pColor!=-1)SetPixel(hDC1, pData.x, pData.y, pColor);

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

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

    LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
    switch(msg)
    {
    case WM_TIMER: //时钟
    {
    if(timecont200)
    {
    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;jSnowNum;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, "窗体注册失败!", "错误!",
    MB_ICONEXCLAMATION | MB_OK);
    return 0;
    }

    hwnd = CreateWindowEx(
    WS_EX_CLIENTEDGE,
    g_szClassName,
    "屏幕飘雪",
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
    NULL, NULL, hInstance, NULL);

    if(hwnd == NULL)
    {
    MessageBox(NULL, "窗体创建失败!", "错误!",
    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;
    }

    //完毕
    对不,我代码里有一个小错误(也能通过编译):typedef struct POINTAPI,定义struct不是这样定义的。很长时间没用C语言,有些生疏了。另外,实际上这个POINTAPI不用定义,好像在windows.h里已经有了一个POINT的结构体��

    楼主 2016-01-08 10:34 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知