⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 directdraw.cpp

📁 网络游戏龙族 完整的登陆器 C++ 源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			return;	
		}			
	}				
}					
	
///////////////////////////////////////////////////////////////////////////////
//

BOOL
DDLoadBitmap( LPDIRECTDRAW lpDirectDraw, LPSURFACEINFO lpSurfaceInfo, char* lpszFilePath )
{
	HBITMAP		hbm;
	BITMAP		bm;

	hbm = ( HBITMAP )LoadImage( NULL, lpszFilePath, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION );
	if ( hbm == NULL )
	{
		return	FALSE;
	}
	GetObject( hbm, sizeof( bm ), &bm );

	//DDSURFACEDESC			ddsd;
	//LPDIRECTDRAWSURFACE	pdds;

	//ZeroMemory( &ddsd, sizeof( ddsd ) );
	//ddsd.dwSize = sizeof( ddsd );
	//ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
	//ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
	//ddsd.dwWidth = bm.bmWidth;
	//ddsd.dwHeight = bm.bmHeight;
	//if ( lpDirectDraw->CreateSurface( &ddsd, &pdds, NULL ) == DD_OK )
	//{
	//	lpSurfaceInfo->lpSurface = pdds;
	//}
	//else
	//{
	//	lpSurfaceInfo->lpSurface = NULL;
	//}

	lpSurfaceInfo->rect.left = 0;
	lpSurfaceInfo->rect.top = 0;
	lpSurfaceInfo->rect.right = bm.bmWidth;
	lpSurfaceInfo->rect.bottom = bm.bmHeight;

	lpSurfaceInfo->lpSurface = CreateSurface( lpDirectDraw, bm.bmWidth, bm.bmHeight );

	DDCopyBitmap( lpSurfaceInfo->lpSurface, hbm, 0, 0, 0, 0 );
	DeleteObject( hbm );

//	lpSurfaceInfo->dwFillColor = DDColorMatch( lpSurfaceInfo->lpSurface, RGB( 255, 0, 255 ) );
//	DDSetColorKey( lpSurfaceInfo->lpSurface, lpSurfaceInfo->dwFillColor );
	DDSetColorKey( lpSurfaceInfo->lpSurface, RGB( 255, 0, 255 ) );

	return	TRUE;
}

BOOL
DDReLoadBitmap( LPDIRECTDRAWSURFACE lpSurface, char* lpszFilePath )
{
	HBITMAP		hBitmap;

	hBitmap = ( HBITMAP )LoadImage( NULL, lpszFilePath, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION );
	if ( hBitmap == NULL )
	{
		return	FALSE;
	}

	DDCopyBitmap( lpSurface, hBitmap, 0, 0, 0, 0 );
	DeleteObject( hBitmap );

	return	TRUE;
}

BOOL
DDCopyBitmap( LPDIRECTDRAWSURFACE lpSurface, HBITMAP hBitmap, int x, int y, int dx, int dy )
{
	HDC				hdcImage;
	HDC				hdc;
	BITMAP			bm;
	DDSURFACEDESC	ddsd;

	if ( hBitmap == NULL || lpSurface == NULL )
	{
		return	FALSE;
	}

	lpSurface->Restore( );

	hdcImage = CreateCompatibleDC( NULL );
	if ( !hdcImage )
	{
		return	FALSE;
	}
	SelectObject( hdcImage, hBitmap );

	GetObject( hBitmap, sizeof( bm ), &bm );
	dx = dx == 0 ? bm.bmWidth : dx;
	dy = dy == 0 ? bm.bmHeight : dy;

	ddsd.dwSize = sizeof( ddsd );
	ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH;
	lpSurface->GetSurfaceDesc( &ddsd );
	if ( lpSurface->GetDC( &hdc ) == DD_OK )
	{
		StretchBlt( hdc, 0, 0, ddsd.dwWidth, ddsd.dwHeight, hdcImage, x, y, dx, dy, SRCCOPY );
		lpSurface->ReleaseDC( hdc );
	}

	DeleteDC( hdcImage );

	return	TRUE;
}

