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

📄 display.h

📁 VC++ DEMO, used for the beginners and the amour
💻 H
字号:
#ifdef CGE_HEADER_H
#ifndef CGE_DISPLAY_H
#define CGE_DISPLAY_H

namespace CGE
{
	namespace DISPLAY_SYSTEM
	{	
		class BEHAVIOR;

		typedef class MEMBER
		{
		public:
			MEMBER()
				:Behavior(0)
			{};
			virtual ~MEMBER(){};
			virtual BOOL Install() = 0;
			virtual BOOL UnInstall() = 0;
			BEHAVIOR*	Behavior;
		}MEMBER,*LPMEMBER;

		typedef class BEHAVIOR 
		{
		public:
			BEHAVIOR();
			virtual ~BEHAVIOR();
		public:		
			BOOL BehaviorCreate(MEMBER * Mem,VOID * hWnd,LONG w,LONG h,BOOL bWindowed = TRUE);
			BOOL SetRenderBehavior( LONG Width, LONG Height,BOOL bWindowed = TRUE);
			BOOL SetDefaultVertexBuffer( LONG Length );
			BOOL CheckCooperativeLevel();
			LONG BackBufferHeight();
			LONG BackBufferWidth();
			LPDIRECT3DDEVICE8 GetSafeDevice() { return DEVICE; }
			D3DFORMAT CheckDisplayMode(LONG nWidth,LONG nHeight,INT nDepth);
			LPDIRECT3DVERTEXBUFFER8 GetSafeDefaultVertBuffer() { return DEFAULT_VERT_BUFFER; }
			LONG GetVertexBufferLength() { return VERT_BUFFER_LENGTH; }
		protected:
			LPDIRECT3DDEVICE8			DEVICE;
			LPDIRECT3D8					DIRECTX;
			LPDIRECT3DSURFACE8			MOUSE_SURFACE;
			LPDIRECT3DSURFACE8			BACK_SURFACE;
			LPDIRECT3DVERTEXBUFFER8		DEFAULT_VERT_BUFFER;
			LONG					    VERT_BUFFER_LENGTH;
			D3DPRESENT_PARAMETERS	    D3DPARAMETER;
			MEMBER* 					MEMBERVAR;		
		}*LPBEHAVIOR;
		
