你应该在界面只更新移动的那个区域  所以用InvalidRect擦除指定区域不要用Invalidate()擦除整个区域

解决方案 »

  1.   

    void CTetrisView::DrawImage2(CBin *bin, unsigned char **image, CDC *pDC)
    {
    unsigned int width,i,j;
    unsigned int height;
    width = bin2->getWidth();//获得宽度
    height = bin2->getHeight();//获得高度
    int nSize = 20;//砖块大小
    //////////////  双缓冲   ///////////
    CRect rect;
    GetClientRect(&rect);
    pDC->FillSolidRect(400,rect.top,rect.bottom,rect.right,RGB(255,255,255));//绘制背景色 pDC->Rectangle(400,0,600,400);
    char buf[100];
    sprintf(buf,"分数:%d",numLines2*10);
    pDC->TextOut(620,20,buf);
    pDC->TextOut(620,60,"操作说明:");
    pDC->TextOut(670,90,"左移:←");
    pDC->TextOut(670,110,"右移:→");
    pDC->TextOut(670,130,"下移:↓");
    pDC->TextOut(670,150,"旋转:↑");
    ////////////////////////////////////
    CRect rc;
    COLORREF BrickColor[8] = {0xFFFFFF, 0xFF0000, 0x00FF00, 0x0000FF, 
    0x00FFFF, 0xFFFF00, 0x800000, 0x800080};//砖块颜色
    //////////////// 2 /////////////////
    for (i = 0; i < height; ++i)//一行一行的画砖块
    {
    for (j = 0; j < width; ++j)
    {
    rc = CRect(j*nSize+400, i*nSize, (j+1)*nSize+400, (i+1)*nSize);
    //绘制面板
    if (0 != image[i][j])
    {
    pDC->FillRect(rc, &CBrush(BrickColor[image[i][j]]));//画临时砖块(运动中)
    pDC->Draw3dRect(rc,GetLightColor(BrickColor[image[i][j]]),GetDarkColor(BrickColor[image[i][j]]));
    }
    }
    }
    ////////////////////////////////////
    }这样的话  每次都是全部画上的