继续上个版本修改了一些bug,然后美化了一下。

发现自己的审美观不咋的,俺觉得漂亮的人家觉得不漂亮。还是照着大家要求的画一个。

主要解决的问题是,这次行列都用宏表示,这样可以修改行列,窗口大小也动态改变。

另外长条旋转变成Z型问题也解决,主要是取模的时候绕回去了。

其中最重要的要算是解决了刷新闪烁问题,尽管HAM2008指点过,始终没做成,这次vczh说了一句话就点醒了我。根本不应该使用InvalidateRect函数,直接画,然后用缓冲DC就可以了。

VOID OnPaint()
{
    HDC hdc 
= GetDC(hWnd);
    HDC bitmap_dc 
= CreateCompatibleDC(hdc);
    HBITMAP bitmap 
= CreateCompatibleBitmap(hdc,1024,768);
    SelectObject(bitmap_dc,bitmap);
    
   
/********************************************
   DrawBlock
   ********************************************
*/

   
int x = tetris.GetX();
   
int y = tetris.GetY();

   
for(int i=0; i<4++i)
   
{
       
for(int j=0; j<4++j)
       
{
           
if(current_block[i][j] == 1)
           
{
               DrawBlock(bitmap_dc,y
+i+1,x+j+1,3,3,tetris.GetColor(),RGB(0,0,0));
           }

       }

   }


   
/*****************************************
   *DrawContainer
   *****************************************
*/

   
for(int i=0; i<ROWS; ++i)
   
{
       
for(int j=0; j<COLS; ++j)
       
{
           
if(Container[i][j] == 1)
           
{
               DrawBlock(bitmap_dc,i
+1,j+1,3,3,ColorTable[i][j],RGB(0,0,0));
           }

       }

   }


   BitBlt(hdc,
0,0,1024,768,bitmap_dc,0,0,SRCCOPY);
   DeleteDC(bitmap_dc);
   DeleteObject(bitmap);
   ReleaseDC(hWnd,hdc);
}

以上就是GDI缓冲的主要实现代码。


可执行文件下载
代码还是等全部完善后上传吧。Redist请自行下载。
代码估计要有大的改动,感觉现在的代码没一点C++的味道。
有点简单,用陈坤的话说就是扩展性不好。