📄 direct_draw.h
字号:
/*! Directdraw 功能封装
* \author nodman
* \date 2003-6-13
*/
#ifndef _DIRECT_DRAW_H
#define _DIRECT_DRAW_H
#include "ddraw.h"
#include "atlbase.h"
#include "fcc.h"
class dd_caps: public DDCAPS
{
public:
dd_caps(){init();}
void init()
{
ZeroMemory(this, sizeof(DDCAPS));
dwSize = sizeof(DDCAPS);
}
};
/// DDSURFACEDESC 封装.
class ddsd: public DDSURFACEDESC
{
public:
ddsd(){init(); set_flags();}
void init()
{
ZeroMemory(this, sizeof(DDSURFACEDESC));
dwSize = sizeof(DDSURFACEDESC);
}
void set_fourcc(DWORD fourcc, int bitcount)
{
ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
ddpfPixelFormat.dwFlags = DDPF_FOURCC;
ddpfPixelFormat.dwFourCC = fourcc;
ddpfPixelFormat.dwYUVBitCount = bitcount;
}
void set_flags(DWORD flags=DDSD_CAPS)
{
dwFlags = flags;
}
};
/// clipper 封装.
class dd_clipper
{
CComPtr<IDirectDrawClipper> h; ///< clipper handle
public:
operator IDirectDrawClipper*(){ return h;}
IDirectDrawClipper** operator&(){return &h;}
IDirectDrawClipper* operator->(){return h;}
~dd_clipper(){destroy();}
void destroy(){h.Release();}
};
/// directdraw 平面.
class dd_surface
{
CComPtr<IDirectDrawSurface> h; ///< surface handle
public:
operator IDirectDrawSurface*(){return h;}
IDirectDrawSurface* operator->(){return h;}
IDirectDrawSurface** operator&(){return &h;}
~dd_surface(){ destroy();}
void destroy(){ h.Release();}
};
/// directdraw 封装类.
class direct_draw
{
dd_surface pm; ///< 主平面
dd_surface bk; ///< 背平面
dd_clipper cl; ///< clipper
CComPtr<IDirectDraw> h; ///< directdraw handle
int w; ///< 背平面宽度
int hi; ///< 背平面高度
int bc; ///< 象素位数
HWND o; ///< 依靠窗口
CRect rc; ///< 依靠窗口位置
/// 建立主平面.
/// @param surf 要建立的主平面对象.
/// @return true 成功, 否则false.
bool create_pm_surface();
/// 建立背平面.
/// @param surf 要建立的背平面对象.
/// @param width 平面宽度.
/// @param height 平面高度.
/// @param fourcc 象素格式, 0 表示RGB32.
/// @param bitcount 每象素位数
/// @return true 成功, 否则false.
bool create_bk_surface(int width, int height, DWORD fourcc, int bitcount);
/// 设置裁减区域.
/// @param clipper 要创建的directdraw clipper对象
/// @param owner 裁减窗口.
/// @return true 成功, 否则false.
bool create_clipper(HWND owner);
byte* lock();
void unlock();
void store(void* buf);
void blt();
public:
/// 构造函数.
direct_draw():w(0), hi(0), o(NULL), bc(0){}
/// 析构函数.
~direct_draw()
{
destroy();
}
/// 建立directdraw对象.
/// @param owner 依靠窗口
/// @param width 背平面宽度
/// @param height 背平面高度
/// @param fourcc 象素格式, 0 表示RGB
/// @param bitcount 每象素位数
/// @return true 成功, 否则false.
bool create(HWND owner, int width, int height, DWORD fourcc, int bitcount);
/// 销毁directdraw对象.
void destroy()
{
cl.destroy();
pm.destroy();
bk.destroy();
h.Release();
w = 0;
hi = 0;
bc = 0;
o = NULL;
}
/// 画之
void draw(void* buf, DWORD size=-1);
/// 更新窗口大小
void update_bound();
//////////////////////////////////////////////////////////////////////////
/// @return 平面宽度
int width() const {return w;}
/// @return 平面高度
int height() const {return hi;}
};
#include "direct_draw_impl.h"
#endif // _DIRECT_DRAW_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -