You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

93 lines
2.7 KiB
C++

//////////////////////////////////////////////////////////////////////////////
//文件 MetaFile.h
//主要功能:
//
//程序编写: 2005-12-07
/////////////////////////////////////////////////////////////////////////////
#ifndef __CMETAFILE_H__
#define __CMETAFILE_H__
#include ".\pointnamerect.h"
#include "..\DrawImage\ImageBase.h"
#include "imageinsert.h"
#define METAFILE_VERSION 1
class AFX_EXT_CLASS CMetaFile : public CPointNameRect
{
public:
CMetaFile(void);
~CMetaFile(void);
void Serialize(CArchive& ar, const short &ver) override;
virtual int Read (CFile &fr, const short& ver);
int ReadWmf(CFile &fr, const short& ver);
virtual void Write(CFile &fw, const short& ver);
virtual void Clear(void);
virtual void WriteDML(CFile &fw, const short& ver, int nBaseTabNum);
virtual int ReadDML(CFile &fr, const short &ver);
virtual void WritePCG(CFile &fw, const short& ver, int nBaseTabNum);
virtual int ReadPCG(CFile &fr, const short &ver);
virtual int ReadPCG2(CFile &fr, const short &ver);
void operator=(CMetaFile& mf);
BOOL SaveMetaFile(LPCTSTR lpstrFileName);
int ReadMetaFile(LPCTSTR lpstrFileName);
CSize GetWmfSize(void); //获得WMF或EMF的原始尺寸
void Draw(CDC* pDC, CRect rc);
bool Decode(CFile * hFile, long nForceWidth=0, long nForceHeight=0);
BOOL IsEmptyWMF();
BOOL PastFromClipboard(void);
BOOL CopyToClipboard(HWND hWnd=NULL);
BOOL CopyHandle(HENHMETAFILE hMeta);
BOOL CreateImage(CImageBase& image, CSize* pCustomImageSize=NULL);
BOOL ToImage(CImageInsert& image);
protected:
void ShrinkMetafile(CSize &size);//为了防止生成的图像尺寸太大
BOOL BeforeWrite();
private:
#pragma pack(1)
typedef struct tagRECT16
{
short int left;
short int top;
short int right;
short int bottom;
} RECT16;
// taken from Windos 3.11 SDK Documentation (Programmer's Reference Volume 4: Resources)
typedef struct tagMETAFILEHEADER
{
DWORD key; // always 0x9ac6cdd7
WORD reserved1; // reserved = 0
RECT16 bbox; // bounding rectangle in metafile units as defined in "inch"
WORD inch; // number of metafile units per inch (should be < 1440)
DWORD reserved2; // reserved = 0
WORD checksum; // sum of the first 10 WORDS (using XOR operator)
} METAFILEHEADER;
#pragma pack()
CSize wmfSize;
HENHMETAFILE m_hMeta;
BOOL CheckMetafileHeader(METAFILEHEADER *pmetafileheader);
HENHMETAFILE ConvertWmfFiletoEmf(CFile *pFile, METAFILEHEADER *pmetafileheader);
HENHMETAFILE ConvertEmfFiletoEmf(CFile *pFile, ENHMETAHEADER *pemfh);
public:
int GetFileBuffer(BYTE** ppBuffer, DWORD& nBufSize);
int SetFileBuffer(BYTE* pBuffer, DWORD nBufSize);
public:
virtual int ReadPCG(void *pxp, const short &ver);
virtual int ReadPCG2(void *pxp, const short &ver);
};
#endif // __CMETAFILE_H__