ximawmf.h
上传用户:pass2008
上传日期:2021-07-05
资源大小:3299k
文件大小:5k
源码类别:

Internet/IE编程

开发平台:

Visual C++

  1. /*
  2. *********************************************************************
  3.  * File: ximawmf.h
  4.  * Purpose: Windows Metafile Class Loader and Writer
  5.  * Author: Volker Horch - vhorch@gmx.de
  6.  * created: 13-Jun-2002
  7. *********************************************************************
  8.  */
  9. /*
  10. *********************************************************************
  11. Notes by Author:
  12. *********************************************************************
  13. Limitations:
  14. ============
  15. a) Transparency:
  16. A Metafile is vector graphics, which has transparency by design.
  17. This class always converts into a Bitmap format. Transparency is
  18. supported, but there is no good way to find out, which parts
  19. of the Metafile are transparent. There are two ways how we can
  20. handle this:
  21. - Clear the Background of the Bitmap with the background color
  22.   you like (i have used COLOR_WINDOW) and don't support transparency.
  23.   below #define XMF_SUPPORT_TRANSPARENCY 0
  24. #define XMF_COLOR_BACK RGB(Background color you like)
  25. - Clear the Background of the Bitmap with a very unusual color
  26.   (which one ?) and use this color as the transparent color
  27.   below #define XMF_SUPPORT_TRANSPARENCY 1
  28. #define XMF_COLOR_TRANSPARENT_R ...
  29. #define XMF_COLOR_TRANSPARENT_G ...
  30. #define XMF_COLOR_TRANSPARENT_B ...
  31. b) Resolution
  32. Once we have converted the Metafile into a Bitmap and we zoom in
  33. or out, the image may not look very good. If we still had the
  34. original Metafile, zooming would produce good results always.
  35. c) Size
  36. Although the filesize of a Metafile may be very small, it might
  37. produce a Bitmap with a bombastic size. Assume you have a Metafile
  38. with an image size of 6000*4000, which contains just one Metafile
  39. record ((e.g. a line from (0,0) to (6000, 4000)). The filesize
  40. of this Metafile would be let's say 100kB. If we convert it to
  41. a 6000*4000 Bitmap with 24 Bits/Pixes, the Bitmap would consume
  42. about 68MB of memory.
  43. I have choosen, to limit the size of the Bitmap to max.
  44. screensize, to avoid memory problems.
  45. If you want something else,
  46. modify #define XMF_MAXSIZE_CX / XMF_MAXSIZE_CY below
  47. *********************************************************************
  48. */
  49. #ifndef _XIMAWMF_H
  50. #define _XIMAWMF_H
  51. #include "ximage.h"
  52. #if CXIMAGE_SUPPORT_WMF && CXIMAGE_SUPPORT_WINDOWS
  53. class CxImageWMF: public CxImage
  54. {
  55. #pragma pack(1)
  56. typedef struct tagRECT16
  57. {
  58. short int left;
  59. short int top;
  60. short int right;
  61. short int bottom;
  62. } RECT16;
  63. // taken from Windos 3.11 SDK Documentation (Programmer's Reference Volume 4: Resources)
  64. typedef struct tagMETAFILEHEADER
  65. {
  66. DWORD key; // always 0x9ac6cdd7
  67. WORD reserved1; // reserved = 0
  68. RECT16 bbox; // bounding rectangle in metafile units as defined in "inch"
  69. WORD inch; // number of metafile units per inch (should be < 1440)
  70. DWORD reserved2; // reserved = 0
  71. WORD checksum; // sum of the first 10 WORDS (using XOR operator)
  72. } METAFILEHEADER;
  73. #pragma pack()
  74. public:
  75. CxImageWMF(): CxImage(CXIMAGE_FORMAT_WMF) { }
  76. bool Decode(CxFile * hFile, long nForceWidth=0, long nForceHeight=0);
  77. bool Decode(FILE *hFile, long nForceWidth=0, long nForceHeight=0)
  78. { CxIOFile file(hFile); return Decode(&file,nForceWidth,nForceHeight); }
  79. #if CXIMAGE_SUPPORT_ENCODE
  80. bool Encode(CxFile * hFile);
  81. bool Encode(FILE *hFile) { CxIOFile file(hFile); return Encode(&file); }
  82. #endif // CXIMAGE_SUPPORT_ENCODE
  83. protected:
  84. void ShrinkMetafile(int &cx, int &cy);
  85. BOOL CheckMetafileHeader(METAFILEHEADER *pmetafileheader);
  86. HENHMETAFILE ConvertWmfFiletoEmf(CxFile *pFile, METAFILEHEADER *pmetafileheader);
  87. HENHMETAFILE ConvertEmfFiletoEmf(CxFile *pFile, ENHMETAHEADER *pemfh);
  88. };
  89. #define METAFILEKEY 0x9ac6cdd7L
  90. // Background color definition (if no transparency). see Notes above
  91. #define XMF_COLOR_BACK GetSysColor(COLOR_WINDOW)
  92. // alternatives
  93. //#define XMF_COLOR_BACK RGB(192, 192, 192) // lite gray
  94. //#define XMF_COLOR_BACK RGB(  0,   0,   0) // black
  95. //#define XMF_COLOR_BACK RGB(255, 255, 255) // white
  96. // transparency support. see Notes above
  97. #define XMF_SUPPORT_TRANSPARENCY 0
  98. #define XMF_COLOR_TRANSPARENT_R 211
  99. #define XMF_COLOR_TRANSPARENT_G 121
  100. #define XMF_COLOR_TRANSPARENT_B 112
  101. // don't change
  102. #define XMF_COLOR_TRANSPARENT RGB (XMF_COLOR_TRANSPARENT_R, 
  103.  XMF_COLOR_TRANSPARENT_G, 
  104.  XMF_COLOR_TRANSPARENT_B)
  105. // don't change
  106. #define XMF_RGBQUAD_TRANSPARENT XMF_COLOR_TRANSPARENT_B, 
  107. XMF_COLOR_TRANSPARENT_G, 
  108. XMF_COLOR_TRANSPARENT_R, 
  109. 0
  110. // max. size. see Notes above
  111. // alternatives
  112. //#define XMF_MAXSIZE_CX (GetSystemMetrics(SM_CXSCREEN)-10)
  113. //#define XMF_MAXSIZE_CY (GetSystemMetrics(SM_CYSCREEN)-50)
  114. //#define XMF_MAXSIZE_CX (2*GetSystemMetrics(SM_CXSCREEN)/3)
  115. //#define XMF_MAXSIZE_CY (2*GetSystemMetrics(SM_CYSCREEN)/3)
  116. #define XMF_MAXSIZE_CX 4000
  117. #define XMF_MAXSIZE_CY 4000
  118. #endif
  119. #endif