DWORD
DDColorMatch( LPDIRECTDRAWSURFACE lpSurface, COLORREF rgb )
{
	COLORREF		rgbT;
	HDC				hdc;
	DWORD			dw = CLR_INVALID;
	DDSURFACEDESC	ddsd;
	HRESULT			hResult;

	if ( rgb != CLR_INVALID && lpSurface->GetDC( &hdc ) == DD_OK )
	{
		rgbT = GetPixel( hdc, 0, 0 );
		SetPixel( hdc, 0, 0, rgb );
		lpSurface->ReleaseDC( hdc );
	}

	ddsd.dwSize = sizeof( ddsd );
	while ( ( hResult = lpSurface->Lock( NULL, &ddsd, 0, NULL ) ) == DDERR_WASSTILLDRAWING )
	{
		;
	}

	if ( hResult == DD_OK )
	{
		dw = *( DWORD* )ddsd.lpSurface;
		if ( ddsd.ddpfPixelFormat.dwRGBBitCount < 32 )
		{
			dw &= ( 1 << ddsd.ddpfPixelFormat.dwRGBBitCount ) - 1;
		}

		lpSurface->Unlock( NULL );
	}

	if ( rgb != CLR_INVALID && lpSurface->GetDC( &hdc ) == DD_OK )
	{
		SetPixel( hdc, 0, 0, rgbT );
		lpSurface->ReleaseDC( hdc );
	}

	return	dw;
}

HRESULT
DDSetColorKey( LPDIRECTDRAWSURFACE lpSurface, COLORREF rgb )
{
	DDCOLORKEY	ddck;

	ddck.dwColorSpaceLowValue = DDColorMatch( lpSurface, rgb );
	ddck.dwColorSpaceHighValue = ddck.dwColorSpaceLowValue;

	return	lpSurface->SetColorKey( DDCKEY_SRCBLT, &ddck );
}

void
StretchBltScreen( LPDIRECTDRAWSURFACE lpSurfaceDst, LPRECT lpRectDst,
				  LPDIRECTDRAWSURFACE lpSurfaceSrc, LPRECT lpRectSrc,
				  DWORD dwColorFill, int nDirection )
{
	DDBLTFX		ddbltfx;

	ZeroMemory( &ddbltfx, sizeof( ddbltfx ) );
	ddbltfx.dwSize = sizeof( ddbltfx );
	ddbltfx.dwFillColor = dwColorFill;

	lpSurfaceDst->Blt( lpRectDst, lpSurfaceSrc, lpRectSrc, DDBLT_KEYSRC | DDBLT_DDFX | DDBLT_WAIT, &ddbltfx );
}

void
BltGrid( LPDIRECTDRAWSURFACE lpSurfaceDst, LPRECT lpRectDst, LPDIRECTDRAWSURFACE lpSurfaceSrc, LPRECT lpRectSrc )
{
	DDSURFACEDESC	ddsdSrc, ddsdDst;
	register int	x, y;
	WORD			wColorKey;

	ZeroMemory( &ddsdSrc, sizeof( ddsdSrc ) );
	ddsdSrc.dwSize = sizeof( ddsdSrc );
	ddsdSrc.dwFlags = DDSD_PIXELFORMAT;
	if ( FAILED( lpSurfaceSrc->GetSurfaceDesc( &ddsdSrc ) ) )
	{
		return;
	}

	ZeroMemory( &ddsdDst, sizeof( ddsdDst ) );
	ddsdDst.dwSize = sizeof( ddsdDst );
	if ( FAILED( lpSurfaceDst->GetSurfaceDesc( &ddsdDst ) ) )
	{
		return;
	}

	DDPIXELFORMAT	ddpfSrc;
	ZeroMemory( &ddpfSrc, sizeof( ddpfSrc ) );
	ddpfSrc.dwSize = sizeof( ddpfSrc );
	lpSurfaceSrc->GetPixelFormat( &ddpfSrc );
	switch ( ddpfSrc.dwRBitMask )
	{
	case	0x7C00:		// RGB 5:5:5
		wColorKey  = ( 255 >> 3 );			// Blue
		wColorKey += (   0 >> 3 ) << 5;		// Green
		wColorKey += ( 255 >> 3 ) << 10;	// Red
		break;

	case	0xF800:		// RGB 5:6:5
		wColorKey  = ( 255 >> 3 );			// Blue
		wColorKey += (   0 >> 2 ) << 5;		// Green
		wColorKey += ( 255 >> 3 ) << 11;	// Red
		break;
	}

	if ( FAILED( lpSurfaceSrc->Lock( NULL, &ddsdSrc, DDLOCK_WAIT, NULL ) ) )
	{
		return;
	}

	if ( FAILED( lpSurfaceDst->Lock( NULL, &ddsdDst, DDLOCK_WAIT, NULL ) ) )
	{
		lpSurfaceSrc->Unlock( NULL );
		return;
	}

	LPWORD	lpwSrc = ( LPWORD )ddsdSrc.lpSurface + lpRectSrc->top * ( ddsdSrc.lPitch / sizeof( WORD ) ) + lpRectSrc->left;
	LPWORD	lpwDst = ( LPWORD )ddsdDst.lpSurface + lpRectDst->top * ( ddsdDst.lPitch / sizeof( WORD ) ) + lpRectDst->left;
	int		cx = lpRectDst->right - lpRectDst->left;
	int		cy = lpRectDst->bottom - lpRectDst->top;

	for ( y = 0; y < cy; y++ )
	{
		for ( x = 0; x < cx; x++ )
		{
			if ( y % 2 == 0 )
			{
				if ( x % 2 == 0 )
				{
					if ( *( lpwSrc + y * ( ddsdSrc.lPitch / sizeof( WORD ) ) + x ) != wColorKey )
					{
						*( lpwDst + y * ( ddsdSrc.lPitch / sizeof( WORD ) ) + x ) = *( lpwSrc + y * ( ddsdSrc.lPitch / sizeof( WORD ) ) + x );
					}
				}
			}
			else
			{
				if ( x % 2 == 1 )
				{
					if ( *( lpwSrc + y * ( ddsdSrc.lPitch / sizeof( WORD ) ) + x ) != wColorKey )
					{
						*( lpwDst + y * ( ddsdSrc.lPitch / sizeof( WORD ) ) + x ) = *( lpwSrc + y * ( ddsdSrc.lPitch / sizeof( WORD ) ) + x );
					}
				}
			}
		}
	}
	
	lpSurfaceSrc->Unlock( NULL );
	lpSurfaceDst->Unlock( NULL );
}

