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

📄 dxc_ddraw.cpp

📁 战场登陆器vc++源代码很好用的哦精彩精彩
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// DXC_ddraw.cpp: implementation of the DXC_ddraw class.
//
//////////////////////////////////////////////////////////////////////

#include <string.h>
#include <objbase.h>
#include "DXC_ddraw.h"

extern HWND G_hEditWnd;
extern HWND G_hWnd;

#ifdef DEF_HTMLCOMMOM	//	Html 促捞倔肺弊 何盒..
	extern HWND G_hInternetWnd;
#endif


extern long    G_lTransG100[64][64], G_lTransRB100[64][64];
extern long    G_lTransG70[64][64], G_lTransRB70[64][64];
extern long    G_lTransG50[64][64], G_lTransRB50[64][64];
extern long    G_lTransG25[64][64], G_lTransRB25[64][64];
extern long    G_lTransG2[64][64], G_lTransRB2[64][64];

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

DXC_ddraw::DXC_ddraw()
{
	m_lpFrontB4		= NULL;
	m_lpDD4			= NULL;
	m_lpPDBGS		= NULL;
	m_lpBackB4flip	= NULL;
	m_cPixelFormat	= 0;
#ifdef _DEBUG
	m_bFullMode		= FALSE;
#else
	m_bFullMode		= TRUE;
#endif
}

DXC_ddraw::~DXC_ddraw()
{
	if (m_hFontInUse != NULL) DeleteObject(m_hFontInUse);
	if (m_lpBackB4flip != NULL) m_lpBackB4flip->Release();
	if (m_lpBackB4 != NULL) m_lpBackB4->Release();
	if (m_lpFrontB4 != NULL) m_lpFrontB4->Release();
	if (m_bFullMode == TRUE)
	{
		if (m_lpDD4 != NULL) m_lpDD4->RestoreDisplayMode();
	}
	if (m_lpDD4 != NULL) m_lpDD4->Release();
}

