📄 instsurfwithddraw.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 + -