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

📄 core_graphics.h

📁 旋转图像Demo和其源代码
💻 H
字号:
/**************************************************
       图像处理和DirectDraw主干模块
Author:  LittleFish     QQ:93663886 
E-Mail:  kittyfish_1981@yahoo.com.cn
Blog:    http://blog.csdn.net/kittyfish
真诚的期待你提出改良方法或程序BUG
**************************************************/

#ifndef _CORE_GRAPHICS_H_
#define _CORE_GRAPHICS_H_

#include "Core_Common.h"

//
#include "Core_Input.h"
#include "Core_Sound.h"


class cGraphics;
class cDirectDraw;

/*全局变量*/
extern cDirectDraw* g_pDirectDraw;

class cGraphics
{
public:
	cGraphics();
	cGraphics( int width, int height );
	~cGraphics();

public:
	BOOL Create( int width, int height );
	BOOL CreateFromBitmap( TCHAR* bmpFileName );
	BOOL Load( TCHAR* bmpFileName );

	BOOL SetClipper( LPDIRECTDRAWCLIPPER lpDDC, HWND hWnd );
	BOOL SetColorKey( COLORREF rgb );
	BOOL ColorFill( COLORREF rgb );

	BOOL LoadBitmap( TCHAR* bmpFileName, int width=0, int height=0 );
	BOOL LoadBitmap( HBITMAP hBmp, int xSrc, int ySrc, int srcWidth, int srcHeight );
	BOOL LoadBitmap( HBITMAP hBmp, int left, int top, int xSrc, int ySrc, int srcWidth, int srcHeight );
	BOOL LoadBitmap( TCHAR* bmpFileName, int xSrc, int ySrc, int srcWidth, int srcHeight );
	BOOL LoadBitmap( TCHAR* bmpFileName, int left, int top, int xSrc, int ySrc, int srcWidth, int srcHeight );

	BOOL LoadGraphics( cGraphics* srcGraphics, LPRECT srcRect=NULL );
	BOOL LoadGraphics( cGraphics* srcGraphics, int left, int top, LPRECT srcRect=NULL );
	BOOL LoadGraphics( cGraphics* srcGraphics, int xSrc, int ySrc, int xWidth, int yHeight );
	BOOL LoadGraphics( cGraphics* srcGraphics, int left, int top, int xSrc, int ySrc, int xWidth, int yHeight );

	BOOL DisplayText( TCHAR* text,int left,int top,COLORREF rgb=RGB(255,255,255) );
	BOOL DisplayText( int left, int top, COLORREF rgb, TCHAR* chFormat, ... );
	BOOL DisplayText( RECT* pRectText, COLORREF rgb, TCHAR* chFormat, ... );

	BOOL SaveToBMP( char* fileName );

	void Release();

	LPDIRECTDRAWSURFACE7 GetSurface() { return m_lpDDS; };
	int  GetHeight() { return m_iHeight; };
	int  GetWidth()  { return m_iWidth; };

	void  Lock( void** pSurface, int* lPitch );
	void  Unlock();

	DWORD RGB2GDIColor( COLORREF clrGDIColor );

private:
	LPDIRECTDRAWSURFACE7 m_lpDDS;
public:
	int                  m_iHeight;
	int                  m_iWidth;
	COLORREF             m_clrKey;//colorkey
	BOOL                 m_bColorKey;
};

//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
class cDirectDraw
{
public:
	cDirectDraw();
	~cDirectDraw();

public:
	LPDIRECTDRAW7        GetDirectDraw()  { return m_lpDD; };
	LPDIRECTDRAWSURFACE7 GetPrimSurface() { return m_lpDDS_Prim; };
	LPDIRECTDRAWSURFACE7 GetBackSurface() { return m_lpDDS_Back; };

	/* 创建DirectDraw,同时创建InputDevice和AudioDevice */
	BOOL Create( HWND hWnd, HINSTANCE hInst, BOOL bFullScreen=FALSE, int iWidth=800, int iHeight=600 );

	void SetHwnd( HWND hWnd ) { m_hWnd = hWnd; };
	BOOL SetDisplayMode( int width, int height);
	void SetSize( int iHeight, int iWidth )  { m_iHeight=iHeight; m_iWidth=iWidth; };

	/* 贴图 */
	BOOL LoadToBackSurface( cGraphics* offScreenGraphics, int left, int top, LPRECT srcRect=NULL );
	BOOL LoadToBackSurface( cGraphics* offScreenGraphics, int left, int top, int height, int width );