BOOL DXC_ddraw::bInit(HWND hWnd)
{
 HRESULT        ddVal;
 DDSURFACEDESC2 ddsd;
 int            iS, iD;

	SetRect(&m_rcClipArea, 0,0, 640, 480);

	ddVal = DirectDrawCreateEx(NULL, (VOID**)&m_lpDD4, IID_IDirectDraw7, NULL);
    if (ddVal != DD_OK) return FALSE;

	if( m_bFullMode == TRUE )
	{
		DDSCAPS2       ddscaps;
		// 傈眉拳搁 葛靛捞促.
		ddVal = m_lpDD4->SetCooperativeLevel(hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
		if (ddVal != DD_OK) return FALSE;

		ddVal = m_lpDD4->SetDisplayMode(640, 480, 16,0,0);
		if (ddVal != DD_OK) return FALSE;
		// 橇沸飘 滚欺 积己 
		memset( (VOID *)&ddsd, 0, sizeof(ddsd) );
		ddsd.dwSize = sizeof( ddsd );
		ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
		ddsd.dwBackBufferCount = 1;//2; //v1.3
		ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX;
		
		ddVal = m_lpDD4->CreateSurface(&ddsd, &m_lpFrontB4, NULL);
		if (ddVal != DD_OK) return FALSE;

		ZeroMemory(&ddscaps, sizeof(ddscaps));
		ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
		ddVal = m_lpFrontB4->GetAttachedSurface(&ddscaps, &m_lpBackB4flip);
		if (ddVal != DD_OK) return FALSE;
		SetRect(&m_rcFlipping, 0, 0, 640, 480); // our fictitious sprite bitmap is 
	}
	else
	{
		// 扩档快 葛靛捞促.
		int cx = GetSystemMetrics(SM_CXFULLSCREEN);
		int cy = GetSystemMetrics(SM_CYFULLSCREEN);

		ddVal = m_lpDD4->SetCooperativeLevel(hWnd, DDSCL_NORMAL);
		if (ddVal != DD_OK) return FALSE;
		
		cx = cx/2;
		cy = cy/2;
		if(cy>280) cy -= 40;
		SetWindowPos( hWnd, HWND_TOP, cx-320, cy-240, 640, 480, SWP_SHOWWINDOW);

		// 橇沸飘 滚欺 积己 
		memset( (VOID *)&ddsd, 0, sizeof(ddsd) );
		ddsd.dwSize = sizeof( ddsd );
		ddsd.dwFlags = DDSD_CAPS;
		//ddsd.dwBackBufferCount = 0;
		ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
		
		ddVal = m_lpDD4->CreateSurface(&ddsd, &m_lpFrontB4, NULL);
		if (ddVal != DD_OK) return FALSE;

		SetRect(&m_rcFlipping, cx-320, cy-240, cx+320, cy+240); // our fictitious sprite bitmap is 
	}

	InitFlipToGDI(hWnd);
	// 归滚欺 积己 
	m_lpBackB4 = pCreateOffScreenSurface(640, 480);
	if (m_lpBackB4 == NULL) return FALSE;

	// Pre-draw background surface 滚欺 积己 
	m_lpPDBGS = pCreateOffScreenSurface(640+32, 480+32);
	if (m_lpPDBGS == NULL) return FALSE;

	// 归滚欺狼 林家客 乔摹甫 掘绢柯促. 
	ddsd.dwSize = sizeof(ddsd);
	if (m_lpBackB4->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL) != DD_OK) return FALSE;
	m_pBackB4Addr        = (WORD *)ddsd.lpSurface;
	m_sBackB4Pitch       = (short)ddsd.lPitch >> 1;
	m_lpBackB4->Unlock(NULL);

	// 侨伎备炼甫 舅酒郴 拿矾 抛捞喉阑 积己茄促.
	_TestPixelFormat();
	for (iS = 0; iS < 64; iS++)
	for (iD = 0; iD < 64; iD++) {
		m_lTransRB100[iD][iS] = _CalcMaxValue(iS, iD, 'R', 1, 1.0f);
		m_lTransG100[iD][iS]  = _CalcMaxValue(iS, iD, 'G', 1, 1.0f);

		m_lTransRB70[iD][iS] = _CalcMaxValue(iS, iD, 'R', 1, 0.7f);
		m_lTransG70[iD][iS]  = _CalcMaxValue(iS, iD, 'G', 1, 0.7f);
		
		m_lTransRB50[iD][iS] = _CalcMaxValue(iS, iD, 'R', 1, 0.5f);
		m_lTransG50[iD][iS]  = _CalcMaxValue(iS, iD, 'G', 1, 0.5f);

		m_lTransRB25[iD][iS] = _CalcMaxValue(iS, iD, 'R', 1, 0.25f);
		m_lTransG25[iD][iS]  = _CalcMaxValue(iS, iD, 'G', 1, 0.25f);

		m_lTransRB2[iD][iS] = _CalcMaxValue(iS, iD, 'R', 2, 1.0f);
		m_lTransG2[iD][iS]  = _CalcMaxValue(iS, iD, 'G', 2, 1.0f);

		m_lFadeRB[iD][iS]  = _CalcMinValue(iS, iD, 'R');
		m_lFadeG[iD][iS]   = _CalcMinValue(iS, iD, 'G');

		G_lTransRB100[iD][iS] = _CalcMaxValue(iS, iD, 'R', 1, 1.0f);
		G_lTransG100[iD][iS]  = _CalcMaxValue(iS, iD, 'G', 1, 1.0f);

		G_lTransRB70[iD][iS] = _CalcMaxValue(iS, iD, 'R', 1, 0.7f);
		G_lTransG70[iD][iS]  = _CalcMaxValue(iS, iD, 'G', 1, 0.7f);
		
		G_lTransRB50[iD][iS] = _CalcMaxValue(iS, iD, 'R', 1, 0.5f);
		G_lTransG50[iD][iS]  = _CalcMaxValue(iS, iD, 'G', 1, 0.5f);

		G_lTransRB25[iD][iS] = _CalcMaxValue(iS, iD, 'R', 1, 0.25f);
		G_lTransG25[iD][iS]  = _CalcMaxValue(iS, iD, 'G', 1, 0.25f);

		G_lTransRB2[iD][iS] = _CalcMaxValue(iS, iD, 'R', 2, 1.0f);
		G_lTransG2[iD][iS]  = _CalcMaxValue(iS, iD, 'G', 2, 1.0f);
	}

	m_hFontInUse = NULL;	
#if DEF_LANGUAGE == 1	// 攫绢:Taiwan
	m_hFontInUse = CreateFont(12,0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, CHINESEBIG5_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, NONANTIALIASED_QUALITY, VARIABLE_PITCH, "MingLiu") ;
#endif
#if DEF_LANGUAGE == 2	// 攫绢:Chinese
	m_hFontInUse = CreateFont(12,0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, GB2312_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, NONANTIALIASED_QUALITY, VARIABLE_PITCH, "MingLiu") ;
#endif
#if DEF_LANGUAGE == 3	// 攫绢:Korean
	m_hFontInUse = CreateFont(12,0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, HANGUL_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, NONANTIALIASED_QUALITY, VARIABLE_PITCH, "官帕") ;
#endif
#if DEF_LANGUAGE == 4	// 攫绢:English
	m_hFontInUse = CreateFont(16,0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, NONANTIALIASED_QUALITY, VARIABLE_PITCH, "Comic Sans MS") ;
#endif
#if DEF_LANGUAGE == 5	// 攫绢:Japanese
	m_hFontInUse = CreateFont(12,0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, SHIFTJIS_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, NONANTIALIASED_QUALITY, VARIABLE_PITCH, "MS PGothic") ;
#endif
	m_hDC = NULL;
		
	return TRUE;
}