void
BltTrans( LPDIRECTDRAWSURFACE lpSurfaceDst, LPRECT lpRectDst, LPDIRECTDRAWSURFACE lpSurfaceSrc, LPRECT lpRectSrc )
{
	DDSURFACEDESC	ddsdSrc, ddsdDst;
	register int	x, y;
	WORD			wColorKey;
	WORD			wSrcRed, wSrcGreen, wSrcBlue;
	WORD			wDstRed, wDstGreen, wDstBlue;
	WORD			wImageSrc, wImageDst;

	ZeroMemory( &ddsdSrc, sizeof( ddsdSrc ) );
	ddsdSrc.dwSize = sizeof( ddsdSrc );
	ddsdSrc.dwFlags = DDSD_PIXELFORMAT;
	if ( FAILED( lpSurfaceSrc->GetSurfaceDesc( &ddsdSrc ) ) )
	{
		return;
	}

	ZeroMemory( &ddsdDst, sizeof( ddsdDst ) );
	ddsdDst.dwSize = sizeof( ddsdDst );
	if ( FAILED( lpSurfaceDst->GetSurfaceDesc( &ddsdDst ) ) )
	{
		return;
	}

	DDPIXELFORMAT	ddpfSrc;
	ZeroMemory( &ddpfSrc, sizeof( ddpfSrc ) );
	ddpfSrc.dwSize = sizeof( ddpfSrc );
	lpSurfaceSrc->GetPixelFormat( &ddpfSrc );
	switch ( ddpfSrc.dwRBitMask )
	{
	case	0x7C00:		// RGB 5:5:5
		wColorKey  = ( 255 >> 3 );			// Blue
		wColorKey += (   0 >> 3 ) << 5;		// Green
		wColorKey += ( 255 >> 3 ) << 10;	// Red
		break;

	case	0xF800:		// RGB 5:6:5
		wColorKey  = ( 255 >> 3 );			// Blue
		wColorKey += (   0 >> 2 ) << 5;		// Green
		wColorKey += ( 255 >> 3 ) << 11;	// Red
		break;
	}

	if ( FAILED( lpSurfaceSrc->Lock( NULL, &ddsdSrc, DDLOCK_WAIT, NULL ) ) )
	{
		return;
	}

	if ( FAILED( lpSurfaceDst->Lock( NULL, &ddsdDst, DDLOCK_WAIT, NULL ) ) )
	{
		lpSurfaceSrc->Unlock( NULL );
		return;
	}

	LPWORD	lpwSrc = ( LPWORD )ddsdSrc.lpSurface + lpRectSrc->top * ( ddsdSrc.lPitch / sizeof( WORD ) ) + lpRectSrc->left;
	LPWORD	lpwDst = ( LPWORD )ddsdDst.lpSurface + lpRectDst->top * ( ddsdDst.lPitch / sizeof( WORD ) ) + lpRectDst->left;
	int		cx = lpRectDst->right - lpRectDst->left;
	int		cy = lpRectDst->bottom - lpRectDst->top;

	LPWORD	lpwImageSrc, lpwImageDst;

	for ( y = 0; y < cy; y++ )
	{
		lpwImageSrc = lpwSrc + y * ( ddsdSrc.lPitch / sizeof( WORD ) );
		lpwImageDst = lpwDst + y * ( ddsdSrc.lPitch / sizeof( WORD ) );

		for ( x = 0; x < cx; x++ )
		{
			//wSrc = *( lpwSrc + y * ( ddsdSrc.lPitch / sizeof( WORD ) ) + x );
			//lpwImageSrc = ( LPWORD )*( lpwSrc + y * ( ddsdSrc.lPitch / sizeof( WORD ) ) + x );

			if ( *lpwImageSrc != wColorKey )
			{
				wImageSrc = *lpwImageSrc;
				wImageDst = *lpwImageDst;

				//wDst = *( lpwDst + y * ( ddsdSrc.lPitch / sizeof( WORD ) ) + x );
				//lpwImageDst = ( LPWORD )*( lpwDst + y * ( ddsdSrc.lPitch / sizeof( WORD ) ) + x );

				//wSrcRed   = ( ( wSrc )       ) & ( 0x1F );
				//wSrcGreen = ( ( wSrc ) >> 5  ) & ( 0x1F );
				//wSrcBlue  = ( ( wSrc ) >> 10 ) & ( 0x1F );
				//wSrc = ( ( ( wSrcBlue * 11 ) + ( wSrcGreen * 59 ) + ( wSrcRed * 30 ) ) / 100 );
				//wSrc = ( ( WORD )( ( ( BYTE )( wSrc ) | ( ( WORD )( ( BYTE )( wSrc ) ) << 5 ) ) | ( ( ( DWORD )( BYTE )( wSrc ) ) << 10 ) ) );

				//wDstRed   = ( ( wDst )       ) & ( 0x1F );
				//wDstGreen = ( ( wDst ) >> 5  ) & ( 0x1F );
				//wDstBlue  = ( ( wDst ) >> 10 ) & ( 0x1F );
				//wDst = ( ( ( wDstBlue * 11 ) + ( wDstGreen * 59 ) + ( wDstRed * 30 ) ) / 100 );
				//wDst = ( ( WORD )( ( ( BYTE )( wDst ) | ( ( WORD )( ( BYTE )( wDst ) ) << 5 ) ) | ( ( ( DWORD )( BYTE )( wDst ) ) << 10 ) ) );

				wSrcBlue  = ( wImageSrc        ) & ( 0x001f );
				wSrcGreen = ( wImageSrc >>  5  ) & ( 0x001f );
				wSrcRed   = ( wImageSrc >> 10  ) & ( 0x001f );

				wDstBlue  = ( wImageDst        ) & ( 0x001f );
				wDstGreen = ( wImageDst >>  5  ) & ( 0x001f );
				wDstRed   = ( wImageDst >> 10  ) & ( 0x001f );

				//wPixel = ( ( ( wBlue * 11 ) + ( wGreen * 59 ) + ( wRed * 30 ) ) / 100 );
				//wPixel = ( ( WORD )( ( ( BYTE )( Pixel ) | ( ( WORD )( ( BYTE )( wPixel ) ) << 5 ) ) | ( ( ( DWORD )( BYTE )( wPixel ) ) << 10 ) ) );
//				wPixel = ( ( WORD )( ( ( BYTE )( wRed ) | ( ( WORD )( ( BYTE )( wGreen ) ) << 5 ) ) | ( ( ( DWORD )( BYTE )( wBlue ) ) << 10 ) ) );
//				wPixel = ( ( wBlue >> 3 ) | ( ( wGreen >> 3 ) << 5 ) | ( ( wRed >> 3 ) << 10 ) );

//				*( lpwDst + y * ( ddsdSrc.lPitch / sizeof( WORD ) ) + x ) = ( ( wBlue ) | ( ( wGreen ) << 5 ) | ( ( wRed ) << 10 ) );
//				*( lpwDst + y * ( ddsdSrc.lPitch / sizeof( WORD ) ) + x ) = ( ( wBlue ) | ( ( wGreen ) << 5 ) | ( ( wRed ) << 10 ) );

				//*lpwImageDst = ( ( wSrcBlue ) | ( ( wSrcGreen ) << 5 ) | ( ( wSrcRed ) << 10 ) );
				*lpwImageDst = ( ( wSrcBlue >> 3 ) | ( ( wSrcGreen >> 3 ) << 5 ) | ( ( wSrcRed >> 3 ) << 10 ) );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -