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