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

📄 pogygdi.cpp

📁 Windows 图形编程 书籍
💻 CPP
字号:
//-----------------------------------------------------------------------------------//
//              Windows Graphics Programming: Win32 GDI and DirectDraw               //
//                             ISBN  0-13-086985-6                                   //
//                                                                                   //
//  Written            by  Yuan, Feng                             www.fengyuan.com   //
//  Copyright (c) 2000 by  Hewlett-Packard Company                www.hp.com         //
//  Published          by  Prentice Hall PTR, Prentice-Hall, Inc. www.phptr.com      //
//                                                                                   //
//  FileName   : pogygdi.cpp			                                             //
//  Description: KGDIDecoder class                                                   //
//  Version    : 1.00.000, May 31, 2000                                              //
//-----------------------------------------------------------------------------------//

#define NOCRYPT

#include <windows.h>
#include <assert.h>
#include <string.h>
#include <tchar.h>

#include "..\..\include\Lookup.h"
#include "..\..\include\Decoder.h"


class KGDIDecoder : public IDecoder
{
	ATOM atom_COLORREF;

	ATOM atom_HGDIOBJ;
	ATOM atom_HDC;
	ATOM atom_HPEN;
	ATOM atom_HBRUSH;
	ATOM atom_HBITMAP;
	ATOM atom_HPALETTE;
	ATOM atom_HRGN;
	ATOM atom_HFONT;
	ATOM atom_PLOGFONTW;

public:
	KGDIDecoder()
	{
		pNextDecoder = NULL;
	}

	virtual bool Initialize(IAtomTable * pAtomTable);
	virtual int  Decode(ATOM typ, const void * pValue, char * szBuffer, int nBufferSize);
};


bool KGDIDecoder::Initialize(IAtomTable * pAtomTable)
{
	if ( pAtomTable==NULL )
		return false;

	atom_COLORREF  = pAtomTable->AddAtom("COLORREF");
	
	atom_HGDIOBJ   = pAtomTable->AddAtom("HGDIOBJ");
	atom_HDC	   = pAtomTable->AddAtom("HDC");
	atom_HPEN	   = pAtomTable->AddAtom("HPEN");
	atom_HBRUSH	   = pAtomTable->AddAtom("HBRUSH");
	atom_HBITMAP   = pAtomTable->AddAtom("HBITMAP");
	atom_HPALETTE  = pAtomTable->AddAtom("HPALETTE");
	atom_HRGN	   = pAtomTable->AddAtom("HRGN");
	atom_HFONT	   = pAtomTable->AddAtom("HFONT");
	atom_PLOGFONTW = pAtomTable->AddAtom("LOGFONTW*");

	return true;
}


typedef enum
{
	DEF_TYPE		= 0x00,
	DC_TYPE			= 0x01,
	DD_DRAW_TYPE	= 0x02,
	DD_SURF_TYPE	= 0x03,
	RGN_TYPE		= 0x04,
	SURF_TYPE		= 0x05,
	CLIOBJ_TYPE		= 0x06,
	PATH_TYPE		= 0x07,

	PAL_TYPE		= 0x08,
	ICMCS_TYPE		= 0x09,
	LFONT_TYPE		= 0x0A,
	RFONT_TYPE		= 0x0B,
	PFE_TYPE		= 0x0C,
	PFT_TYPE		= 0x0D,
	ICMCXT_TYPE		= 0x0E,
	ICMDLL_TYPE		= 0x0F,

	BRUSH_TYPE		= 0x10,
	D3D_HANDLE_TYPE = 0x11,
	DD_VPORT_TYPE	= 0x12,
	SPACE_TYPE		= 0x13,
	DD_MOTION_TYPE	= 0x14,
	META_TYPE		= 0x15,
	EFSTATE_TYPE	= 0x16,
	BMFD_TYPE		= 0x17,
	
	VTFD_TYPE		= 0x18,
	TTFD_TYPE		= 0x19,
	RC_TYPE			= 0x1A,
	TEMP_TYPE		= 0x1B,
	DRVOBJ_TYPE		= 0x1C,
	DCIOBJ_TYPE		= 0x1D,
	SPOOL_TYPE		= 0x1E,

	EMF_TYPE		= 0x21,
	PEN_TYPE		= 0x30,
	EXTPEN_TYPE		= 0x50
}	GdiObjectType;
	

const DicItem Dic_GdiObjectType[] =
{
	twin(DEF_TYPE),
	item(DC_TYPE,		"HDC"),
	twin(DD_DRAW_TYPE),
	twin(DD_SURF_TYPE),
	item(RGN_TYPE,		"HRGN"),
	item(SURF_TYPE,		"HBITMAP"),
	twin(CLIOBJ_TYPE),
	item(PATH_TYPE,		"HPATH"),

	item(PAL_TYPE,		"HPALETTE"),
	twin(ICMCS_TYPE),
	item(LFONT_TYPE,	"HFONT"),
	twin(RFONT_TYPE),
	twin(PFE_TYPE),
	twin(PFT_TYPE),
	twin(ICMCXT_TYPE),
	twin(ICMDLL_TYPE),

	item(BRUSH_TYPE,	"HBRUSH"),
	twin(D3D_HANDLE_TYPE),
	twin(DD_VPORT_TYPE),
	twin(SPACE_TYPE),
	twin(DD_MOTION_TYPE),
	twin(META_TYPE),
	twin(EFSTATE_TYPE),
	twin(BMFD_TYPE),
	
	twin(VTFD_TYPE),
	twin(TTFD_TYPE),
	twin(RC_TYPE),
	twin(TEMP_TYPE),
	twin(DRVOBJ_TYPE),
	twin(DCIOBJ_TYPE),
	twin(SPOOL_TYPE),

	item(EMF_TYPE,		"HENHMETAFILE"),
	item(PEN_TYPE,		"HPEN"),
	item(EXTPEN_TYPE,	"HEXTPEN"),

	dummyitem
};


const DicItem Dic_COLORREF[] =
{
	item(RGB(0x00, 0x00, 0x00),	"BLACK"),
	item(RGB(0xFF, 0xFF, 0xFF),	"WHITE"),
	item(RGB(0xFF, 0x00, 0x00),	"RED"  ),
	item(RGB(0x00, 0xFF, 0x00),	"GREEN"),
	item(RGB(0x00, 0x00, 0xFF),	"BLUE"),

	dummyitem
};


int KGDIDecoder::Decode(ATOM typ, const void * pValue, char * szBuffer, int nBufferSize)
{
	unsigned data = * (unsigned *) pValue;

	if ( typ==atom_COLORREF )
	{
		if ( ! Lookup( data, Dic_COLORREF, szBuffer) )
			wsprintf(szBuffer, "%06x", data);

		return 4;
	}

	if ( (typ==atom_HDC)    || (typ==atom_HGDIOBJ)  || (typ==atom_HPEN) ||
		 (typ==atom_HBRUSH) || (typ==atom_HPALETTE) || (typ==atom_HRGN) ||
		 (typ==atom_HFONT) )
	{         
		TCHAR temp[32];
		
		unsigned objtyp = (data >> 16) & 0xFF;

		if ( ! Lookup( objtyp & 0x7F, Dic_GdiObjectType, temp) )
			_tcscpy(temp, "HGDIOBJ");
		
		if ( objtyp & 0x80 )  // stock object
			wsprintf(szBuffer, "(S%s)%x", temp, data & 0xFFFF);
		else
			wsprintf(szBuffer, "(%s)%x", temp, data & 0xFFFF);
		
		return 4;
	}

	if ( typ==atom_PLOGFONTW )
	{
		LOGFONTW * pLogFont = (LOGFONTW *) data;

		if ( ! IsBadReadPtr(pLogFont, sizeof(LOGFONTW)) )
		{
			wsprintf(szBuffer, "& LOGFONTW{%d,%d,...,%ws}", 
				pLogFont->lfHeight, pLogFont->lfWidth, pLogFont->lfFaceName);

			return 4;
		}
	}

	// unhandled
	return 0;
}


KGDIDecoder GDIDecoder;


extern "C" __declspec(dllexport) IDecoder * WINAPI Create_GDI_Decoder(void)
{
	return & GDIDecoder;
}

⌨️ 快捷键说明

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