HRESULT DXC_ddraw::iFlip()
{
	HRESULT ddVal;
	
	if( m_bFullMode )
	{
#ifdef DEF_USING_WIN_IME
		ddVal = m_lpFrontB4->Blt( NULL, m_lpBackB4, NULL, DDBLT_WAIT, NULL );
		if (G_hEditWnd != NULL) {
			if (ddVal != DDERR_SURFACELOST) m_lpDD4->FlipToGDISurface();
		}
#else

#ifdef DEF_HTMLCOMMOM
		if( G_hInternetWnd != NULL ) {
			ddVal = m_lpFrontB4->Blt( NULL, m_lpBackB4, NULL, DDBLT_WAIT, NULL );
			m_lpDD4->FlipToGDISurface();
		}
		else {
			ddVal = m_lpBackB4flip->BltFast( 0, 0, m_lpBackB4, &m_rcFlipping, DDBLTFAST_NOCOLORKEY); // | DDBLTFAST_WAIT);
			ddVal = m_lpFrontB4->Flip(m_lpBackB4flip, DDFLIP_WAIT);
		}
#else
		ddVal = m_lpBackB4flip->BltFast( 0, 0, m_lpBackB4, &m_rcFlipping, DDBLTFAST_NOCOLORKEY); // | DDBLTFAST_WAIT);
		ddVal = m_lpFrontB4->Flip(m_lpBackB4flip, DDFLIP_WAIT);
#endif

#endif
	}
	else
	{
		//SetRect( &m_rcFlipping, 0, 0, 1152, 864 );
		ddVal = m_lpFrontB4->Blt(&m_rcFlipping, m_lpBackB4, NULL, DDBLT_WAIT, NULL);
	}

	if (ddVal == DDERR_SURFACELOST) {
		DDSURFACEDESC2 ddsd2;
		// 辑其捞胶啊 颊角登菌促. 汗备茄促. 
		m_lpFrontB4->Restore();
		m_lpBackB4->Restore();
		
		// 归滚欺狼 林家甫 掘绢柯促. 
		ddsd2.dwSize = sizeof(ddsd2);
		if (m_lpBackB4->Lock(NULL, &ddsd2, DDLOCK_WAIT, NULL) != DD_OK) return FALSE;
		m_pBackB4Addr  = (WORD *)ddsd2.lpSurface;
		m_lpBackB4->Unlock(NULL);

		return DDERR_SURFACELOST;
	}
	return DD_OK;
}

