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

📄 direct_draw.h

📁 实时监控
💻 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 + -