我想做一个坦克大战,在一个窗口里面bitblt多张图片,但是动的时候总是出现闪烁问题,我知道绘图时可以用双缓冲来解决闪烁问题,但是我现在用的全是位图。想请问下有没有办法解决这个问题。

解决方案 »

  1.   

    BOOL CTankView::Show()
    {

    for(int i=0;i<20;i++)
    {
    for(int j=0;j<20;j++)
    {
    CDC *pDC=GetDC();
    CBitmap m_bmp;
    if(show[j][i]==1)
    {
    m_bmp.LoadBitmap(IDB_BITMAP1);
    }
    else if(show[j][i]==2)
    {
    m_bmp.LoadBitmap(IDB_BITMAP2);
    }
    else if(show[j][i]==3)
    {
    m_bmp.LoadBitmap(IDB_BITMAP3);
    }
    else if(show[j][i]==4)
    {
    m_bmp.LoadBitmap(IDB_BITMAP4);
    }
    else if(show[j][i]==5)
    {
    m_bmp.LoadBitmap(IDB_BITMAP5);
    }
    else if(show[j][i]==6)
    {
    m_bmp.LoadBitmap(IDB_BITMAP6);
    }
    else if(show[j][i]==7)
    {
    m_bmp.LoadBitmap(IDB_BITMAP7);
    }
    else if(show[j][i]==8)
    {
    m_bmp.LoadBitmap(IDB_BITMAP8);
    }
    else if(show[j][i]==9)
    {
    m_bmp.LoadBitmap(IDB_BITMAP9);
    }
    else if(show[j][i]==10)
    {
    m_bmp.LoadBitmap(IDB_BITMAP10);
    }
    else 
    {
    m_bmp.LoadBitmap(IDB_BITMAP11);
    }

    BITMAP bm;
    m_bmp.GetObject(sizeof(BITMAP),&bm);
    CDC dcMem;
    dcMem.CreateCompatibleDC(pDC);
    CBitmap *oldBmp=dcMem.SelectObject(&m_bmp);
    pDC->BitBlt(j*bm.bmWidth,i*bm.bmHeight,bm.bmWidth,bm.bmHeight,&dcMem,0,0,SRCCOPY);
    dcMem.SelectObject(oldBmp);
    ReleaseDC(pDC);
    // MessageBox("afds");

    }
    }
    return true;
    }
      

  2.   

    void CTankView::tank()
    {
    switch (direction)
    {
    case 1:
    Tank[1]++;
    Tank[0]=10;
    break;
    case 2:
    Tank[2]++;
    Tank[0]=8;
    break;
    case 3:
    Tank[1]--;
    Tank[0]=9;
    break;
    case 4:
    Tank[2]--;
    Tank[0]=7;
    break;

    default:
    break;
    }
    Control();

    }
      

  3.   

    void CTankView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
    {
    // TODO: Add your message handler code here and/or call default
    switch(nChar)
    {
    case 87:direction=4;break;
    case 65:direction=3;break;
    case 83:direction=2;break;
    case 68:direction=1;break;
    }
    tank();
    CView::OnKeyDown(nChar, nRepCnt, nFlags);
    }void CTankView::Control()
    {
    for(int i=0;i<20;i++)
    {
    for(int j=0;j<20;j++)
    {
    show[i][j]=0;
    }
    }
    int x,y;
    x=Tank[1];
    y=Tank[2];
    show[x][y]=Tank[0];
    Show();

    }
      

  4.   

    2楼太狠了,哈哈
    屏蔽擦除背景函数,ERASE(false);
      

  5.   

    有个双缓冲类很不错的memdc.h,你去找找,顺便擦除背景重绘。
      

  6.   

    那个双缓存我也会做。。但是我不是绘图,我是直接用图片,好像bitmap只能选入一张图片,再选入的话就会被覆盖,所以那个双缓冲的代码行不通。。
      

  7.   

    http://hi.baidu.com/qiujiejia/blog/item/5e016f01587ed7c6267fb541.html