2 dishiji dishiji 于 2014.12.09 21:15 提问

DirectDraw Blt切图数据有错

LPDIRECTDRAWSURFACE7 lpDDSPrimary; // DDSCAPS_PRIMARYSURFACE主页面的指针

LPDIRECTDRAWSURFACE7 lpDDSBack1; // DDSCAPS_OFFSCREENPLAIN 离屏页面的指针
LPDIRECTDRAWSURFACE7 lpDDSBack2; // DDSCAPS_OFFSCREENPLAIN 离屏页面的指针
//由于字数限制,只先关键代码了
//创建表面,设置模式为全屏独占模式
ddsd.dwFlags = DDSD_CAPS //

ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE|DDSCAPS_COMPLEX|DDSCAPS_FLIP|DDSCAPS_VIDEOMEMORY; //DDSCAPS_VIDEOMEMORY 只使用显存来创建
if ( lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL ) != DD_OK )

return FALSE; //创建主页面

ddsd.dwSize = sizeof( ddsd );

ddsd.dwFlags = DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT;

ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; //这是离屏页面

ddsd.dwHeight=FullScrenn_Height; //****************显示器高************************

ddsd.dwWidth=FullScrenn_Width; //******************显示器宽************************

if ( DD_OK != lpDD->CreateSurface(&ddsd,&lpDDSBack1, NULL))

return FALSE; //创建放背景图的页面

if ( DD_OK != lpDD->CreateSurface(&ddsd,&lpDDSBack2, NULL))

return FALSE; //创建放背景图的页面

测试1:lpDDSBack1使用StretchDIBits 填写像素全为1;lpDDSBack1使用StretchDIBits 填写像素全为2;
if(Tflag==1) { hRet = lpDDSPrimary->Blt(&rcclient,lpDDSBack1,NULL,DDBLT_WAIT,NULL); Tflag=0;}
else {hRet = lpDDSPrimary->Blt(&rcclient,lpDDSBack2,NULL,DDBLT_WAIT,NULL);Tflag=0;}
测试结果:校验显示器输出数据,要么全1,要么全2,数据正确
测试2:lpDDSBack1填写行像素相同,列像素递增的图,lpDDSBack2也一样,只是开始像素点不一样
测试结果:校验显示器输出数据,要么为Back1的数据,要么为Back2的数据,表明数据正确
测试3:lpDDBack1填写整个递增的图,即行递增列也递增的图,Back2也一样,也只是起点不一样
测试结果:校验显示器输出数据,显示Back1数据的时候 有时候会出现Back2的数据,同样,显示Back2数据的时候,也会出现Back1的数据,这是为什么了,急!!!!
Back1和Back2 使用StretchDIBits 只填写一次图像数据,

问题是 为何整个递增的图像会出现 一副图像含有一部分另一副图像的像素了

Csdn user default icon
上传中...
上传图片
插入图片