|
发表于 2004-9-28 13:50:00
|
显示全部楼层
Re:窗口模式的苦恼.
我在用dx做窗口模式时,也遇到了问题。按理说一个surface创建完成之后,他在内存或者显存中所占的空间就应该是一定的。但为什么我观察内存时却发现他是不断增加的。下面是我得程序:
// -----------------------------------------------------------------------
void RefreshWindow(IDirectDrawSurface7* pdd,IDirectDrawSurface7* pdds)
{
RECT hRect;
hRect.top = 105;
hRect.left = 125;
hRect.right = SCREEN_WIDTH+235;
hRect.bottom = SCREEN_HEIGHT+195;
hr = pdd->BltFast(125, 105,pdds,&hRect,DDBLTFAST_SRCCOLORKEY);
}
// -----------------------------------------------------------------------
int Put(LPCSTR szBitmap,IDirectDrawSurface7* pdd,int startX,int endY,int decX,int decY,int x,int y,int dx,int dy)
{
HDC hdcImage;
HDC hdc;
BITMAP bm;
hOurBitmap = (HBITMAP)LoadImage(GetModuleHandle(NULL), szBitmap,IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
if (hOurBitmap == NULL)
return 0;
hdcImage = CreateCompatibleDC(NULL);
if (!hdcImage) return 0;
SelectObject(hdcImage, hOurBitmap);
GetObject(hOurBitmap, sizeof(bm), &bm);
dx = dx == 0 ? bm.bmWidth : dx; // Use the passed size, unless zero
dy = dy == 0 ? bm.bmHeight : dy;
// -------------------------------------------------------------------
memset(&ddsd,0,sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH;
if ((hr = pdd->GetSurfaceDesc(&ddsd))!=DD_OK) return 0;
if ((hr = pdd->GetDC(&hdc)) == DD_OK)
{
StretchBlt(hdc, 125+startX, 105+endY, decX+125, decY+105, hdcImage, x, y, dx, dy, SRCCOPY);
pdd->ReleaseDC(hdc);
}
DeleteDC(hdcImage);
// -------------------------------------------------------------------
return 1;
}
// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
//主函数
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
if(!InitWindow(hInstance))
return 0;
if(!CreateDirectDraw())
return 0;
int i = 0;
if(Put("background",lpddOne,0,0,SCREEN_WIDTH,SCREEN_HEIGHT,0,0,SCREEN_WIDTH,SCREEN_HEIGHT)==0)
return 0;
//lpddOne是离屏表面
//放在while外面cpu使用很大
while(WeAreAlive)
{
//if(Put("two",lpddOne,100,100,10,10,0,0,100,100)==0)//放在while里面内存不断增加
// return 0;
RefreshWindow(lpddSprimary,lpddOne);
HandleEvents();
i++;
}
DestroyDirectDraw();
return 0;
} |
|