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

📄 directdraw.cpp

📁 一个简单的地图编辑器的源码,很适合用来学习
💻 CPP
字号:
// DirectDraw.cpp: implementation of the CDirectDraw class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "DirectDraw.h"

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

CDirectDraw::CDirectDraw()
{
	lpDD=NULL;
	lpDDSPrimary=NULL;
	lpDDSBack=NULL;
//	lpDDSOther=NULL;
	lpClip=NULL;
}

CDirectDraw::~CDirectDraw()
{

	if(lpDDSPrimary!=NULL)
    {
		lpDDSPrimary->Release();
        lpDDSPrimary= NULL;
    }

/*	if(lpDDSOther!=NULL)
	{
		lpDDSOther->Release();
		lpDDSOther=NULL;
	}
*/
	if(lpClip!=NULL)
	{
		lpClip->Release();
		lpClip=NULL;
	}

	if (lpDD!=NULL)                   
	{
		lpDD->Release();
		lpDD=NULL;
	}
}

//------ 初始化DirectDraw-------//
BOOL CDirectDraw::Create(HWND hWnd)
{
	HRESULT ddrval;
	LPDIRECTDRAW pDD;


    // Create the main DirectDraw object
    ddrval = DirectDrawCreate(NULL, &pDD, NULL);
    if (ddrval != DD_OK)
		return FALSE;

    // Fetch DirectDraw4 interface
    ddrval = pDD->QueryInterface(IID_IDirectDraw4, (LPVOID *) & lpDD);
    if (ddrval != DD_OK)
		return FALSE;

    // Set our cooperative level
    ddrval = lpDD->SetCooperativeLevel(hWnd,/*DDSCL_NORMAL*/DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN );
    if (ddrval != DD_OK)
		return FALSE;

	// create the clipper
	ddrval= lpDD->CreateClipper(NULL,&lpClip,NULL);
    if (ddrval != DD_OK)
		return FALSE;

	// set the window for the clipper
	lpClip->SetHWnd(0,hWnd);

	// Set the display mode
	ddrval = lpDD->SetDisplayMode(800,600,16,0,0);
	if (ddrval !=DD_OK)
		return FALSE;

    // Create the primary surface with 1 back buffer

	DDSCAPS2 ddscaps;
	ZeroMemory(&ddsd,sizeof(ddsd));
    ddsd.dwSize = sizeof( ddsd );
    ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
    ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |
                          DDSCAPS_FLIP | 
                          DDSCAPS_COMPLEX;
    ddsd.dwBackBufferCount = 1;
    ddrval = lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL );
	if (ddrval!=DD_OK)
		return FALSE;

	// Set the Clipper for the Primary Surface
	lpDDSPrimary->SetClipper(lpClip);

	// Fetch back buffer interface
	ddscaps.dwCaps=DDSCAPS_BACKBUFFER;
	ddrval=lpDDSPrimary->GetAttachedSurface(&ddscaps,&lpDDSBack);
	if (ddrval!=DD_OK)
		return FALSE;

/*
	ZeroMemory(&ddsd, sizeof(ddsd));
    ddsd.dwSize         = sizeof(ddsd);
    ddsd.dwFlags        = DDSD_CAPS | DDSD_HEIGHT |DDSD_WIDTH;
	ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
	ddsd.dwWidth        = 800;
	ddsd.dwHeight       = 600;

    ddrval = lpDD->CreateSurface(&ddsd, &lpDDSOther, NULL);
    if (ddrval != DD_OK)
        return FALSE;
*/
	// 返回成功
	return TRUE;
}

void CDirectDraw::CleanSurface()
{
	DWORD Color=RGB(0,0,0);
	DDBLTFX ddfx;
	ddfx.dwSize=sizeof(ddfx);
	ddfx.dwFillColor=Color;
	lpDDSPrimary->Blt(NULL,NULL,NULL,DDBLT_COLORFILL,&ddfx);
}


DWORD CDirectDraw::DDColorMatch(IDirectDrawSurface7 *pdds, COLORREF rgb)
{
	COLORREF rgbT;
    HDC hdc;
    DWORD dw = CLR_INVALID;
    DDSURFACEDESC2 ddsd;
    HRESULT hres;

    //
    //  use GDI SetPixel to color match for us
    //
    if (rgb != CLR_INVALID && pdds->GetDC(&hdc) == DD_OK)
    {
	rgbT = GetPixel(hdc, 0, 0);             // save current pixel value
	SetPixel(hdc, 0, 0, rgb);               // set our value
	pdds->ReleaseDC(hdc);
    }

    //
    // now lock the surface so we can read back the converted color
    //
    ddsd.dwSize = sizeof(ddsd);
    while ((hres = pdds->Lock(NULL, &ddsd, 0, NULL)) == DDERR_WASSTILLDRAWING)
	;

    if (hres == DD_OK)
    {
	dw  = *(DWORD *)ddsd.lpSurface;                     // get DWORD
        if(ddsd.ddpfPixelFormat.dwRGBBitCount < 32)
            dw &= (1 << ddsd.ddpfPixelFormat.dwRGBBitCount)-1;  // mask it to bpp
	pdds->Unlock(NULL);
    }

    //
    //  now put the color that was there back.
    //
    if (rgb != CLR_INVALID && pdds->GetDC(&hdc) == DD_OK)
    {
	SetPixel(hdc, 0, 0, rgbT);
	pdds->ReleaseDC(hdc);
    }

    return dw;

}

HRESULT CDirectDraw::DDSetColorKey(IDirectDrawSurface7 *pdds, COLORREF rgb)
{
    DDCOLORKEY          ddck;

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


//-------- 设置透明色 ---------//
DDCOLORKEY CDirectDraw::GKeyColor()
{
	DWORD KeyColor;

	// 得到刷子的格式
	DDPIXELFORMAT ddpf;
	ddpf.dwSize=sizeof(ddpf);
	lpDDSPrimary->GetPixelFormat(&ddpf);

	// Determine proper key for pixel format
	KeyColor = ddpf.dwGBitMask;

	// set color keys
	DDCOLORKEY key;
	key.dwColorSpaceLowValue = KeyColor;
	key.dwColorSpaceHighValue = KeyColor;

	return key;
}

⌨️ 快捷键说明

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