签到

06月21日
尚未签到

共有回帖数 0

    奈何情殇

    等级:
    纯C WINSDK
    在XP SP3下编译通过,贴上代码
    -------------------------------------------------------------------
    #include "windows.h"

    #pragma comment(lib,"user32.lib")
    #pragma comment(lib,"gdi32.lib")

    const int Matrix_Width=300;
    const int Matrix_Height=200;

    typedef struct _MATRIX_COLUMN
    {
        BOOL     bActive;
        int         nCounter;
        int         nCounterMax;
        char     prev;
    }MATRIX_COLUMN,*PMATRIX_COLUMN;

    #define GET_RANDOM(min,max) ((rand()%(int)(((max)+1)-(min)))+(min))

    LPCTSTR         szClassName="Matrix";
    HDC             hMemDC=NULL;
    HBITMAP         hMemBitmap=NULL;
    HGDIOBJ         pBitmapOld=NULL;
    HGDIOBJ         pFontOld=NULL;
    HFONT           hFont=NULL;
    int             nTextWidth,nTextHeight;
    int             nCols,nRows;
    int             nActiveColumns=0;
    PMATRIX_COLUMN pMatrixColumns=NULL;

    void Matrix_OnCreate(HWND hwnd)
    {
        HDC   hdc;
        RECT rcClient;
        SetWindowLong(hwnd,GWL_STYLE,GetWindowLong(hwnd,GWL_STYLE) & ~WS_MAXIMIZEBOX & ~WS_THICKFRAME);
        hdc=GetDC(hwnd);
        if(hdc)
        {
            hMemDC=CreateCompatibleDC(hdc);
            if(hMemDC)
            {
                TEXTMETRIC tm;

                hFont=CreateFont(14,0,0,0,FW_BOLD,FALSE, FALSE, 0, ANSI_CHARSET,OUT_DEFAULT_PRECIS,
                    CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS, "Courier");
                hMemBitmap=CreateCompatibleBitmap(hdc,Matrix_Width,Matrix_Height);
                pBitmapOld=SelectObject(hMemDC,hMemBitmap);
                pFontOld=SelectObject(hMemDC,hFont);
                GetTextMetrics(hMemDC,&tm);
                nTextWidth=tm.tmAveCharWidth+8;
        nTextHeight= tm.tmHeight;
                nCols=Matrix_Width/nTextWidth+1;
                nRows=Matrix_Height/nTextHeight+1;
                pMatrixColumns=(PMATRIX_COLUMN)malloc(sizeof(MATRIX_COLUMN)*nCols);
                if(pMatrixColumns) RtlZeroMemory(pMatrixColumns,sizeof(MATRIX_COLUMN)*nCols);
                SetTimer(hwnd,1,80,NULL);
            }
            ReleaseDC(hwnd,hdc);
        }
        GetClientRect(hwnd,&rcClient);
        InvalidateRect(hwnd,&rcClient,FALSE);
    }

    void Matrix_OnPaint(HWND hwnd)
    {
        if(pBitmapOld)
        {
            PAINTSTRUCT ps;
            HDC          hdc;
            hdc=BeginPaint(hwnd,&ps);
            BitBlt(hdc,0,0,Matrix_Width,Matrix_Height,hMemDC,0,0,SRCCOPY);
            EndPaint(hwnd,&ps);
        }
    }

    void Matrix_InitBackgroundCharacters(int col)
    {
        const int bottomOffset = 3;

        pMatrixColumns[col].nCounter = 0;
        if(GET_RANDOM(1,2) == 1)
            pMatrixColumns[col].nCounter=GET_RANDOM(0,nRows-bottomOffset);
        pMatrixColumns[col].nCounterMax=nRows;
        if(GET_RANDOM(1,2)==1)
        {
            pMatrixColumns[col].nCounterMax=pMatrixColumns[col].nCounter+GET_RANDOM(bottomOffset,nRows-pMatrixColumns[col].nCounter);
            if(pMatrixColumns[col].nCounterMax  nRows)
                pMatrixColumns[col].nCounterMax=nRows;
        }
        pMatrixColumns[col].prev=(GET_RANDOM(1,5)==1?' ':GET_RANDOM('a', 'z'));
    }

    void Matrix_DrawActiveString(HDC hdc,int row,int col,char* str,int len,COLORREF     color)
    {
        if (len  0)
        {
            SIZE size;
            RECT r;
           
            GetTextExtentPoint32(hdc,str,len,&size);

        r.left=col*nTextWidth,r.top=row*nTextHeight;
            r.right=(col+len)*nTextWidth,r.bottom=(row+1)*nTextHeight;
            if(len  1)
                r.right=r.left+size.cx;
            if(len == 1 && str[0]==0x01)
            {
                SetBkColor(hdc,color);
                ExtTextOut(hdc,0,0,ETO_OPAQUE,&r,NULL,0,NULL);
            }
            else
            {
                SetBkColor(hdc,RGB(0,0,0));
                ExtTextOut(hdc,0,0,ETO_OPAQUE,&r,NULL,0,NULL);
                SetTextColor(hdc,color);
                TextOut(hdc,col*nTextWidth + (len1?0:(nTextWidth - size.cx)/2),row * nTextHeight,str,len);
            }
        }
    }

    void Matrix_DrawActiveBackgroundChar(int col)
    {
        if (pMatrixColumns[col].prev != ' ')
            pMatrixColumns[col].prev=GET_RANDOM('a', 'z');
        Matrix_DrawActiveString(hMemDC,pMatrixColumns[col].nCounter,col,&pMatrixColumns[col].prev,1,RGB(0,210,0));
    }

    void Matrix_DrawFadedBackgroundChar(int col)
    {
        int   row=pMatrixColumns[col].nCounter-1;
        SIZE size;

        GetTextExtentPoint32(hMemDC,&pMatrixColumns[col].prev,1,&size);
        SetTextColor(hMemDC,RGB(0,GET_RANDOM(60,100),0));
        TextOut(hMemDC,col * nTextWidth+(nTextWidth - size.cx)/2,row * nTextHeight,&pMatrixColumns[col].prev,1);
    }

    void Matrix_UpdateBackground()
    {
        int i;
        if(nActiveColumns  nCols)
        {
            int nStartColumn,nSafetyCounter = 0;
            do
            {
                nStartColumn = rand()%nCols;
                nSafetyCounter++;
                if(nSafetyCounter  nCols)
                    break;
           }
            while(pMatrixColumns[nStartColumn].bActive);
            if (!pMatrixColumns[nStartColumn].bActive)
            {
                pMatrixColumns[nStartColumn].bActive = TRUE;
                Matrix_InitBackgroundCharacters(nStartColumn);
                Matrix_DrawActiveBackgroundChar(nStartColumn);
                pMatrixColumns[nStartColumn].nCounter++;
                nActiveColumns++;
            }
        }
        for(i=0;inCols;i++)
        {
            if (pMatrixColumns.bActive && pMatrixColumns.nCounter = pMatrixColumns.nCounterMax)
            {
                Matrix_DrawFadedBackgroundChar(i);
                pMatrixColumns.bActive = FALSE;
                nActiveColumns--;
            }
            else if (pMatrixColumns.bActive)
            {
                Matrix_DrawFadedBackgroundChar(i);
                Matrix_DrawActiveBackgroundChar(i);
                pMatrixColumns.nCounter++;
            }
        }
    }

    void Matrix_OnTimer(HWND hwnd,UINT nEvent)
    {
        switch(nEvent)
        {
        case 1:
            if(pMatrixColumns)
            {
                RECT r;
                Matrix_UpdateBackground();
                GetClientRect(hwnd,&r);
                InvalidateRect(hwnd,&r,FALSE);
            }
            break;
        }
    }

    void Matrix_OnClose(HWND hwnd)
    {
        PostQuitMessage(0);



       //
        // 销毁GDI资源
        if(pBitmapOld)
            SelectObject(hMemDC,pBitmapOld);
        if(pBitmapOld)
            SelectObject(hMemDC,pFontOld);
        if(hMemDC)
            DeleteDC(hMemDC);
        if(pMatrixColumns)
            free(pMatrixColumns);
    }

    LRESULT CALLBACK MatrixWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
    {
        switch(message)
        {
        case WM_CREATE:
            Matrix_OnCreate(hwnd);
            break;
        case WM_PAINT:
            Matrix_OnPaint(hwnd);
            break;
        case WM_TIMER:
            Matrix_OnTimer(hwnd,(UINT)wParam);
            break;
        case WM_ERASEBKGND:
            return TRUE;
        case WM_CLOSE:
            Matrix_OnClose(hwnd);
            break;
        }
        return DefWindowProc(hwnd, message, wParam, lParam);
    }

    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
    {
        WNDCLASSEX wcex;
        HWND        hwnd;
        MSG         message;

        wcex.cbSize          = sizeof(WNDCLASSEX);
        wcex.style           = CS_HREDRAW | CS_VREDRAW;
        wcex.lpfnWndProc     = (WNDPROC)MatrixWndProc;
        wcex.cbClsExtra         = 0;
        wcex.cbWndExtra         = 0;
        wcex.hInstance         = hInstance;
        wcex.hIcon             =
        wcex.hCursor         = NULL;
        wcex.hbrBackground     = GetStockObject(BLACK_BRUSH);
        wcex.lpszMenuName     = NULL;
        wcex.lpszClassName     = szClassName;
        wcex.hIconSm         = NULL;

        srand((unsigned int)time(NULL));
        RegisterClassEx(&wcex);
        hwnd=CreateWindow(szClassName,szClassName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,Matrix_Width,Matrix_Height,NULL,NULL,hInstance,NULL);
        ShowWindow(hwnd,SW_SHOW);
        while(GetMessage(&message,NULL,0,0))
        {
            TranslateMessage(&message);
            DispatchMessage(&message);
        }
        return 0;
    }

    楼主 2015-12-18 13:34 回复

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

登录直线网账号

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