	/* 半透明贴图 */
	BOOL DrawAlpha( cGraphics* offScreenGraphics, int left, int top, LPRECT srcRect );
	BOOL DrawAlpha( cGraphics* offScreenGraphics, int left, int top );

	/* 逆时针旋转任意角度 */
	/* mode = 1: 有锯齿 */
	/* mode = 2: 消锯齿处理,速度慢,不合适即时渲染,多用于Loading时加载 */
	cGraphics* RotateImage   ( cGraphics** ppGrDest, cGraphics* pGrSrc, float arcAngle,  COLORREF clrKey, BOOL bIsColorKey, int mode = 2 );

	/* 特殊角度的旋转 */
	cGraphics* RotateImage90 ( cGraphics* pGrDest, cGraphics* pGrSrc, COLORREF clrBack = 0 );
	cGraphics* RotateImage180( cGraphics* pGrDest, cGraphics* pGrSrc, COLORREF clrBack = 0 );
	cGraphics* RotateImage270( cGraphics* pGrDest, cGraphics* pGrSrc, COLORREF clrBack = 0 );
	/* 针对对称的图像,方法:顺时针旋转90度,再水平翻转 */
	cGraphics* RotateImageComplement( cGraphics* pGrDest, cGraphics* pGrSrc, COLORREF clrBack = 0 );
	/* 遮罩 */
	void DrawImageMask( cGraphics* pGrSrc, cGraphics* pGrMask, COLORREF clrMask, int left, int top, int mode=0 );
	/* 垂直翻转 */
	cGraphics* ReverseImageV( cGraphics* pGrDest, cGraphics* pGrSrc );
	/* 水平翻转 */
	cGraphics* ReverseImageH( cGraphics* pGrDest, cGraphics* pGrSrc );

	/* 混合 */

	/* 输出文本 */
	HDC  BeginText( COLORREF rgb=RGB(255,255,255) );
	void TextOut( HDC hDC, int left, int top, COLORREF rgb, TCHAR* chFormat, ... );
	void TextOut( HDC hDC, int left, int top, TCHAR* chFormat, ... );
	void EndText( HDC hDC );
	BOOL DisplayText( int left, int top, COLORREF rgb, TCHAR* chFormat, ... );

	/* 清屏 */
	void ClearScreen( COLORREF clrBack=0 );

	/* 颜色转换 */
	BYTE      GetR( BYTE bt1 );
	BYTE      GetG( BYTE bt0, BYTE bt1 );
	BYTE      GetB( BYTE bt0 );
	BYTE      SetByte1( BYTE b, BYTE g );
	BYTE      SetByte2( BYTE g, BYTE r );
	BYTE      GetR( PIXEL16 pixel );
	BYTE      GetG( PIXEL16 pixel );
	BYTE      GetB( PIXEL16 pixel );
	COLORREF  HI2RGB( PIXEL16 pixel );
	PIXEL16   RGB2HI( COLORREF rgb );
	PIXEL16   RGB2HI( BYTE r, BYTE g, BYTE b );
	/* RGB2GDIColor 不能在页面被锁定的情况下使用,否则返回0xffffffff */
	DWORD     RGB2GDIColor( COLORREF clrGDIColor );

	cInputDevice*  GetKeyboard() { return &m_keyboardDev; };
	cInputDevice*  GetMouse()    { return &m_mouseDev; };
	cInput*        GetInput()    { return &m_input; };

public:
	virtual BOOL PreFrame();//
	virtual BOOL Frame();
	virtual BOOL Release();

private:
	LPDIRECTDRAW7		 m_lpDD;
	LPDIRECTDRAWSURFACE7 m_lpDDS_Prim; //主页面
	LPDIRECTDRAWSURFACE7 m_lpDDS_Back; //背页面

	HWND				 m_hWnd;
	BOOL				 m_bExclusive; //是否全屏模式

	int                  m_iHeight;
	int                  m_iWidth;

	BOOL                 m_bIsDrawing; //unuse

	cInput               m_input;
	cInputDevice         m_keyboardDev;
	cInputDevice         m_mouseDev;
	BOOL                 m_bInputSucc;
	//cSound               m_sound;
	//cMusicChannel        m_musicChannel;

public:

};

#endif

⌨️ 快捷键说明

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