		CGE_INLINE
			BOOL BEHAVIOR::BehaviorCreate(MEMBER * Mem,VOID * hWnd,LONG w,LONG h,BOOL bWindowed)
		{
			
			DIRECTX = Direct3DCreate8(D3D_SDK_VERSION);
			if(DIRECTX == NULL)
			{
				return FALSE;
			}
			if( (MEMBERVAR = Mem) == NULL ) return FALSE;
			
			MEMBERVAR->Behavior = this;
			ZeroMemory(&D3DPARAMETER,sizeof(D3DPRESENT_PARAMETERS));
			D3DPARAMETER.Windowed = bWindowed;
			D3DPARAMETER.BackBufferCount = 1;
			D3DPARAMETER.BackBufferWidth = w;
			D3DPARAMETER.BackBufferHeight = h;
			D3DPARAMETER.hDeviceWindow = (HWND)hWnd;
			D3DPARAMETER.SwapEffect = bWindowed ? D3DSWAPEFFECT_FLIP:D3DSWAPEFFECT_COPY_VSYNC;
			D3DPARAMETER.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
			D3DPARAMETER.FullScreen_PresentationInterval = bWindowed ? 0:D3DPRESENT_INTERVAL_ONE;
			D3DDISPLAYMODE d3ddm;
			if ( bWindowed ) 
			{
				DIRECTX->GetAdapterDisplayMode(0,&d3ddm);
				D3DPARAMETER.BackBufferFormat = d3ddm.Format;
			}
			else
			{
				d3ddm.Format = CheckDisplayMode(w , h, 32);
				if(d3ddm.Format != D3DFMT_UNKNOWN)
				{
					D3DPARAMETER.BackBufferFormat = d3ddm.Format;
				}
				else
				{
					d3ddm.Format = CheckDisplayMode(w, h, 16);
					if( d3ddm.Format != D3DFMT_UNKNOWN)
					{
						D3DPARAMETER.BackBufferFormat = d3ddm.Format;
					}
					else
					{
						return FALSE;
					}
				}
			}	
			if(DIRECTX->CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, d3ddm.Format, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D32) == D3D_OK)
			{
				D3DPARAMETER.AutoDepthStencilFormat = D3DFMT_D32;
				D3DPARAMETER.EnableAutoDepthStencil = TRUE;
			}
			else if(DIRECTX->CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, d3ddm.Format, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D24X8) == D3D_OK)
			{
				D3DPARAMETER.AutoDepthStencilFormat = D3DFMT_D24X8;
				D3DPARAMETER.EnableAutoDepthStencil = TRUE;
			}
			else if(DIRECTX->CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, d3ddm.Format, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D16) == D3D_OK)
			{
				D3DPARAMETER.AutoDepthStencilFormat = D3DFMT_D16;
				D3DPARAMETER.EnableAutoDepthStencil = TRUE;
			}
			else
			{
				D3DPARAMETER.EnableAutoDepthStencil = FALSE;
			}
			
			if(FAILED(DIRECTX->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DPARAMETER.hDeviceWindow, 
				D3DCREATE_SOFTWARE_VERTEXPROCESSING, &D3DPARAMETER, &DEVICE)))
			{
				SAFE_RELEASE(DIRECTX);
				return FALSE;
			}
			if(FAILED(DEVICE->GetBackBuffer(0,D3DBACKBUFFER_TYPE_MONO,&BACK_SURFACE)))
			{
				SAFE_RELEASE(DIRECTX);
				SAFE_RELEASE(DEVICE);
				return FALSE;
			}
			
			return MEMBERVAR->Install();	
		}
		CGE_INLINE
			D3DFORMAT BEHAVIOR::CheckDisplayMode(LONG nWidth, LONG nHeight, INT nDepth)
		{
			register UINT x;
			D3DDISPLAYMODE d3ddm;
			
			for(x = 0; x < DIRECTX->GetAdapterModeCount(0); x++)
			{
				DIRECTX->EnumAdapterModes(0, x, &d3ddm);
				if(d3ddm.Width == nWidth)
				{
					if(d3ddm.Height == nHeight)
					{
						if((d3ddm.Format == D3DFMT_R5G6B5) || (d3ddm.Format == D3DFMT_X1R5G5B5) || (d3ddm.Format == D3DFMT_X4R4G4B4))
						{
							if(nDepth == 16)
							{
								return d3ddm.Format;
							}
						}
						else if((d3ddm.Format == D3DFMT_R8G8B8) || (d3ddm.Format == D3DFMT_X8R8G8B8))
						{
							if(nDepth == 32)
							{
								return d3ddm.Format;
							}
						}
					}
				}
			}
			
			return D3DFMT_UNKNOWN;
		}
		CGE_INLINE
			BOOL BEHAVIOR::SetDefaultVertexBuffer(LONG Length)
		{
			SAFE_RELEASE(DEFAULT_VERT_BUFFER);
			VERT_BUFFER_LENGTH = Length;
			if(FAILED(DEVICE->CreateVertexBuffer( VERT_BUFFER_LENGTH , 
				D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY | D3DUSAGE_POINTS, 
				0, D3DPOOL_DEFAULT, &DEFAULT_VERT_BUFFER )))
			{
				return FALSE;
			}
			return TRUE;
		}
		CGE_INLINE
			BOOL BEHAVIOR::CheckCooperativeLevel()
		{
			HRESULT hr;
			if( FAILED( hr = DEVICE->TestCooperativeLevel() ) )
			{
				// 当设备丢失时,要等到设备有效后方可继续
				if( D3DERR_DEVICELOST==hr )
					return FALSE;
				// 重置设备
				if( D3DERR_DEVICENOTRESET==hr )
				{
					if ( MEMBERVAR == NULL )
						return FALSE;
					// 在重置前必须要释放资源
					if ( TRUE == MEMBERVAR->UnInstall() )
					{
						SAFE_RELEASE(BACK_SURFACE);
						SAFE_RELEASE(DEFAULT_VERT_BUFFER);
						if( FAILED( DEVICE->Reset(&D3DPARAMETER) ) ) 
							return FALSE;
						if(FAILED(DEVICE->GetBackBuffer(0,D3DBACKBUFFER_TYPE_MONO,&BACK_SURFACE)))
						{
							SAFE_RELEASE(DIRECTX);
							SAFE_RELEASE(DEVICE);
							return FALSE;
						}	
						if ( SetDefaultVertexBuffer(VERT_BUFFER_LENGTH) == FALSE )
						{
							SAFE_RELEASE(DIRECTX);
							SAFE_RELEASE(DEVICE);
							return FALSE;
						}
						// 在重置后必须要重新载入资源
						return MEMBERVAR->Install();
					}
				}
				return FALSE;
			}
			return TRUE;
		}
		CGE_INLINE
			BOOL BEHAVIOR::SetRenderBehavior(LONG Width, LONG Height, BOOL bWindowed)
		{
			if( !Width || !Height ) 
				return FALSE;
			
			D3DPARAMETER.BackBufferWidth = Width;
			D3DPARAMETER.BackBufferHeight = Height;
			D3DDISPLAYMODE d3ddm;
			if ( bWindowed ) 
			{
				DIRECTX->GetAdapterDisplayMode(0,&d3ddm);
				D3DPARAMETER.BackBufferFormat = d3ddm.Format;
			}
			else
			{
				d3ddm.Format = CheckDisplayMode(Width , Height, 32);
				if(d3ddm.Format != D3DFMT_UNKNOWN)
				{
					D3DPARAMETER.BackBufferFormat = d3ddm.Format;
				}
				else
				{
					d3ddm.Format = CheckDisplayMode(Width, Height, 16);
					if( d3ddm.Format != D3DFMT_UNKNOWN)
					{
						D3DPARAMETER.BackBufferFormat = d3ddm.Format;
					}
					else
					{
						return FALSE;
					}
				}
			}
			if ( SUCCEEDED(DEVICE->Reset(&D3DPARAMETER)))
			{
				return TRUE;
			}		
			return CheckCooperativeLevel();
		}

		CGE_INLINE
			LONG BEHAVIOR::BackBufferWidth()
		{
			D3DSURFACE_DESC desc;
			if ( BACK_SURFACE )
			{
				BACK_SURFACE->GetDesc(&desc);
				return desc.Width;
			}
			return -1;
		}
		CGE_INLINE
			LONG BEHAVIOR::BackBufferHeight()
		{
			D3DSURFACE_DESC desc;
			if ( BACK_SURFACE )
			{
				BACK_SURFACE->GetDesc(&desc);
				return desc.Height;
			}
			return -1;
		}
		CGE_INLINE
			BEHAVIOR::BEHAVIOR()
		{
			DIRECTX = NULL;
			DEVICE = NULL;
			BACK_SURFACE = NULL;
			DEFAULT_VERT_BUFFER = NULL;
			MOUSE_SURFACE = NULL;
			VERT_BUFFER_LENGTH = NULL;
			MEMBERVAR = NULL;
		}
		CGE_INLINE
			BEHAVIOR::~BEHAVIOR()
		{
			SAFE_RELEASE(MOUSE_SURFACE);
			SAFE_RELEASE(DEFAULT_VERT_BUFFER);
			SAFE_RELEASE(DEVICE);
			SAFE_RELEASE(BACK_SURFACE);
			SAFE_RELEASE(DIRECTX);
			SAFE_DELETE(MEMBERVAR);
		}
	}
}
#endif
#endif //

⌨️ 快捷键说明

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