回 帖 发 新 帖 刷新版面

主题:[原创]仿骇客帝国数据精流

#include<windows.h>
#include<stdlib.h>
#include<time.h>

#define ID_TIMER1 1
#define ID_TIMER2 2

LRESULT CALLBACK Winproc(HWND,UINT,WPARAM,LPARAM);

int cxChar,cyChar;
COLORREF color[] = {RGB(176,251,255),RGB(147,250,255),RGB(117,249,255),RGB(89,247,255),RGB(47,244,255),RGB(11,243,255),RGB(0,216,227),RGB(0,186,196),RGB(0,153,162),RGB(0,139,147),RGB(0,115,121),RGB(0,95,100)};



int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
    static HWND hwnd;
    TCHAR szAppName[] = TEXT("HK");
    MSG msg;
    WNDCLASS wc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
    wc.hCursor = NULL;
    wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
    wc.hInstance = hInstance;
    wc.lpszClassName = szAppName;
    wc.lpfnWndProc = Winproc;
    wc.lpszMenuName = NULL;
    wc.style = CS_VREDRAW | CS_HREDRAW;

    if(!RegisterClass(&wc))
    {
        MessageBox(NULL,TEXT("注册失败"),TEXT("警告框"),MB_OK);
        return 0;
    }

    hwnd = CreateWindow(szAppName,TEXT("矩阵数据流"),
                        WS_OVERLAPPEDWINDOW,
                        CW_USEDEFAULT,CW_USEDEFAULT,
                        CW_USEDEFAULT,CW_USEDEFAULT,
                        NULL,NULL,hInstance,NULL);

    ShowWindow(hwnd,SW_MAXIMIZE);
    UpdateWindow(hwnd);

    while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

LRESULT CALLBACK Winproc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)
{
    int x,y;
    static int *p;
    static int value,i;
    static int cyScreen,cxScreen;
    static int iLine=-1;
    static TCHAR szBuffer[1];
    static HDC hdc;
    static SYSTEMTIME st;

    switch(message)
    {
    case WM_CREATE:
        hdc = GetDC(hwnd);
        SetBkColor (hdc, 0) ;
        cxChar = LOWORD(GetDialogBaseUnits());
        cyChar = HIWORD(GetDialogBaseUnits());
    
        SetTimer(hwnd,ID_TIMER1,50,NULL);
    
        SetTimer(hwnd,ID_TIMER2,60,NULL);
        
        return 0;

    case WM_SIZE:
        
        cyScreen = HIWORD(lparam);
        cxScreen = LOWORD(lparam);
        if(p) delete []p;
        p = new int[(int)(cxScreen/cxChar)];
        for(x=0; x<(int)(cxScreen/cxChar); x++)
            *(p+x) = rand()%100;
        return 0;

    case WM_TIMER:
        switch(wparam)
        {
            case ID_TIMER1:
                if(value>=10) value=0;
                value++;            
             break;

            case ID_TIMER2:
                
                if(iLine>=260)
                { 
                    iLine =0;
                    srand((unsigned)time(0));
                    for(x=0; x<(int)(cxScreen/cxChar); x++)
                        *(p+x) = rand()%100;
                }
                iLine++;
            for(x=0; x<=(int)(cxScreen/cxChar);x++)

                for(y=0; y<=((int)(iLine-*(p+x))); y++)

                {
               
                 SetTextColor(hdc,color[(((iLine-*(p+x)-y)>107)?11:(iLine-*(p+x)-y))%12]);
                 TextOut(hdc, x*cxChar, y*cyChar, szBuffer,wsprintf(szBuffer, TEXT("%i"),(rand()+value)%10));
                }

                break;

        }
             return 0;

        case WM_DESTROY:
            delete []p;
            ReleaseDC(hwnd,hdc);
            KillTimer(hwnd,1);
            KillTimer(hwnd,2);
            PostQuitMessage(0);
            return 0;
    }
return DefWindowProc(hwnd,message,wparam,lparam);
}

回复列表 (共19个回复)

沙发

怎么像下雨一样啊!


不错,有感觉-----不过,“帝国”的数据流中好象充斥着许多的日文...

板凳

if(p) delete []p;

这个if(p) 是多余的

直接delete就ok了

3 楼

[quote]if(p)&nbsp;delete&nbsp;[]p;

这个if(p)&nbsp;是多余的

直接delete就ok了[/quote]

一定不是多余的,楼上的再仔细想想

4 楼

C++ 标准里已经规定了

如果 p的值是0
那么 delete p; 则什么也不作

所以说
delete指针前
对指针值的检测是多余的

只有写的不好的C++教材
或者古老的C++教材才会教你在delete之前检测一个指针

5 楼

我看的几本书都特别说明了:如果是NULL指针,则什么也不做。

6 楼

晕菜,楼上的看来不知道windows编程的特点.我来讲讲:
当第一次建立窗口的时候,会产生一个WM_SIZE消息,此时p指针是空指针,
这句似乎是多余的,但当以后每一次你改变窗口的大小时候,又会产生一个WM_SIZE消息,这时候如果不加if(p) delete []p ,则第一次建立窗口时候开辟的动态数组就会
不被释放....后果是什么我想大家学程序的不说也知道.

7 楼

cool~

8 楼

[quote]
if(p) delete []p ,则第一次建立窗口时候开辟的动态数组就会
[/quote]


就是说,若频繁的最大最小化窗口,你的程序就会不断进行的申请和释放内存操作!!


(你能不能用静态的存储改变这一点?)


我以上的理解有误么?

9 楼

晕死,在VC中调试没反应

10 楼

我说的是

if(p) delete[]p;

可以直接写成

delete []p;

而不需要现判断是否为空

我来回复

您尚未登录,请登录后再回复。点此登录或注册