////////////////////////////////////////////////////////////////////////////// //文件 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__