问题描述
- 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(&rcclientlpDDSBack1NULLDDBLT_WAITNULL); Tflag=0;}
else {hRet = lpDDSPrimary->Blt(&rcclientlpDDSBack2NULLDDBLT_WAITNULL);Tflag=0;}
测试结果:校验显示器输出数据,要么全1,要么全2,数据正确
测试2:lpDDSBack1填写行像素相同,列像素递增的图,lpDDSBack2也一样,只是开始像素点不一样
测试结果:校验显示器输出数据,要么为Back1的数据,要么为Back2的数据,表明数据正确
测试3:lpDDBack1填写整个递增的图,即行递增列也递增的图,Back2也一样,也只是起点不一样
测试结果:校验显示器输出数据,显示Back1数据的时候 有时候会出现Back2的数据,同样,显示Back2数据的时候,也会出现Back1的数据,这是为什么了,急!!!!
Back1和Back2 使用StretchDIBits 只填写一次图像数据,问题是 为何整个递增的图像会出现 一副图像含有一部分另一副图像的像素了