void DXC_ddraw::ChangeDisplayMode(HWND hWnd)
{
	HRESULT        ddVal;
	DDSURFACEDESC2 ddsd;

	if (m_lpBackB4flip != NULL)
	{
		m_lpBackB4flip->Release();
		m_lpBackB4flip = NULL;
	}
	if (m_lpBackB4 != NULL) m_lpBackB4->Release();
	if (m_lpFrontB4 != NULL) m_lpFrontB4->Release();
	if (m_lpDD4 != NULL)
	{
		if (m_bFullMode == TRUE) m_lpDD4->RestoreDisplayMode();
	}

	if( m_bFullMode == TRUE )
	{
		int cx = GetSystemMetrics(SM_CXFULLSCREEN);
		int cy = GetSystemMetrics(SM_CYFULLSCREEN);

		ddVal = m_lpDD4->SetCooperativeLevel(hWnd, DDSCL_NORMAL);
		if (ddVal != DD_OK) return;

		cx = cx/2;
		cy = cy/2;
		if(cy>280) cy -= 40;
		SetWindowPos( hWnd, NULL, cx-320, cy-240, 640, 480, SWP_SHOWWINDOW);

		// 橇沸飘 滚欺 积己 
		memset( (VOID *)&ddsd, 0, sizeof(ddsd) );
		ddsd.dwSize = sizeof( ddsd );
		ddsd.dwFlags = DDSD_CAPS;
		//ddsd.dwBackBufferCount = 0;
		ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
		
		ddVal = m_lpDD4->CreateSurface(&ddsd, &m_lpFrontB4, NULL);
		if (ddVal != DD_OK) return;

		SetRect(&m_rcFlipping, cx-320, cy-240, cx+320, cy+240); // our fictitious sprite bitmap is 
		m_bFullMode = FALSE;
	}
	else
	{
		DDSCAPS2       ddscaps;
		// 傈眉拳搁 葛靛捞促.
		ddVal = m_lpDD4->SetCooperativeLevel(hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
		if (ddVal != DD_OK) return;

		ddVal = m_lpDD4->SetDisplayMode(640, 480, 16,0,0);
		if (ddVal != DD_OK) return;
		// 橇沸飘 滚欺 积己 
		memset( (VOID *)&ddsd, 0, sizeof(ddsd) );
		ddsd.dwSize = sizeof( ddsd );
		ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
		ddsd.dwBackBufferCount = 1;//2; //v1.3
		ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX;
		
		ddVal = m_lpDD4->CreateSurface(&ddsd, &m_lpFrontB4, NULL);
		if (ddVal != DD_OK) return;

		ZeroMemory(&ddscaps, sizeof(ddscaps));
		ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
		ddVal = m_lpFrontB4->GetAttachedSurface(&ddscaps, &m_lpBackB4flip);
		if (ddVal != DD_OK) return;
		SetRect(&m_rcFlipping, 0, 0, 640, 480); // our fictitious sprite bitmap is 
		m_bFullMode = TRUE;
	}
	InitFlipToGDI(hWnd);
	// 归滚欺 积己 
	m_lpBackB4 = pCreateOffScreenSurface(640, 480);
	if (m_lpBackB4 == NULL) return;

	// Pre-draw background surface 滚欺 积己 
	m_lpPDBGS = pCreateOffScreenSurface(640+32, 480+32);
	if (m_lpPDBGS == NULL) return;

	// 归滚欺狼 林家客 乔摹甫 掘绢柯促. 
	ddsd.dwSize = sizeof(ddsd);
	if (m_lpBackB4->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL) != DD_OK) return;
	m_pBackB4Addr        = (WORD *)ddsd.lpSurface;
	m_sBackB4Pitch       = (short)ddsd.lPitch >> 1;
	m_lpBackB4->Unlock(NULL);
}

