繼續上個版本修改了一些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++的味道。
有點簡單,用陳坤的話說就是擴展性不好。