|
大家好,小弟最近在WINCE上开发了一个俄罗斯方块,但运行到一段时间后,方块就不会下落了。经过DEBUG知道,其实程序还是正常运行的,只是图片不再更新了。我用的是bitblt函数去贴图,所以也申请了几个HDC,用完后也删除了。初步估计是这个HDC泄露,但不知道如何解决。
估计也是下面的函数出错:
void RefreshBrickClient(HDC hdc)
{
int i;
RECT brickClient;
RECT rcClient;
GetClientRect(g_hWnd,&rcClient);
HDC hdcBackGround=CreateCompatibleDC(hdc);
HBITMAP hbmBackGround=CreateCompatibleBitmap(hdc,rcClient.right,rcClient.bottom);
HBITMAP hbmOldBackGround=(HBITMAP)SelectObject(hdcBackGround,hbmBackGround);
BitBlt(hdcBackGround,0,0,rcClient.right,rcClient.right,hdc,0,0,SRCCOPY);
HDC hdcBackmap=CreateCompatibleDC(hdc);
BITMAP bm;
GetObject(g_hbmBrick,sizeof(bm),&bm);
HBITMAP hbmBackmap=CreateCompatibleBitmap(hdcBackmap,bm.bmWidth,bm.bmHeight);
HBITMAP hbmOldBackmap=(HBITMAP)SelectObject(hdcBackmap,hbmBackmap);
brickClient.top=brickClient.left=0;
brickClient.bottom=bm.bmHeight;
brickClient.right=bm.bmWidth;
FillRect(hdcBackmap, &brickClient, NULL);
HDC hdcWihtemap=CreateCompatibleDC(hdc);
HBITMAP hbmWihtemap=CreateCompatibleBitmap(hdcWihtemap,bm.bmWidth,bm.bmHeight);
HBITMAP hbmOldWihtemap=(HBITMAP)SelectObject(hdcWihtemap,hbmWihtemap);
FillRect(hdcWihtemap, &brickClient, (HBRUSH)GetStockObject(WHITE_BRUSH));
HDC hdcBrick=CreateCompatibleDC(hdc);
HBITMAP hbmBrick=(HBITMAP)SelectObject(hdcBrick,g_hbmBrick);
if(!BrickAtBottom)
for(i=0;i<4;i++)
{
if(LastPositionOfBrick.y!=-1)
{
BitBlt(hdcBackGround,LEFTMARGIN+bm.bmWidth*LastPositionOfBrick.x,
TOPMARGIN+bm.bmHeight*LastPositionOfBrick.y,bm.bmWidth,bm.bmHeight,hdcBackmap,0,0,SRCAND);
BitBlt(hdcBackGround,LEFTMARGIN+bm.bmWidth*LastPositionOfBrick.x,
TOPMARGIN+bm.bmHeight*LastPositionOfBrick.y,bm.bmWidth,bm.bmHeight,hdcWihtemap,0,0,SRCPAINT);
}
}
for(i=0;i<4;i++)//重绘正在下落的方块
{
if(CurrentBrick.y!=-1)BitBlt(hdcBackGround,LEFTMARGIN+bm.bmWidth*CurrentBrick.x,
TOPMARGIN+bm.bmHeight*CurrentBrick.y,bm.bmWidth,bm.bmHeight,hdcBrick,0,0,SRCAND);
}
BitBlt(hdc,0,0,rcClient.right,rcClient.bottom,hdcBackGround,0,0,SRCCOPY);
SelectObject(hdcBackGround,hbmOldBackGround);
DeleteDC(hdcBackGround);
SelectObject(hdcBackmap,hbmOldBackmap);
DeleteDC(hdcBackmap);
SelectObject(hdcWihtemap,hbmOldWihtemap);
DeleteDC(hdcWihtemap);
SelectObject(hdcBrick,hbmBrick);
DeleteDC(hdcBrick);
}
|
|