怪:用DDraw显示,将窗口移到双屏幕边上,就显示不了图像(高分求助)
我用DDaw显示一YUV图片,但把窗口移到屏幕边上(我用的是双屏是卡,即有两个显示器),即一半在主屏幕上,另一半在另一屏上,结果,用Blt显示,图像出来了,错误代号是0x80004001,请问,如何解决这个问题
代码如下:
定义
LPDIRECTDRAW GloballpDD; //DDraw
LPDIRECTDRAWSURFACE GlobalSnapPictureOffScreen;//抓图表面
LPDIRECTDRAWSURFACE lpDDSPrimary; // DirectDraw primary surface
LPDIRECTDRAWCLIPPER lpClipper; // clipper for primary
创建表面
//初始化DDraw
if ( DirectDrawCreate(NULL,&GloballpDD,NULL)!=DD_OK){
AfxMessageBox("DirectDrawCreate失败");
//return -1;
}
if ( GloballpDD->SetCooperativeLevel(NULL,DDSCL_NORMAL)!=DD_OK ){
AfxMessageBox("SetCooperativeLevel失败");
//return -2;
}
//用于显示的表面
DDSURFACEDESC ddsd;
// Create the primary surface
ZeroMemory(&ddsd,sizeof(ddsd));
ddsd.dwSize = sizeof( ddsd );
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
if(GloballpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL )!=DD_OK){
AfxMessageBox("CreateSurface lpDDSPrimary失败");
//return -4;
}
// create a clipper for the primary surface
if(GloballpDD->CreateClipper( 0, &lpClipper, NULL ) != DD_OK ) {
AfxMessageBox("CreateClipper失败");
//return -5;
}
if(lpClipper->SetHWnd( 0, m_hWnd )!= DD_OK ) {
AfxMessageBox("lpClipper->SetHWnd失败");
//return -6;
}
if(lpDDSPrimary->SetClipper( lpClipper ) != DD_OK )
{
AfxMessageBox("SetClipper失败");
//return -7;
}
//创建一个内存绘制
ZeroMemory(&ddsd,sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN|DDSCAPS_VIDEOMEMORY;
ddsd.dwWidth = 352;
ddsd.dwHeight = 288;
DDPIXELFORMAT ddPixelFormat={sizeof(DDPIXELFORMAT), DDPF_FOURCC,MAKEFOURCC('U','Y','V','Y'),0,0,0,0,0};
ddsd.ddpfPixelFormat = ddPixelFormat;
ddsd.dwFlags |= DDSD_PIXELFORMAT;
if (GloballpDD->CreateSurface(&ddsd,&GlobalSnapPictureOffScreen,NULL)!=DD_OK){
AfxMessageBox("CreateSurface GlobalSnapPictureOffScreen失败");
//return -3;
}
//将GlobalSnapPictureOffScreen表面充入数据
HANDLE h=CreateFile("c:\\JP1.YUV",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
int size=GetFileSize(h,NULL);
ZeroMemory(&ddsd, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
GlobalSnapPictureOffScreen->Lock(NULL,&ddsd,DDLOCK_SURFACEMEMORYPTR|DDLOCK_WAIT,NULL);
BYTE *DestAddress=(BYTE *)ddsd.lpSurface;
DWORD s;
for(int i=0;i<288;i++){
ReadFile(h,DestAddress,352*2,&s,NULL);
DestAddress += ddsd.lPitch;
}
//tmmanTranslateAdapterAddress((UINT)DestinationPoint,lPitch*240,&PhysicalAddress);
GlobalSnapPictureOffScreen->Unlock(NULL);
CloseHandle(h);
绘制
RECT rcRect={0,0,352,288};
RECT destRect={0,0,352,288};
POINT pt={0,0};
::ClientToScreen(m_hWnd, &pt );
OffsetRect(&destRect, pt.x, pt.y);
int ddrval = lpDDSPrimary->Blt( &destRect, GlobalSnapPictureOffScreen, &rcRect, 0, NULL );
TRACE("ddrval=0x%x\n",ddrval);
请问:如何解决这个问题啊