为什么DirectDraw中什么也没画,结果却显示乱七八糟的一些东西?
窗口模式下,我只创建了1个FrontSurface和BackSurface.然后让它们Flip,结果绘图区域总会有一些乱七八糟的东西显示出来(这些东西位置不固定)。
我观察了一下,这些乱七八糟的东西和当前屏幕显示的东西有关。
比如:经常能看到N个.net开发环境(我在.net下调试的)
这是怎么回事?
初始化部分代码:
//创建主页面
ZeroMemory(&ddsd, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
lpDD-> CreateSurface(&ddsd, &lpDDSFront, NULL);
//创建离屏页面
ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
RECT rect;
GetClientRect(hWnd, &rect);
forewidth=rect.right-rect.left;
foreheight=rect.bottom-rect.top;
ddsd.dwWidth = forewidth;
ddsd.dwHeight = foreheight;
lpDD-> CreateSurface( &ddsd, &lpDDSBack, NULL );
Flip代码:
//换页
void Flip(void)
{
RECT Window;
POINT pt;
GetClientRect(hWnd, &Window);
pt.x=pt.y=0;
ClientToScreen(hWnd, &pt);
OffsetRect(&Window, pt.x, pt.y);
if (lpDDSFront-> IsLost() == DDERR_SURFACELOST)
{
lpDDSFront-> Restore();
}
HRESULT rval=lpDDSFront-> Blt(&Window, lpDDSBack,NULL, DDBLT_WAIT, NULL);
if(rval == DDERR_SURFACELOST) lpDDSFront-> Restore();
return ;
}
[解决办法]
结果绘图区域总会有一些乱七八糟的东西显示出来(这些东西位置不固定)。
-----------------
这是因为在lpDDSBack中会留有一些数据,这些数据Blt到主表面就是那样的了
你可以在Blt之前清除(用纯色填充)一下这些数据:
int DDraw_Fill_Surface(LPDIRECTDRAWSURFACE7 lpdds,int color)
{
DDBLTFX ddbltfx; // this contains the DDBLTFX structure
// clear out the structure and set the size field
ZeroMemory(&ddbltfx, sizeof(ddbltfx));
ddbltfx.dwSize=sizeof(ddbltfx);
// set the dwfillcolor field to the desired color
ddbltfx.dwFillColor = color;
// ready to blt to surface
lpdds-> Blt(NULL, // ptr to dest rectangle
NULL, // ptr to source surface, NA
NULL, // ptr to source rectangle, NA
DDBLT_COLORFILL | DDBLT_WAIT, // fill and wait
&ddbltfx); // ptr to DDBLTFX structure
// return success
return(1);
}
-----
在Blt前这样就不会有东西了:
DDraw_Fill_Surface(lpdds_back,1);
我观察了一下,这些乱七八糟的东西和当前屏幕显示的东西有关
-----------------
这个就不知道了,我想可能与Windows的显示与lpDDSBack从哪创建的有关