1 /**************************************************************************\ 2 * 3 * Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved. 4 * 5 * Module Name: 6 * 7 * GdiplusMetafile.h 8 * 9 * Abstract: 10 * 11 * Metafile related declarations 12 * 13 \**************************************************************************/ 14 15 #ifndef _GDIPLUSMETAFILE_H 16 #define _GDIPLUSMETAFILE_H 17 18 class Metafile : public Image 19 { 20 public: 21 friend class Image; 22 23 // Read a metafile 24 Metafile() 25 { 26 SetNativeImage(NULL); 27 lastResult = Ok; 28 } 29 30 // Playback a metafile from a HMETAFILE 31 // If deleteWmf is TRUE, then when the metafile is deleted, 32 // the hWmf will also be deleted. Otherwise, it won't be. 33 Metafile(IN HMETAFILE hWmf, 34 IN const APMFileHeader * apmFileHeader, 35 IN BOOL deleteWmf = FALSE) 36 { 37 GpMetafile * metafile = NULL; 38 39 lastResult = DllExports::GdipCreateMetafileFromWmf(hWmf, deleteWmf, apmFileHeader, &metafile); 40 41 SetNativeImage(metafile); 42 } 43 44 // Playback a metafile from a HENHMETAFILE 45 // If deleteEmf is TRUE, then when the metafile is deleted, 46 // the hEmf will also be deleted. Otherwise, it won't be. 47 Metafile(IN HENHMETAFILE hEmf, 48 IN BOOL deleteEmf = FALSE) 49 { 50 GpMetafile * metafile = NULL; 51 52 lastResult = DllExports::GdipCreateMetafileFromEmf(hEmf, deleteEmf, &metafile); 53 54 SetNativeImage(metafile); 55 } 56 57 // Playback a metafile from a file 58 Metafile(IN const WCHAR* filename) 59 { 60 GpMetafile * metafile = NULL; 61 62 lastResult = DllExports::GdipCreateMetafileFromFile(filename, &metafile); 63 64 SetNativeImage(metafile); 65 } 66 67 // Playback a WMF metafile from a file 68 Metafile(IN const WCHAR* filename, 69 IN const APMFileHeader * apmFileHeader 70 ) 71 { 72 GpMetafile * metafile = NULL; 73 74 lastResult = DllExports::GdipCreateMetafileFromWmfFile(filename, apmFileHeader, &metafile); 75 76 SetNativeImage(metafile); 77 } 78 79 // Playback a metafile from a stream 80 Metafile(IN IStream* stream) 81 { 82 GpMetafile * metafile = NULL; 83 84 lastResult = DllExports::GdipCreateMetafileFromStream(stream, &metafile); 85 86 SetNativeImage(metafile); 87 } 88 89 // Record a metafile to memory 90 Metafile( 91 IN HDC referenceHdc, 92 IN EmfType type = EmfTypeEmfPlusDual, 93 IN const WCHAR * description = NULL 94 ) 95 { 96 GpMetafile * metafile = NULL; 97 98 lastResult = DllExports::GdipRecordMetafile( 99 referenceHdc, type, NULL, MetafileFrameUnitGdi, 100 description, &metafile); 101 102 SetNativeImage(metafile); 103 } 104 105 // Record a metafile to memory 106 Metafile( 107 IN HDC referenceHdc, 108 IN const RectF & frameRect, 109 IN MetafileFrameUnit frameUnit = MetafileFrameUnitGdi, 110 IN EmfType type = EmfTypeEmfPlusDual, 111 IN const WCHAR * description = NULL 112 ) 113 { 114 GpMetafile * metafile = NULL; 115 116 lastResult = DllExports::GdipRecordMetafile( 117 referenceHdc, type, &frameRect, frameUnit, 118 description, &metafile); 119 120 SetNativeImage(metafile); 121 } 122 123 // Record a metafile to memory 124 Metafile( 125 IN HDC referenceHdc, 126 IN const Rect & frameRect, 127 IN MetafileFrameUnit frameUnit = MetafileFrameUnitGdi, 128 IN EmfType type = EmfTypeEmfPlusDual, 129 IN const WCHAR * description = NULL 130 ) 131 { 132 GpMetafile * metafile = NULL; 133 134 lastResult = DllExports::GdipRecordMetafileI( 135 referenceHdc, type, &frameRect, frameUnit, 136 description, &metafile); 137 138 SetNativeImage(metafile); 139 } 140 141 // Record a metafile to a file 142 Metafile( 143 IN const WCHAR* fileName, 144 IN HDC referenceHdc, 145 IN EmfType type = EmfTypeEmfPlusDual, 146 IN const WCHAR * description = NULL 147 ) 148 { 149 GpMetafile * metafile = NULL; 150 151 lastResult = DllExports::GdipRecordMetafileFileName(fileName, 152 referenceHdc, type, NULL, MetafileFrameUnitGdi, 153 description, &metafile); 154 155 SetNativeImage(metafile); 156 } 157 158 // Record a metafile to a file 159 Metafile( 160 IN const WCHAR* fileName, 161 IN HDC referenceHdc, 162 IN const RectF & frameRect, 163 IN MetafileFrameUnit frameUnit = MetafileFrameUnitGdi, 164 IN EmfType type = EmfTypeEmfPlusDual, 165 IN const WCHAR * description = NULL 166 ) 167 { 168 GpMetafile * metafile = NULL; 169 170 lastResult = DllExports::GdipRecordMetafileFileName(fileName, 171 referenceHdc, type, &frameRect, frameUnit, 172 description, &metafile); 173 174 SetNativeImage(metafile); 175 } 176 177 // Record a metafile to a file 178 Metafile( 179 IN const WCHAR* fileName, 180 IN HDC referenceHdc, 181 IN const Rect & frameRect, 182 IN MetafileFrameUnit frameUnit = MetafileFrameUnitGdi, 183 IN EmfType type = EmfTypeEmfPlusDual, 184 IN const WCHAR * description = NULL 185 ) 186 { 187 GpMetafile * metafile = NULL; 188 189 lastResult = DllExports::GdipRecordMetafileFileNameI(fileName, 190 referenceHdc, type, &frameRect, frameUnit, 191 description, &metafile); 192 193 SetNativeImage(metafile); 194 } 195 196 // Record a metafile to a stream 197 Metafile( 198 IN IStream * stream, 199 IN HDC referenceHdc, 200 IN EmfType type = EmfTypeEmfPlusDual, 201 IN const WCHAR * description = NULL 202 ) 203 { 204 GpMetafile * metafile = NULL; 205 206 lastResult = DllExports::GdipRecordMetafileStream(stream, 207 referenceHdc, type, NULL, MetafileFrameUnitGdi, 208 description, &metafile); 209 210 SetNativeImage(metafile); 211 } 212 213 // Record a metafile to a stream 214 Metafile( 215 IN IStream * stream, 216 IN HDC referenceHdc, 217 IN const RectF & frameRect, 218 IN MetafileFrameUnit frameUnit = MetafileFrameUnitGdi, 219 IN EmfType type = EmfTypeEmfPlusDual, 220 IN const WCHAR * description = NULL 221 ) 222 { 223 GpMetafile * metafile = NULL; 224 225 lastResult = DllExports::GdipRecordMetafileStream(stream, 226 referenceHdc, type, &frameRect, frameUnit, 227 description, &metafile); 228 229 SetNativeImage(metafile); 230 } 231 232 // Write a metafile to a stream with down-level GDI records 233 Metafile( 234 IN IStream * stream, 235 IN HDC referenceHdc, 236 IN const Rect & frameRect, 237 IN MetafileFrameUnit frameUnit = MetafileFrameUnitGdi, 238 IN EmfType type = EmfTypeEmfPlusDual, 239 IN const WCHAR * description = NULL 240 ) 241 { 242 GpMetafile * metafile = NULL; 243 244 lastResult = DllExports::GdipRecordMetafileStreamI(stream, 245 referenceHdc, type, &frameRect, frameUnit, 246 description, &metafile); 247 248 SetNativeImage(metafile); 249 } 250 251 static Status GetMetafileHeader( 252 IN HMETAFILE hWmf, 253 IN const APMFileHeader * apmFileHeader, 254 OUT MetafileHeader * header 255 ) 256 { 257 return DllExports::GdipGetMetafileHeaderFromWmf(hWmf, apmFileHeader, header); 258 } 259 260 static Status GetMetafileHeader( 261 IN HENHMETAFILE hEmf, 262 OUT MetafileHeader * header 263 ) 264 { 265 return DllExports::GdipGetMetafileHeaderFromEmf(hEmf, header); 266 } 267 268 static Status GetMetafileHeader( 269 IN const WCHAR* filename, 270 OUT MetafileHeader * header 271 ) 272 { 273 return DllExports::GdipGetMetafileHeaderFromFile(filename, header); 274 } 275 276 static Status GetMetafileHeader( 277 IN IStream * stream, 278 OUT MetafileHeader * header 279 ) 280 { 281 return DllExports::GdipGetMetafileHeaderFromStream(stream, header); 282 } 283 284 Status GetMetafileHeader( 285 OUT MetafileHeader * header 286 ) const 287 { 288 return SetStatus(DllExports::GdipGetMetafileHeaderFromMetafile( 289 (GpMetafile *)nativeImage, 290 header)); 291 } 292 293 // Once this method is called, the Metafile object is in an invalid state 294 // and can no longer be used. It is the responsiblity of the caller to 295 // invoke DeleteEnhMetaFile to delete this hEmf. 296 297 HENHMETAFILE GetHENHMETAFILE() 298 { 299 HENHMETAFILE hEmf; 300 301 SetStatus(DllExports::GdipGetHemfFromMetafile((GpMetafile *)nativeImage, &hEmf)); 302 303 return hEmf; 304 } 305 306 // Used in conjuction with Graphics::EnumerateMetafile to play an EMF+ 307 // The data must be DWORD aligned if it's an EMF or EMF+. It must be 308 // WORD aligned if it's a WMF. 309 Status 310 PlayRecord( 311 IN EmfPlusRecordType recordType, 312 IN UINT flags, 313 IN UINT dataSize, 314 IN const BYTE * data 315 ) const 316 { 317 return SetStatus(DllExports::GdipPlayMetafileRecord( 318 (GpMetafile *)nativeImage, 319 recordType, 320 flags, 321 dataSize, 322 data)); 323 } 324 325 // If you're using a printer HDC for the metafile, but you want the 326 // metafile rasterized at screen resolution, then use this API to set 327 // the rasterization dpi of the metafile to the screen resolution, 328 // e.g. 96 dpi or 120 dpi. 329 Status SetDownLevelRasterizationLimit( 330 IN UINT metafileRasterizationLimitDpi 331 ) 332 { 333 return SetStatus(DllExports::GdipSetMetafileDownLevelRasterizationLimit( 334 (GpMetafile *)nativeImage, 335 metafileRasterizationLimitDpi)); 336 } 337 338 UINT GetDownLevelRasterizationLimit() const 339 { 340 UINT metafileRasterizationLimitDpi = 0; 341 342 SetStatus(DllExports::GdipGetMetafileDownLevelRasterizationLimit( 343 (GpMetafile *)nativeImage, 344 &metafileRasterizationLimitDpi)); 345 346 return metafileRasterizationLimitDpi; 347 } 348 349 static UINT Metafile::EmfToWmfBits( 350 IN HENHMETAFILE hemf, 351 IN UINT cbData16, 352 IN LPBYTE pData16, 353 IN INT iMapMode = MM_ANISOTROPIC, 354 IN EmfToWmfBitsFlags eFlags = EmfToWmfBitsFlagsDefault 355 ) 356 { 357 return DllExports::GdipEmfToWmfBits( 358 hemf, 359 cbData16, 360 pData16, 361 iMapMode, 362 eFlags); 363 } 364 365 #ifdef DCR_USE_NEW_250932 366 367 private: 368 Metafile(const Metafile &); 369 Metafile& operator=(const Metafile &); 370 371 #endif 372 }; 373 374 #endif // !_METAFILE_H 375