📄 dd.cpp
字号:
{
ddrval=RestoreSurface();
if(ddrval!=DD_OK)return false;
if(ddrval!=DDERR_WASSTILLDRAWING)return false;
}
if(ddrval!=DD_OK)return false;
}//End while(1);
}
/////////////////////////////////////////////////////////////////////////////
//Blit(StretchBlit):
bool CDD::StretchBlitSourceToBack(RECT rcDest,RECT rcSrc,int style)
{
//软剪切:
if(rcDest.top<0)rcDest.top=0;
if(rcDest.left<0)rcDest.left=0;
if(rcDest.bottom>m_nScreenHeight)rcDest.bottom=m_nScreenHeight-1;
if(rcDest.right>m_nScreenWidth)rcDest.right=m_nScreenWidth-1;
//BLIT:;
HRESULT ddrval;
ddrval=m_lpDDS_Back->Blt(&rcDest,
m_lpDDS_Source,&rcSrc,
style,
NULL);
while(true)
{
if(ddrval==DD_OK)return true;
if(ddrval==DDERR_SURFACELOST)
{
ddrval=RestoreSurface();
if(ddrval!=DD_OK)return false;
if(ddrval!=DDERR_WASSTILLDRAWING)return false;
}
if(ddrval!=DD_OK)return false;
}//End while(true);
}
/////////////////////////////////////////////////////////////////////////////
//Blit:
bool CDD::BlitBackToPrimary(int x,int y,RECT rcRect,int style)
{
HRESULT ddrval;
ddrval=m_lpDDS_Primary->BltFast(x,y,
m_lpDDS_Back,&rcRect,
style);
while(1)
{
if(ddrval==DD_OK)return true;
if(ddrval==DDERR_SURFACELOST)
{
ddrval=RestoreSurface();
if(ddrval!=DD_OK)return false;
if(ddrval!=DDERR_WASSTILLDRAWING)return false;
}
if(ddrval!=DD_OK)return false;
}//End while(1);
}
/////////////////////////////////////////////////////////////////////////
//Flip:
void CDD::FlipSurface(void)
{
HRESULT ddrval;
for(;;)//(int i=0;i<10;i++)//while(count>0)
{
ddrval=m_lpDDS_Primary->Flip(NULL,0);
if(ddrval==DD_OK)return;
if(ddrval==DDERR_SURFACELOST)
{
ddrval=RestoreSurface();
if(ddrval!=DD_OK)return;
}
if(ddrval!=DDERR_WASSTILLDRAWING)return;
}//end loop;
return;
}
///////////////////////////////////////////////////////////////////////////
//设置背景色的函数:
bool CDD::SetBkColor(COLORREF rgb)
{
HRESULT ddrval;
HDC hdc;
ddrval=m_lpDDS_Primary->GetDC(&hdc);
if(ddrval!=DD_OK)return false;
::SetBkColor(hdc,rgb);
m_lpDDS_Primary->ReleaseDC(hdc);
ddrval=m_lpDDS_Back->GetDC(&hdc);
if(ddrval!=DD_OK)return false;
::SetBkColor(hdc,rgb);
m_lpDDS_Back->ReleaseDC(hdc);
return true;
}
///////////////////////////////////////////////////////////////////////////
//
void CDD::ErrorCheck(HRESULT ddrval)
{
CString str;
switch(ddrval)
{/*
case DDERR_ALREADYINITIALIZED: str="The object has already been initialized.";break;
case DDERR_BLTFASTCANTCLIP: str="A DirectDrawClipper object is attached to a source surface that has passed into a call to the IDirectDrawSurface2::BltFast method. ";break;
case DDERR_CANNOTATTACHSURFACE :str="A surface cannot be attached to another requested surface. ";break;
case DDERR_CANNOTDETACHSURFACE :str="A surface cannot be detached from another requested surface. ";break;
case DDERR_CANTCREATEDC :str="Windows cannot create any more device contexts (DCs). ";break;
case DDERR_CANTDUPLICATE :str="Primary and 3D surfaces, or surfaces that are implicitly created, cannot be duplicated. ";break;
case DDERR_CANTLOCKSURFACE :str="Access to this surface is refused because an attempt was made to lock the primary surface without DCI support. ";break;
case DDERR_CANTPAGELOCK :str="An attempt to page lock a surface failed. Page lock will not work on a display-memory surface or an emulated primary surface. ";break;
case DDERR_CANTPAGEUNLOCK :str="An attempt to page unlock a surface failed. Page unlock will not work on a display-memory surface or an emulated primary surface. ";break;
case DDERR_CLIPPERISUSINGHWND :str="An attempt was made to set a clip list for a DirectDrawClipper object that is already monitoring a window handle. ";break;
case DDERR_COLORKEYNOTSET :str="No source color key is specified for this operation. ";break;
case DDERR_CURRENTLYNOTAVAIL :str="No support is currently available. ";break;
case DDERR_DCALREADYCREATED :str="A device context (DC) has already been returned for this surface. Only one DC can be retrieved for each surface. ";break;
case DDERR_DIRECTDRAWALREADYCREATED:str="A DirectDraw object representing this driver has already been created for this process. An exception was encountered while performing the requested operation. ";break;
case DDERR_EXCLUSIVEMODEALREADYSET :str="An attempt was made to set the cooperative level when it was already set to exclusive. ";break;
case DDERR_GENERIC :str="There is an undefined error condition. ";break;
case DDERR_HEIGHTALIGN :str="The height of the provided rectangle is not a multiple of the required alignment. ";break;
case DDERR_HWNDALREADYSET :str="The DirectDraw cooperative level window handle has already been set. It cannot be reset while the process has surfaces or palettes created. ";break;
case DDERR_HWNDSUBCLASSED :str="DirectDraw is prevented from restoring state because the DirectDraw cooperative level window handle has been subclassed. ";break;
case DDERR_IMPLICITLYCREATED :str="The surface cannot be restored because it is an implicitly created surface. ";break;
case DDERR_INCOMPATIBLEPRIMARY :str="The primary surface creation request does not match with the existing primary surface. ";break;
case DDERR_INVALIDCAPS :str="One or more of the capability bits passed to the callback function are incorrect. ";break;
case DDERR_INVALIDCLIPLIST :str="DirectDraw does not support the provided clip list. ";break;
case DDERR_INVALIDDIRECTDRAWGUID :str="The globally unique identifier (GUID) passed to the DirectDrawCreate function is not a valid DirectDraw driver identifier. ";break;
case DDERR_INVALIDMODE :str="DirectDraw does not support the requested mode. ";break;
case DDERR_INVALIDOBJECT :str="DirectDraw received a pointer that was an invalid DirectDraw object. ";break;
case DDERR_INVALIDPARAMS :str="One or more of the parameters passed to the method are incorrect. ";break;
case DDERR_INVALIDPIXELFORMAT:str="The pixel format was invalid as specified. ";break;
case DDERR_INVALIDPOSITION :str="The position of the overlay on the destination is no longer legal. ";break;
case DDERR_INVALIDRECT :str="The provided rectangle was invalid. ";break;case DDERR_INVALIDSURFACETYPE:str="The requested operation could not be performed because the surface was of the wrong type. ";break;
case DDERR_LOCKEDSURFACES :str="One or more surfaces are locked, causing the failure of the requested operation. ";break;
case DDERR_NO3D :str="No 3D hardware or emulation is present. ";break;
case DDERR_NOALPHAHW :str="No alpha acceleration hardware is present or available, causing the failure of the requested operation. ";break;
case DDERR_NOBLTHW :str="No blitter hardware is present. ";break;
case DDERR_NOCLIPLIST :str="No clip list is available. ";break;
case DDERR_NOCLIPPERATTACHED:str="No DirectDrawClipper object is attached to the surface object. ";break;
case DDERR_NOCOLORCONVHW :str="The operation cannot be carried out because no color-conversion hardware is present or available. ";break;
case DDERR_NOCOLORKEY :str="The surface does not currently have a color key. ";break;
case DDERR_NOCOLORKEYHW :str="The operation cannot be carried out because there is no hardware support for the destination color key. ";break;
case DDERR_NOCOOPERATIVELEVELSET:str="A create function is called without the IDirectDraw2::SetCooperativeLevel method being called. ";break;case DDERR_NODC :str="No DC has ever been created for this surface. ";break;
case DDERR_NODDROPSHW :str="No DirectDraw raster operation (ROP) hardware is available. ";break;case DDERR_NODIRECTDRAWHW:str="Hardware-only DirectDraw object creation is not possible; the driver does not support any hardware. ";break;case DDERR_NODIRECTDRAWSUPPORT :str="DirectDraw support is not possible with the current display driver. ";break;
case DDERR_NOEMULATION :str="Software emulation is not available. ";break;
case DDERR_NOEXCLUSIVEMODE :str="The operation requires the application to have exclusive mode, but the application does not have exclusive mode. ";break;
case DDERR_NOFLIPHW :str="Flipping visible surfaces is not supported. ";break;
case DDERR_NOGDI :str="No GDI is present. ";break;
case DDERR_NOHWND :str="Clipper notification requires a window handle, or no window handle has been previously set as the cooperative level window handle. ";break;
case DDERR_NOMIPMAPHW :str="The operation cannot be carried out because no mipmap texture mapping hardware is present or available. ";break;
case DDERR_NOMIRRORHW :str="The operation cannot be carried out because no mirroring hardware is present or available. ";break;
case DDERR_NOOVERLAYDEST :str="The IDirectDrawSurface2::GetOverlayPosition method is called on an overlay that the IDirectDrawSurface2::UpdateOverlay method has not been called on to establish a destination. ";break;
case DDERR_NOOVERLAYHW :str="The operation cannot be carried out because no overlay hardware is present or available. ";break;
case DDERR_NOPALETTEATTACHED :str="No palette object is attached to this surface. ";break;
case DDERR_NOPALETTEHW :str="There is no hardware support for 16- or 256-color palettes. ";break;
case DDERR_NORASTEROPHW :str="The operation cannot be carried out because no appropriate raster operation hardware is present or available. ";break;
case DDERR_NOROTATIONHW :str="The operation cannot be carried out because no rotation hardware is present or available. ";break;
case DDERR_NOSTRETCHHW :str="The operation cannot be carried out because there is no hardware support for stretching. ";break;
case DDERR_NOT4BITCOLOR :str="The DirectDrawSurface object is not using a 4-bit color palette and the requested operation requires a 4-bit color palette. ";break;
case DDERR_NOT4BITCOLORINDEX :str="The DirectDrawSurface object is not using a 4-bit color index palette and the requested operation requires a 4-bit color index palette. ";break;
case DDERR_NOT8BITCOLOR :str="The DirectDrawSurface object is not using an 8-bit color palette and the requested operation requires an 8-bit color palette. ";break;
case DDERR_NOTAOVERLAYSURFACE :str="An overlay component is called for a non-overlay surface. ";break;
case DDERR_NOTEXTUREHW :str="The operation cannot be carried out because no texture-mapping hardware is present or available. ";break;
case DDERR_NOTFLIPPABLE :str="An attempt has been made to flip a surface that cannot be flipped. ";break;
case DDERR_NOTFOUND :str="The requested item was not found. ";break;
case DDERR_NOTINITIALIZED :str="An attempt was made to call an interface method of a DirectDraw object created by CoCreateInstance before the object was initialized. ";break;
case DDERR_NOTLOCKED :str="An attempt is made to unlock a surface that was not locked. ";break;
case DDERR_NOTPAGELOCKED :str="An attempt is made to page unlock a surface with no outstanding page locks. ";break;
case DDERR_NOTPALETTIZED :str="The surface being used is not a palette-based surface. ";break;
case DDERR_NOVSYNCHW :str="The operation cannot be carried out because there is no hardware support for vertical blank synchronized operations. ";break;case DDERR_NOZBUFFERHW:str="The operation to create a z-buffer in display memory or to perform a blit using a z-buffer cannot be carried out because there is no hardware support for z-buffers. ";break;case DDERR_NOZOVERLAYHW :str="The overlay surfaces cannot be z-layered based on the z-order because the hardware does not support z-ordering of overlays. ";break;
case DDERR_OUTOFCAPS :str="The hardware needed for the requested operation has already been allocated. ";break;
case DDERR_OUTOFMEMORY :str="DirectDraw does not have enough memory to perform the operation. ";break;
case DDERR_OUTOFVIDEOMEMORY :str="DirectDraw does not have enough display memory to perform the operation. ";break;
case DDERR_OVERLAYCANTCLIP :str="The hardware does not support clipped overlays. ";break;
case DDERR_OVERLAYCOLORKEYONLYONEACTIVE:str="An attempt was made to have more than one color key active on an overlay. ";break;
case DDERR_OVERLAYNOTVISIBLE :str="The IDirectDrawSurface2::GetOverlayPosition method is called on a hidden overlay. ";break;
case DDERR_PALETTEBUSY :str="Access to this palette is refused because the palette is locked by another thread. ";break;
case DDERR_PRIMARYSURFACEALREADYEXISTS:str="This process has already created a primary surface. ";break;
case DDERR_REGIONTOOSMALL :str="The region passed to the IDirectDrawClipper::GetClipList method is too small. ";break;
case DDERR_SURFACEALREADYATTACHED:str="An attempt was made to attach a surface to another surface to which it is already attached. ";break;
case DDERR_SURFACEALREADYDEPENDENT :str="An attempt was made to make a surface a dependency of another surface to which it is already dependent. ";break;
case DDERR_SURFACEBUSY :str="Access to the surface is refused because the surface is locked by another thread. ";break;
case DDERR_SURFACEISOBSCURED :str="Access to the surface is refused because the surface is obscured. ";break;
case DDERR_SURFACELOST :str="Access to the surface is refused because the surface memory is gone. The DirectDrawSurface object representing this surface should have the IDirectDrawSurface2::Restore method called on it. ";break;
case DDERR_SURFACENOTATTACHED :str="The requested surface is not attached. ";break;
case DDERR_TOOBIGHEIGHT :str="The height requested by DirectDraw is too large. ";break;
case DDERR_TOOBIGSIZE :str="The size requested by DirectDraw is too large. However, the individual height and width are OK.";break;
case DDERR_TOOBIGWIDTH :str="The width requested by DirectDraw is too large. ";break;
case DDERR_UNSUPPORTED :str="The operation is not supported. ";break;
case DDERR_UNSUPPORTEDFORMAT :str="The FourCC format requested is not supported by DirectDraw. ";break;
case DDERR_UNSUPPORTEDMASK:str=" The bitmask in the pixel format requested is not supported by DirectDraw. ";break;
case DDERR_UNSUPPORTEDMODE :str="The display is currently in an unsupported mode. ";break;
case DDERR_VERTICALBLANKINPROGRESS:str=" A vertical blank is in progress. ";break;
case DDERR_WASSTILLDRAWING :str="The previous blit operation that is transferring information to or from this surface is incomplete. ";break;
case DDERR_WRONGMODE :str="This surface cannot be restored because it was created in a different mode. ";break;
case DDERR_XALIGN :str="The provided rectangle was not horizontally aligned on a required boundary";break;
*/
default:str="初始化DD时出错,具体问题不详。";
}
MessageBox(NULL,"DirectDraw Initialize Error",str,MB_OK);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -