?? directdraw.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 + -