IDirectDrawSurface7 * DXC_ddraw::pCreateOffScreenSurface(WORD wSzX, WORD wSzY)
{
	DDSURFACEDESC2 ddsd;
	IDirectDrawSurface7 * pdds4;

    ZeroMemory(&ddsd, sizeof(ddsd));
	if ((wSzX % 4) != 0) wSzX += 4 - (wSzX % 4);
    ddsd.dwSize  = sizeof(ddsd);
    ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT |DDSD_WIDTH;
	ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
	ddsd.dwWidth  = (DWORD)wSzX;
    ddsd.dwHeight = (DWORD)wSzY;
    if (m_lpDD4->CreateSurface(&ddsd, &pdds4, NULL) != DD_OK) return NULL;
	return pdds4;
}

HRESULT DXC_ddraw::iSetColorKey(IDirectDrawSurface7 * pdds4, COLORREF rgb)
{
 DDCOLORKEY ddck;

	ddck.dwColorSpaceLowValue  = _dwColorMatch(pdds4, rgb);
    ddck.dwColorSpaceHighValue = ddck.dwColorSpaceLowValue;
    return pdds4->SetColorKey(DDCKEY_SRCBLT, &ddck);
}

HRESULT DXC_ddraw::iSetColorKey(IDirectDrawSurface7 * pdds4, WORD wColorKey)
{
 DDCOLORKEY ddck;

	ddck.dwColorSpaceLowValue  = _dwColorMatch(pdds4, wColorKey);
    ddck.dwColorSpaceHighValue = ddck.dwColorSpaceLowValue;
    return pdds4->SetColorKey(DDCKEY_SRCBLT, &ddck);
}

DWORD DXC_ddraw::_dwColorMatch(IDirectDrawSurface7 * pdds4, COLORREF rgb)
{
 COLORREF rgbT;
 HDC hdc;
 DWORD dw = CLR_INVALID;
 DDSURFACEDESC2 ddsd2;
 HRESULT hres;

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

    ddsd2.dwSize = sizeof(ddsd2);
    while ((hres = pdds4->Lock(NULL, &ddsd2, 0, NULL)) == DDERR_WASSTILLDRAWING);

    if (hres == DD_OK)
    {
        dw  = *(DWORD *)ddsd2.lpSurface;                     
        dw &= (1 << ddsd2.ddpfPixelFormat.dwRGBBitCount)-1;  
        pdds4->Unlock(NULL);
    }

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

    return dw;
}

DWORD DXC_ddraw::_dwColorMatch(IDirectDrawSurface7 * pdds4, WORD wColorKey)
{
 DWORD dw = CLR_INVALID, * dwp;
 DDSURFACEDESC2 ddsd2;
 HRESULT hres;
   
    ddsd2.dwSize = sizeof(ddsd2);
    while ((hres = pdds4->Lock(NULL, &ddsd2, 0, NULL)) == DDERR_WASSTILLDRAWING);

    if (hres == DD_OK)
    {
        dwp = (DWORD *)ddsd2.lpSurface;
		*dwp = (DWORD)wColorKey;
		dw  = *(DWORD *)ddsd2.lpSurface;                     
        dw &= (1 << ddsd2.ddpfPixelFormat.dwRGBBitCount)-1;  
        pdds4->Unlock(NULL);
    }

    return dw;
}

void DXC_ddraw::TextOut(int x, int y, char * cStr, COLORREF rgb)

⌨️ 快捷键说明

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