/**************************************************************************\ * * Copyright (c) 1998-2001, Microsoft Corp. All Rights Reserved. * * Module Name: * * GdiplusMetafile.h * * Abstract: * * GDI+ Metafile class * \**************************************************************************/ #ifndef _GDIPLUSMETAFILE_H #define _GDIPLUSMETAFILE_H class Metafile : public Image { public: friend class Image; // Playback a metafile from a HMETAFILE // If deleteWmf is TRUE, then when the metafile is deleted, // the hWmf will also be deleted. Otherwise, it won't be. Metafile(IN HMETAFILE hWmf, IN const WmfPlaceableFileHeader * wmfPlaceableFileHeader, IN BOOL deleteWmf = FALSE) { GpMetafile * metafile = NULL; lastResult = DllExports::GdipCreateMetafileFromWmf(hWmf, deleteWmf, wmfPlaceableFileHeader, &metafile); SetNativeImage(metafile); } // Playback a metafile from a HENHMETAFILE // If deleteEmf is TRUE, then when the metafile is deleted, // the hEmf will also be deleted. Otherwise, it won't be. Metafile(IN HENHMETAFILE hEmf, IN BOOL deleteEmf = FALSE) { GpMetafile * metafile = NULL; lastResult = DllExports::GdipCreateMetafileFromEmf(hEmf, deleteEmf, &metafile); SetNativeImage(metafile); } Metafile(IN const WCHAR* filename) { GpMetafile * metafile = NULL; lastResult = DllExports::GdipCreateMetafileFromFile(filename, &metafile); SetNativeImage(metafile); } // Playback a WMF metafile from a file. Metafile(IN const WCHAR* filename, IN const WmfPlaceableFileHeader * wmfPlaceableFileHeader ) { GpMetafile * metafile = NULL; lastResult = DllExports::GdipCreateMetafileFromWmfFile(filename, wmfPlaceableFileHeader, &metafile); SetNativeImage(metafile); } Metafile(IN IStream* stream) { GpMetafile * metafile = NULL; lastResult = DllExports::GdipCreateMetafileFromStream(stream, &metafile); SetNativeImage(metafile); } // Record a metafile to memory. Metafile( IN HDC referenceHdc, IN EmfType type = EmfTypeEmfPlusDual, IN const WCHAR * description = NULL ) { GpMetafile * metafile = NULL; lastResult = DllExports::GdipRecordMetafile( referenceHdc, type, NULL, MetafileFrameUnitGdi, description, &metafile); SetNativeImage(metafile); } // Record a metafile to memory. Metafile( IN HDC referenceHdc, IN const RectF & frameRect, IN MetafileFrameUnit frameUnit = MetafileFrameUnitGdi, IN EmfType type = EmfTypeEmfPlusDual, IN const WCHAR * description = NULL ) { GpMetafile * metafile = NULL; lastResult = DllExports::GdipRecordMetafile( referenceHdc, type, &frameRect, frameUnit, description, &metafile); SetNativeImage(metafile); } // Record a metafile to memory. Metafile( IN HDC referenceHdc, IN const Rect & frameRect, IN MetafileFrameUnit frameUnit = MetafileFrameUnitGdi, IN EmfType type = EmfTypeEmfPlusDual, IN const WCHAR * description = NULL ) { GpMetafile * metafile = NULL; lastResult = DllExports::GdipRecordMetafileI( referenceHdc, type, &frameRect, frameUnit, description, &metafile); SetNativeImage(metafile); } Metafile( IN const WCHAR* fileName, IN HDC referenceHdc, IN EmfType type = EmfTypeEmfPlusDual, IN const WCHAR * description = NULL ) { GpMetafile * metafile = NULL; lastResult = DllExports::GdipRecordMetafileFileName(fileName, referenceHdc, type, NULL, MetafileFrameUnitGdi, description, &metafile); SetNativeImage(metafile); } Metafile( IN const WCHAR* fileName, IN HDC referenceHdc, IN const RectF & frameRect, IN MetafileFrameUnit frameUnit = MetafileFrameUnitGdi, IN EmfType type = EmfTypeEmfPlusDual, IN const WCHAR * description = NULL ) { GpMetafile * metafile = NULL; lastResult = DllExports::GdipRecordMetafileFileName(fileName, referenceHdc, type, &frameRect, frameUnit, description, &metafile); SetNativeImage(metafile); } Metafile( IN const WCHAR* fileName, IN HDC referenceHdc, IN const Rect & frameRect, IN MetafileFrameUnit frameUnit = MetafileFrameUnitGdi, IN EmfType type = EmfTypeEmfPlusDual, IN const WCHAR * description = NULL ) { GpMetafile * metafile = NULL; lastResult = DllExports::GdipRecordMetafileFileNameI(fileName, referenceHdc, type, &frameRect, frameUnit, description, &metafile); SetNativeImage(metafile); } Metafile( IN IStream * stream, IN HDC referenceHdc, IN EmfType type = EmfTypeEmfPlusDual, IN const WCHAR * description = NULL ) { GpMetafile * metafile = NULL; lastResult = DllExports::GdipRecordMetafileStream(stream, referenceHdc, type, NULL, MetafileFrameUnitGdi, description, &metafile); SetNativeImage(metafile); } Metafile( IN IStream * stream, IN HDC referenceHdc, IN const RectF & frameRect, IN MetafileFrameUnit frameUnit = MetafileFrameUnitGdi, IN EmfType type = EmfTypeEmfPlusDual, IN const WCHAR * description = NULL ) { GpMetafile * metafile = NULL; lastResult = DllExports::GdipRecordMetafileStream(stream, referenceHdc, type, &frameRect, frameUnit, description, &metafile); SetNativeImage(metafile); } Metafile( IN IStream * stream, IN HDC referenceHdc, IN const Rect & frameRect, IN MetafileFrameUnit frameUnit = MetafileFrameUnitGdi, IN EmfType type = EmfTypeEmfPlusDual, IN const WCHAR * description = NULL ) { GpMetafile * metafile = NULL; lastResult = DllExports::GdipRecordMetafileStreamI(stream, referenceHdc, type, &frameRect, frameUnit, description, &metafile); SetNativeImage(metafile); } static Status GetMetafileHeader( IN HMETAFILE hWmf, IN const WmfPlaceableFileHeader * wmfPlaceableFileHeader, OUT MetafileHeader * header ) { return DllExports::GdipGetMetafileHeaderFromWmf(hWmf, wmfPlaceableFileHeader, header); } static Status GetMetafileHeader( IN HENHMETAFILE hEmf, OUT MetafileHeader * header ) { return DllExports::GdipGetMetafileHeaderFromEmf(hEmf, header); } static Status GetMetafileHeader( IN const WCHAR* filename, OUT MetafileHeader * header ) { return DllExports::GdipGetMetafileHeaderFromFile(filename, header); } static Status GetMetafileHeader( IN IStream * stream, OUT MetafileHeader * header ) { return DllExports::GdipGetMetafileHeaderFromStream(stream, header); } Status GetMetafileHeader( OUT MetafileHeader * header ) const { return SetStatus(DllExports::GdipGetMetafileHeaderFromMetafile( (GpMetafile *)nativeImage, header)); } // Once this method is called, the Metafile object is in an invalid state // and can no longer be used. It is the responsiblity of the caller to // invoke DeleteEnhMetaFile to delete this hEmf. HENHMETAFILE GetHENHMETAFILE() { HENHMETAFILE hEmf; SetStatus(DllExports::GdipGetHemfFromMetafile( (GpMetafile *)nativeImage, &hEmf)); return hEmf; } // Used in conjuction with Graphics::EnumerateMetafile to play an EMF+ // The data must be DWORD aligned if it's an EMF or EMF+. It must be // WORD aligned if it's a WMF. Status PlayRecord( IN EmfPlusRecordType recordType, IN UINT flags, IN UINT dataSize, IN const BYTE * data ) const { return SetStatus(DllExports::GdipPlayMetafileRecord( (GpMetafile *)nativeImage, recordType, flags, dataSize, data)); } // If you're using a printer HDC for the metafile, but you want the // metafile rasterized at screen resolution, then use this API to set // the rasterization dpi of the metafile to the screen resolution, // e.g. 96 dpi or 120 dpi. Status SetDownLevelRasterizationLimit( IN UINT metafileRasterizationLimitDpi ) { return SetStatus(DllExports:: GdipSetMetafileDownLevelRasterizationLimit( (GpMetafile *)nativeImage, metafileRasterizationLimitDpi)); } UINT GetDownLevelRasterizationLimit() const { UINT metafileRasterizationLimitDpi = 0; SetStatus(DllExports::GdipGetMetafileDownLevelRasterizationLimit( (GpMetafile *)nativeImage, &metafileRasterizationLimitDpi)); return metafileRasterizationLimitDpi; } static UINT Metafile::EmfToWmfBits( IN HENHMETAFILE hemf, IN UINT cbData16, OUT LPBYTE pData16, IN INT iMapMode = MM_ANISOTROPIC, IN INT eFlags = EmfToWmfBitsFlagsDefault ) { return DllExports::GdipEmfToWmfBits( hemf, cbData16, pData16, iMapMode, eFlags); } protected: Metafile() { SetNativeImage(NULL); lastResult = Ok; } private: Metafile(const Metafile &); Metafile& operator=(const Metafile &); }; #endif // !_METAFILE_H