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