/**************************************************************************\ | |
* | |
* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved. | |
* | |
* Module Name: | |
* | |
* GdiplusMetafile.h | |
* | |
* Abstract: | |
* | |
* Metafile related declarations | |
* | |
\**************************************************************************/ | |
#ifndef _GDIPLUSMETAFILE_H | |
#define _GDIPLUSMETAFILE_H | |
class Metafile : public Image | |
{ | |
public: | |
friend class Image; | |
// Read a metafile | |
Metafile() | |
{ | |
SetNativeImage(NULL); | |
lastResult = Ok; | |
} | |
// 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 APMFileHeader * apmFileHeader, | |
IN BOOL deleteWmf = FALSE) | |
{ | |
GpMetafile * metafile = NULL; | |
lastResult = DllExports::GdipCreateMetafileFromWmf(hWmf, deleteWmf, apmFileHeader, &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); | |
} | |
// Playback a metafile from a file | |
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 APMFileHeader * apmFileHeader | |
) | |
{ | |
GpMetafile * metafile = NULL; | |
lastResult = DllExports::GdipCreateMetafileFromWmfFile(filename, apmFileHeader, &metafile); | |
SetNativeImage(metafile); | |
} | |
// Playback a metafile from a stream | |
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); | |
} | |
// Record a metafile to a file | |
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); | |
} | |
// Record a metafile to a file | |
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); | |
} | |
// Record a metafile to a file | |
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); | |
} | |
// Record a metafile to a stream | |
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); | |
} | |
// Record a metafile to a stream | |
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); | |
} | |
// Write a metafile to a stream with down-level GDI records | |
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 APMFileHeader * apmFileHeader, | |
OUT MetafileHeader * header | |
) | |
{ | |
return DllExports::GdipGetMetafileHeaderFromWmf(hWmf, apmFileHeader, 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, | |
IN LPBYTE pData16, | |
IN INT iMapMode = MM_ANISOTROPIC, | |
IN EmfToWmfBitsFlags eFlags = EmfToWmfBitsFlagsDefault | |
) | |
{ | |
return DllExports::GdipEmfToWmfBits( | |
hemf, | |
cbData16, | |
pData16, | |
iMapMode, | |
eFlags); | |
} | |
#ifdef DCR_USE_NEW_250932 | |
private: | |
Metafile(const Metafile &); | |
Metafile& operator=(const Metafile &); | |
#endif | |
}; | |
#endif // !_METAFILE_H |