首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络游戏 >

为什么DirectDraw中什么也没画,结果却显示乱七八糟的一些东西?解决思路

2012-02-21 
为什么DirectDraw中什么也没画,结果却显示乱七八糟的一些东西?窗口模式下,我只创建了1个FrontSurface和Bac

为什么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从哪创建的有关

热点排行