读书人

采用双缓冲时TextOut输出文字一段时

发布时间: 2012-05-21 18:04:41 作者: rapoo

采用双缓冲时,TextOut输出文字一段时间后自动消失问题?
最近做的一个游戏,用双缓冲加载图片,在内存中输入文字后显示出来,开始是正常的,但是每当游戏进行到一分钟左右时,界面的所有文字都消失了,且弹出的对话框也会看不见,就算不操作也是这种情况,多次测试后会在一分钟左右时出现,不知道是什么情况啊?图像显示都正常,就是文字自动消失了,如果是重绘的话,为什么会在运行一段时间后才发生呢?

C/C++ code
DWORD WINAPI sendmsg(LPVOID msg)//双缓冲显示进程{        int i;    HDC hdc=GetDC(hwnd);    HDC memDC = CreateCompatibleDC(hdc); //让缓冲DC兼容窗口DC        HBITMAP hBitmapbeijing = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BG1));//载入位图    HBITMAP wplane=LoadBitmap(hInst,MAKEINTRESOURCE(IDB_WPLANE));//载入位图    HBITMAP dplane1=LoadBitmap(hInst,MAKEINTRESOURCE(IDB_DPLANE1));//载入位图    HBITMAP dplane2=LoadBitmap(hInst,MAKEINTRESOURCE(IDB_DPLANE2));//载入位图    HBITMAP dplane3=LoadBitmap(hInst,MAKEINTRESOURCE(IDB_DPLANE3));//载入位图    HBITMAP dboss3=LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BOSS3));//载入位图    HBITMAP beijing01=LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BEIJING01));//载入位图    HBITMAP beijing02=LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BEIJING02));//载入位图    HBITMAP xingkong=LoadBitmap(hInst,MAKEINTRESOURCE(IDB_XINGKONG));//载入位图    HBITMAP wzidan = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_WZIDAN));//载入位图    HBITMAP dzidan = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_DZIDAN));//载入位图    HBITMAP bom = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BOM));//载入位图    HBITMAP baozha1 = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BAOZHA1));//载入位图    HBITMAP baozha2 = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BAOZHA2));//载入位图    HBITMAP baozha3 = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BAOZHA3));//载入位图        daodan.daodanmap=bom;    //初始化飞机模型    {        s->wplanemap=wplane;        s->cunhuo=true;        s->zidan.zidanmap=wzidan;    }        for (i=0;i<ENEMYNUMBER;i++)//初始化敌机位置    {        int y=myrand();        dplane[i].dplanemap=dplane1;        dplane[i].cunhuo=true;        dplane[i].baozha=false;        dplane[i].x=(190+i*88)%600+190;        dplane[i].y=y;        if (dplane[i].x>=512)        {            dplane[i].fangxiang=true;        }        else dplane[i].fangxiang=false;        y+=35;    }    for (i=0;i<ENEMYNUMBER;i++)    {        for (int j=0;j<ENEMYNUMBER;j++)        {            if(CheckDplanePosition( dplane[i],dplane[j]))                            {                dplane[j].x+=35;            }        }    }        HDC memDC2=CreateCompatibleDC(hdc);//单次绘图DC    HBITMAP memBitmap=CreateCompatibleBitmap(hdc,1024,768);//创建兼容位图DC        HBITMAP hOldbitmap;//保存老DC,创建新DC选入内存位图对象    hOldbitmap=(HBITMAP)SelectObject(memDC,memBitmap);    while(true)    {            static DWORD oldtime;        gamestatus=0;        static short num=0;        static int flag=0;        static bool bomflag=false;        if (flag>=768)        {            flag=0;        }        if (num>384)        {            num=385;        }        Sleep(13);        if (num==385)        {            gamestatus=1;        }        if(gamestatus==1)//检测游戏是否处于开始状态        {            if (GetTickCount()>=oldtime+600 && bomflag)            {                for (int i=0;i<ENEMYNUMBER;i++)                {                    dplane[i].dplanemap=baozha1;                }                for (i=0;i<ENEMYNUMBER;i++)                {                    dplane[i].cunhuo=false;                }            }            if (GetTickCount()>=oldtime+800 && bomflag)            {                for (i=0;i<ENEMYNUMBER;i++)                {                    dplane[i].dplanemap=baozha2;                }                for (i=0;i<ENEMYNUMBER;i++)                {                    dplane[i].cunhuo=false;                }            }            if (GetTickCount()>=oldtime+1000 && bomflag)            {                for (i=0;i<ENEMYNUMBER;i++)                {                    dplane[i].dplanemap=baozha3;                }                for (i=0;i<ENEMYNUMBER;i++)                {                    dplane[i].cunhuo=false;                    jifen+=1;                }                bomflag=false;            }            if (daodan.flag)//检测导弹有效状态            {                int x=s->x+19;                int y=s->y-50;                daodan.x=x;                daodan.y=y;                oldtime=GetTickCount();                bomflag=true;                daodan.flag=false;                }            if (s->cunhuo==false)//检测玩家有效            {                static DWORD oldtime1=GetTickCount();                wanjia--;                s->x=500;                s->y=700;                if ((GetTickCount()>=oldtime1+300)&&(s->cunhuo==true))                {                    s->wplanemap=wplane;                }                s->cunhuo=true;                            }            //下方代码绘制背景            HBITMAP laji1=(HBITMAP)SelectObject(memDC2,hBitmapbeijing);//为临时DC选入位图            BitBlt (memDC,0,0,1024,768,memDC2,0,0,SRCCOPY );//把临时DC图像贴入缓存DC            SelectObject((HDC)laji1,memBitmap);            //背景星空1            HBITMAP laji2=(HBITMAP)SelectObject(memDC2,xingkong);//继续为临时DC选入位图            BitBlt (memDC,190,flag,780,768,memDC2,0,0,SRCCOPY );//把临时DC图像贴入缓存DC            SelectObject((HDC)laji2,memBitmap);                //背景星空2            HBITMAP laji3=(HBITMAP)SelectObject(memDC2,xingkong);//继续为临时DC选入位图            BitBlt (memDC,190,flag-768,780,768,memDC2,0,0,SRCCOPY );//把临时DC图像贴入缓存DC            SelectObject((HDC)laji2,memBitmap);                //玩家位置            laji2=(HBITMAP)SelectObject(memDC2,s->wplanemap);//继续为临时DC选入位图            BitBlt (memDC,s->x,s->y,66,66,memDC2,0,0,SRCPAINT );//把临时DC图像贴入缓存DC            SelectObject((HDC)laji2,memBitmap);            //敌机位置            for (int i=0;i<ENEMYNUMBER;i++)            {                            laji2=(HBITMAP)SelectObject(memDC2,dplane[i].dplanemap);//继续为临时DC选入位图                BitBlt (memDC,dplane[i].x,dplane[i].y,66,66,memDC2,0,0,SRCPAINT );//把临时DC图像贴入缓存DC                SelectObject((HDC)laji2,memBitmap);                            }            //导弹位置            if (GetTickCount()<oldtime+1000)            {                laji2=(HBITMAP)SelectObject(memDC2,daodan.daodanmap);//为临时DC选入位图                BitBlt (memDC,daodan.x,daodan.y,14,36,memDC2,0,0,SRCCOPY );//把临时DC图像贴入缓存DC                SelectObject((HDC)laji1,memBitmap);            }            //检测我子弹            if (s->zidan.cunhuo==true&&s->zidan.flag)            {                laji2=(HBITMAP)SelectObject(memDC2,s->zidan.zidanmap);//为临时DC选入位图                BitBlt (memDC,s->zidan.x,s->zidan.y,28,23,memDC2,0,0,SRCCOPY );//把临时DC图像贴入缓存DC                SelectObject((HDC)laji1,memBitmap);            }            //检测敌子弹            for (i=0;i<ENEMYNUMBER;i++)            {                if (dplane[i].zidan.cunhuo==true)                {                    laji2=(HBITMAP)SelectObject(memDC2,dplane[i].zidan.zidanmap);//为临时DC选入位图                    BitBlt (memDC,dplane[i].zidan.x,dplane[i].zidan.y,8,8,memDC2,0,0,SRCCOPY );//把临时DC图像贴入缓存DC                    SelectObject((HDC)laji1,memBitmap);                }            }                    }                if(num<=384)        {            //游戏开始拉开屏幕画面            HBITMAP laji1=(HBITMAP)SelectObject(memDC2,hBitmapbeijing);//为临时DC选入位图            BitBlt (memDC,0,0,1024,768,memDC2,0,0,SRCCOPY );//把临时DC图像贴入缓存DC            SelectObject((HDC)laji1,memBitmap);                        HBITMAP laji2=(HBITMAP)SelectObject(memDC2,beijing01);//继续为临时DC选入位图            BitBlt (memDC,190,-num,780,384,memDC2,0,0,SRCCOPY );//把临时DC图像贴入缓存DC            SelectObject((HDC)laji2,memBitmap);                            laji2=(HBITMAP)SelectObject(memDC2,beijing02);//继续为临时DC选入位图            BitBlt (memDC,190,num+378,780,384,memDC2,0,0,SRCCOPY );//把临时DC图像贴入缓存DC            SelectObject((HDC)laji2,memBitmap);            }                {            DrawJifen(memDC,210,30);            DrawZhuozhe(memDC,850,520);            if (jifen>=60)            {                gamestatus=2;                wanjia=0;                DrawGameOver(memDC,439,200);                s->wplanemap=NULL;                for (i=0;i<ENEMYNUMBER;i++)                {                    dplane[i].dplanemap=NULL;                    dplane[i].zidan.zidanmap=NULL;                }            }        }        //此处代码将处理还的图像绘制到屏幕        {            BitBlt(hdc,0,0,1024,768,memDC,0,0,SRCCOPY );            SelectObject((HDC)hOldbitmap,memBitmap);            }                {            num+=5;            flag++;            daodan.y-=5;            ////////////////////////////////////////////////////////////////            if (gamestatus==1)//游戏进行标识            {//敌机处理                for (i=0;i<ENEMYNUMBER;i++)                {                    if (dplane[i].cunhuo==true)                    {                            if (dplane[i].y>50 && !dplane[i].zidan.cunhuo)                        {                            dplane[i].zidan.cunhuo=true;                            dplane[i].zidan.x=dplane[i].x+12;                            dplane[i].zidan.y=dplane[i].y+35;                            dplane[i].zidan.fangxiang=dplane[i].fangxiang;                            dplane[i].zidan.zidanmap=dzidan;                        }                                                                if (dplane[i].fangxiang==true)                        {                            dplane[i].x--;                            dplane[i].y+=2+i%4;                        }                        if (dplane[i].fangxiang==false)                        {                            dplane[i].x++;                            dplane[i].y+=2+i%4;                        }                        if (dplane[i].x>812 || dplane[i].y>768 || dplane[i].x<180)                        {                            dplane[i].cunhuo=false;                        }                    }                    else if (dplane[i].cunhuo==false)                    {                        int y=myrand();                        dplane[i].dplanemap=dplane1;                        dplane[i].cunhuo=true;                        dplane[i].x=(190+i*88)%600+190;                        dplane[i].y=y;                        dplane[i].zidan.cunhuo=false;                    }                                        }            }            /////////////////////////////////////////////////////////////////////////            if (gamestatus==1)//游戏进行标识            {// 敌机子弹处理                for (i=0;i<ENEMYNUMBER;i++)                {                    if (dplane[i].zidan.cunhuo==true)                    {                            if (dplane[i].zidan.fangxiang==true)                        {                            dplane[i].zidan.x-=2;                            dplane[i].zidan.y+=4+i%4;                        }                        if (dplane[i].zidan.fangxiang==false)                        {                            dplane[i].zidan.x+=2;                            dplane[i].zidan.y+=4+i%4;                        }                        if (dplane[i].zidan.x>812 || dplane[i].zidan.y>768 || dplane[i].zidan.x<180)                        {                            dplane[i].zidan.cunhuo=false;                        }                    }//                     if(!CheckDplaneZidanWplanePosition(dplane[i],s))//                     {//                         s->cunhuo=false;//                         s->wplanemap=baozha1;//                     }                    /////////////////////////////////////////////////////////////////////////////                    if (gamestatus==1)                    {                            if (s->zidan.cunhuo==true)                            {                                s->zidan.y-=3;                                if (s->zidan.y<0)                                {                                    s->zidan.cunhuo=false;                                    s->zidan.flag=false;                                }                                for (i=0;i<ENEMYNUMBER;i++)                                {                                    if(CheckDplaneZidanWplanePosition(dplane[i],s))                                    {                                        dplane[i].cunhuo=false;                                        dplane[i].dplanemap=baozha1;                                    }                                }                            }                    }                            }            }            ///////////////////////////////////////////////////////////////        }        SendMessage(hwnd, WM_PAINT ,NULL,NULL);            }    return 0;}void DrawJifen(HDC hdc,int x,int y){    char temp[100];    char str[100];    HFONT hNewFont = (HFONT)CreateFont(30,0,0,0,0,0,0,0,GB2312_CHARSET,0,0,0,0,TEXT("方正舒体"));    SetTextColor(hdc,RGB(255,0,200));    SetBkMode(hdc, TRANSPARENT);    SelectObject(hdc, hNewFont);    wsprintf(temp, "游戏积分: %d",jifen);    TextOut(hdc,x,y,temp,strlen(temp));    wsprintf(str, "玩家数量: %d",wanjia);    TextOut(hdc,200,700,str,strlen(str));    } 



[解决办法]
检查是否资源泄漏的办法之一:
在任务管理器 进程 查看 选择列 里面选择:内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象
让你的程序(进程)不退出,循环执行主流程很多遍,越多越好,比如1000000次甚至无限循环,记录以上各数值,再隔至少一小时,越长越好,比如一个月,再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加,则铁定有对应资源的资源泄漏!

[解决办法]
探讨

检查是否资源泄漏的办法之一:
在任务管理器 进程 查看 选择列 里面选择:内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象
让你的程序(进程)不退出,循环执行主流程很多遍,越多越好,比如1000000次甚至无限循环,记录以上各数值,再隔至少一小时,越长越好,比如一个月,再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加,则铁定有对应资源的资源泄漏!

读书人网 >C++

热点推荐