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

📄 instsurfwithddraw.h

📁 跨平台2D引擎
💻 H
字号:
//instSurfWithDDraw.h
#ifndef INST_SURFWIDTHDDRAW_H
#define INST_SURFWIDTHDDRAW_H


#include <instTypes.h>
#include <instDefines.h>
#include <instStr.h>
#include <instISurf.h>

#include <ddraw.h>

#ifdef DrawText
#undef DrawText
#endif

namespace inst
{


class CSurf:virtual public ISurf
{
private:
	static IDirectDraw7 *s_pddraw;
	static COLOR s_DefaultColorKey;
	static Bool s_DefaultColorKeyEnabled;

	IDirectDrawSurface7 *m_pdds;
//	COLOR m_ColorKey;
private:
	HBITMAP LoadBmp(const CStr &path,POS *pw,POS *ph);
	void TmpCreateSurface(POS w,POS h,Bool bSysMemOnly);
public:
	static void SetDDraw(IDirectDraw7 *pddraw); //如果pddraw=false那么设置会失败(s_pddraw不改变!)
	static void SetDefaultColorKey(Bool enabled,COLOR key);

	virtual void *GetAddr()const{ return (void *)this; }
	virtual CStr GetClass()const{ return L"inst::ui::CSurf"; }
	virtual Bool IsA(const CStr &name)const{ return L"inst::i3d::CSurf" || ISurf::IsA(name); }

	CSurf(IDirectDrawSurface7 *pdds);
	CSurf(POS w,POS h,Bool bSysMemOnly=False);
	CSurf(const CStr &path,POS w,POS h,Bool bSysMemOnly=False); //w,h设为零,以使用bmp自身的尺寸
	CSurf(const CStr &path,POS wsurf,POS hsurf,
			POS wbmp,POS hbmp,Bool bSysMemOnly=False); //wbmp,hbmp设为零,以使用bmp自身的尺寸
	virtual ~CSurf();

	IDirectDrawSurface7 *GetDDS()const{ return m_pdds; }
	DDSURFACEDESC2 GetDDSDesc()const{ DDSURFACEDESC2 ddsd; ZeroMemory(&ddsd,sizeof(ddsd)); ddsd.dwSize=sizeof(ddsd);
										if(m_pdds)m_pdds->GetSurfaceDesc(&ddsd); return ddsd; }
private:
	static UInt32 ToGdiColor(COLOR color)
	{
		return RGB(GetR(color),GetG(color),GetB(color));
	}
	static COLOR ToInstColor(UInt32 gdi) //这个函数和gdi相关,没有通用性,不需要放在instDefines.h中
	{
		UByte r=(UByte) ( gdi & 0xFF );
		UByte g=(UByte) ( ( gdi & 0xFF00 ) >> 8 );
		UByte b=(UByte) ( ( gdi & 0xFF0000 ) >> 16 );
		return Rgb(r,g,b);
	}
	static UInt32 ToGdiDTFlags(DRAWTEXTFLAGS dtf){ return (dtf & DRAWTEXTFLAGS_MASK) | DT_NOPREFIX; }
	static HFONT ToGdiFont(const IFont *font);
public:
	virtual POS GetW()const{ return (POS)GetDDSDesc().dwWidth; }
	virtual POS GetH()const{ return (POS)GetDDSDesc().dwHeight; }

	//作为源色彩键
	COLOR GetColorKey();
	void SetColorKey(COLOR key);
	
	//越界检查!
	virtual void Blt(POS xdest,POS ydest,
		ISurf *surf,POS xsrc,POS ysrc,POS w,POS h,ALPHA alpha=255,Bool bHasColorKey=True);
	virtual void StretchBlt(POS xdest,POS ydest,POS wdest,POS hdest,
		ISurf *surf,POS xsrc,POS ysrc,POS wsrc,POS hsrc,ALPHA alpha=255,Bool bHasColorKey=True){return;}
	//如果本类需要为3缓冲操作等提供DONOTWAIT的Blt功能,(ISurf接口不支持)那么应当另外写一个函数
	virtual void BltRgn(POS xdest,POS ydest,POS rx,POS ry,POS rw,POS rh,
		ISurf *surf,POS xsrc,POS ysrc,POS w,POS h,ALPHA alpha=255,Bool bHasColorKey=True);
	virtual void StretchBltRgn(POS xdest,POS ydest,POS wdest,POS hdest,POS rx,POS ry,POS rw,POS rh,
		ISurf *surf,POS xsrc,POS ysrc,POS wsrc,POS hsrc,ALPHA alpha=255,Bool bHasColorKey=True){return;}
private:
	static Int32 ToGdiLineStyle(LINESTYLE style);
	static LINESTYLE ToInstLineStyle(Int32 gdi);
public:
	virtual void SetPixel(POS x,POS y,COLOR color);
	virtual COLOR GetPixel(POS x,POS y)const;

	virtual void DrawLine(POS x1,POS y1,POS x2,POS y2,COLOR color,LINESTYLE ls=LS_SOLID);
	virtual void DrawRect(POS x,POS y,POS w,POS h,COLOR color,LINESTYLE ls=LS_SOLID);
	virtual void DrawRoundRect(POS x,POS y,POS w,POS h,POS arcw,POS arch,COLOR color,LINESTYLE ls=LS_SOLID);
	virtual void DrawEllipse(POS x,POS y,POS w,POS h,COLOR color,LINESTYLE ls=LS_SOLID);

	virtual void FillRect(POS x,POS y,POS w,POS h,COLOR color,ALPHA alpha=255);
	virtual void FillRoundRect(POS x,POS y,POS w,POS h,POS arcw,POS arch,COLOR color,ALPHA alpha=255);
	virtual void FillEllipse(POS x,POS y,POS w,POS h,COLOR color,ALPHA alpha=255);

//DT_WORDBREAK进行自动换行。如用SetTextAlign函数设置了TA_UPDATECP标志,这里的设置则无效
//TA_NOUPDATECP = 0		TA_UPDATECP = 1
//所以最好是先设置SetTextAlgin(0)!
	virtual void DrawText(const CStr &str,POS x,POS y,POS w,POS h,const IFont *font,COLOR color,DRAWTEXTFLAGS flags=0,POS shadow=0,COLOR shadowcolor=Rgb(0,0,0));

//	virtual Bool IsLost();
//	virtual void Restore();
};


}// end of ns inst


#endif

⌨️ 快捷键说明

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