用GDI绘制动画,可是没有任何显示,请大家看看以下程序问题所在,谢谢?

时间:2022-12-06 19:22:17
以下程序在一个对话框中显示一个人在走动,为避免闪烁,用了双缓冲,可是程序运行后没有任何的显示,也没有错误提示。请大家看看问题所在,谢谢。  
 
 
**********************************************************************************  
 
HBITMAP  bit;//存放内存中的位图  
HBITMAP  bitBuffer;//存放兼容性位图  
HDC          MemDC;//绘制小图片的内存DC  
HDC          BackDC;//绘制背景图片的内存DC  
HDC          BackBuffer;//背景缓冲  
CRect  ClientRect;  
******************************************  
 
BOOL  CGameStudyDlg::OnInitDialog()  
{  
           CDialog::OnInitDialog();  
 
           //  Set  the  icon  for  this  dialog.    The  framework  does  this  automatically  
           //    when  the  application's  main  window  is  not  a  dialog  
           SetIcon(m_hIcon,  TRUE);                                    //  Set  big  icon  
           SetIcon(m_hIcon,  FALSE);                        //  Set  small  icon  
             
           //  TODO:  Add  extra  initialization  here  
           GetClientRect(ClientRect);  
             
           MemDC=CreateCompatibleDC(0);  
           BackDC=CreateCompatibleDC(0);  
           BackBuffer=CreateCompatibleDC(0);  
           bitBuffer=CreateCompatibleBitmap(0,ClientRect.Width(),ClientRect.Height());  
               SelectObject(BackBuffer,bitBuffer);  
 
           dir="pictures/";  
           p=39;  
           posX=200;  
           posY=30;  
           TimerEvent=0;  
           cc=dir+"earth.bmp";  
           if(LoadBmp(cc)==FALSE)  
           {  
                       MessageBox(cc+"can't  be  found!","Error");  
                       return  FALSE;  
           }  
           SelectObject(BackDC,bit);  
           return  TRUE;    //  return  TRUE    unless  you  set  the  focus  to  a  control  
}  
 
*******************************************************************************************  
 
void  CGameStudyDlg::OnTimer(UINT  nIDEvent)    
{  
           //  TODO:  Add  your  message  handler  code  here  and/or  call  default  
           if(p<49)                                                          //确定取第几张小图片  
                       p++;                                                  //      
           else                                                                  //    
                       p=40;                                                //    
           if(posY>=ClientRect.Height()/2)            //  
                       p=0;                                                  //  
             
           cc.Format("%shuman/c%03d.bmp",dir,p);  
           CClientDC  dc(this);  
           BitBlt(BackBuffer,0,0,ClientRect.Width(),ClientRect.Height(),BackDC,0,0,SRCCOPY);//Draw  background  
           if(LoadBmp(cc)==false)  
           {  
                       AfxMessageBox(cc+"can't  be  found!");  
                       return;  
           }  
           SelectObject(MemDC,bit);  
           TransparentBlt(BackBuffer,posX,posY,w,h,MemDC,0,0,w,h,RGB(255,255,255));//Draw  the  walking  man  
           BitBlt(dc.m_hDC,0,0,ClientRect.Width(),ClientRect.Height(),BackBuffer,0,0,SRCCOPY);  
           if(posY<ClientRect.Height()/2)  
                       posY+=2;  
             
           CDialog::OnTimer(nIDEvent);  
}  
*****************************************************************************************************  
void  CGameStudyDlg::OnOK()    
{  
             
               TimerEvent=SetTimer(1,150,0);  
           GetDlgItem(IDOK)->EnableWindow(false);  
           //CDialog::OnOK();  
}  

12 个解决方案

#1


CDC* pDC = this->GetDC();
CDC* pMemDC = pDC->CreateCompatibleDC( );
CBitmap bmp;
bmp.CreateCompatibleBitmap( pDC, cx, cy );
pMemDC->SelectObject( &bmp );
pMemDc->Draw(.....);
pDC->Bitblt( 0, 0, cx, cy, pMemDC, 0, 0);
pMemDC->DeleteObject();
ReleaseDC( pdC );

#2


创建的DC不是根据dialog创建的,所以几个DC直接没有任何关系.
因此要先个getdc,然后根据这个dc创建memdc,backDC,  BackBuffer, bitBuffer,在函数结束前记得releasedc.

好像不需要这么多,只要三个dc就好了,一个load新图,一个保存背景,一个放合成的.也可以只要两个,合成的memdc可以用的时候在onpaint里面临时创建

#3


上面的程序到底问题出现在哪里呢?为什么会没有图象显示出来?

#4


--变量定义乱七八糟的。

先检查一下ClientRect是否宽度,高度是0.

GetClientRect(&ClientRect); ??

#5


GetClientRect(ClientRect);这一句没有问题。

#6


MemDC=CreateCompatibleDC(0);  
           BackDC=CreateCompatibleDC(0);  
           BackBuffer=CreateCompatibleDC(0);  
           bitBuffer=CreateCompatibleBitmap(0,ClientRect.Width(),ClientRect.Height());  

用0做參數是什麽意思?你應該
HDC dc = ::GetDC(m_hWnd);
MemDC=CreateCompatibleDC(dc);  
           BackDC=CreateCompatibleDC(dc);  
           BackBuffer=CreateCompatibleDC(dc);  
           bitBuffer=CreateCompatibleBitmap(dc,ClientRect.Width(),ClientRect.Height());

#7


是呀,楼上的兄弟说的对,创建兼容DC你总得告诉人家操作系统要建立一个跟谁兼容的DC吧!呵呵。

#8


CreateCompatibleDC

The CreateCompatibleDC function creates a memory device context (DC) compatible with the specified device. 

HDC CreateCompatibleDC(
  HDC hdc   // handle to DC
);

Parameters
hdc 
[in] Handle to an existing DC. If this handle is NULL, the function creates a memory DC compatible with the application's current screen.
以上的解释来自MSDN2002。

#9


创建兼容Bitmap时,第一个参数CDC指针不能为NULL。

#10


创建兼容Bitmap时,第一个参数CDC指针不能为NULL。
***********************************************

可是编译时没有错误提示啊!

#11


确实是没有编译错误。
反正我自己建立内存位图时,如果CDC指针为NULL,就画不出来

#12


帮你UP

#1


CDC* pDC = this->GetDC();
CDC* pMemDC = pDC->CreateCompatibleDC( );
CBitmap bmp;
bmp.CreateCompatibleBitmap( pDC, cx, cy );
pMemDC->SelectObject( &bmp );
pMemDc->Draw(.....);
pDC->Bitblt( 0, 0, cx, cy, pMemDC, 0, 0);
pMemDC->DeleteObject();
ReleaseDC( pdC );

#2


创建的DC不是根据dialog创建的,所以几个DC直接没有任何关系.
因此要先个getdc,然后根据这个dc创建memdc,backDC,  BackBuffer, bitBuffer,在函数结束前记得releasedc.

好像不需要这么多,只要三个dc就好了,一个load新图,一个保存背景,一个放合成的.也可以只要两个,合成的memdc可以用的时候在onpaint里面临时创建

#3


上面的程序到底问题出现在哪里呢?为什么会没有图象显示出来?

#4


--变量定义乱七八糟的。

先检查一下ClientRect是否宽度,高度是0.

GetClientRect(&ClientRect); ??

#5


GetClientRect(ClientRect);这一句没有问题。

#6


MemDC=CreateCompatibleDC(0);  
           BackDC=CreateCompatibleDC(0);  
           BackBuffer=CreateCompatibleDC(0);  
           bitBuffer=CreateCompatibleBitmap(0,ClientRect.Width(),ClientRect.Height());  

用0做參數是什麽意思?你應該
HDC dc = ::GetDC(m_hWnd);
MemDC=CreateCompatibleDC(dc);  
           BackDC=CreateCompatibleDC(dc);  
           BackBuffer=CreateCompatibleDC(dc);  
           bitBuffer=CreateCompatibleBitmap(dc,ClientRect.Width(),ClientRect.Height());

#7


是呀,楼上的兄弟说的对,创建兼容DC你总得告诉人家操作系统要建立一个跟谁兼容的DC吧!呵呵。

#8


CreateCompatibleDC

The CreateCompatibleDC function creates a memory device context (DC) compatible with the specified device. 

HDC CreateCompatibleDC(
  HDC hdc   // handle to DC
);

Parameters
hdc 
[in] Handle to an existing DC. If this handle is NULL, the function creates a memory DC compatible with the application's current screen.
以上的解释来自MSDN2002。

#9


创建兼容Bitmap时,第一个参数CDC指针不能为NULL。

#10


创建兼容Bitmap时,第一个参数CDC指针不能为NULL。
***********************************************

可是编译时没有错误提示啊!

#11


确实是没有编译错误。
反正我自己建立内存位图时,如果CDC指针为NULL,就画不出来

#12


帮你UP