#include "resource.h" #include "commdlg.h" #define GlobalSizePtr(lp) \ (GlobalUnlockPtr(lp), (BOOL)GlobalSize(GlobalPtrHandle(lp))) #define APPNAME "Metafile Decoder" #define DESTDISPLAY 0 #define DESTMETA 1 #define DESTDIB 2 #define DESTPRN 3 extern int iDestDC; // //common dialog structures and constants // #define MAXFILTERLEN 256 typedef struct tagFOCHUNK { OPENFILENAME of; char szFile[256]; char szFileTitle[256]; } FOCHUNK; typedef FOCHUNK FAR *LPFOCHUNK; typedef FOCHUNK FAR *LPFSCHUNK; typedef WORD (CALLBACK* FARHOOK)(HWND,UINT,WPARAM,LPARAM); // //structure of ptrs to global memory for emf header and //description string // typedef struct tagEHNMETAMEMPTR { LPENHMETAHEADER lpEMFHdr; LPTSTR lpDescStr; LPPALETTEENTRY lpPal; WORD palNumEntries; } EHNMETAMEMPTR, *PEHNMETAMEMPTR, *LPEHNMETAMEMPTR; // //clipboard data definitions // #define CLP_ID 0xC350 #define CLP_NT_ID 0xC351 #define CLPBK_NT_ID 0xC352 #define CLPMETANAMEMAX 79 // //NT clipboard file header // typedef struct { WORD FileIdentifier; WORD FormatCount; } NTCLIPFILEHEADER; // // NT clipboard file format header // typedef struct { DWORD FormatID; DWORD DataLen; DWORD DataOffset; WCHAR Name[CLPMETANAMEMAX]; } NTCLIPFILEFORMAT, *LPNTCLIPFILEFORMAT; // //Win 3.1 clipboard file header // #pragma pack(1) typedef struct { WORD FileIdentifier; WORD FormatCount; } CLIPFILEHEADER; // //Win 3.1 clipboard format header // typedef struct { WORD FormatID; DWORD DataLen; DWORD DataOffset; char Name[CLPMETANAMEMAX]; } CLIPFILEFORMAT, FAR *LPCLIPFILEFORMAT; // //Win 3.1 metafilepict structure // typedef struct tagOLDMETAFILEPICT { short mm; short xExt; short yExt; WORD hMF; } OLDMETAFILEPICT; typedef OLDMETAFILEPICT FAR *LPOLDMETAFILEPICT; // //placeable metafile data definitions // typedef struct tagOLDRECT { short left; short top; short right; short bottom; } OLDRECT; // //placeable metafile header // typedef struct { DWORD key; WORD hmf; OLDRECT bbox; WORD inch; DWORD reserved; WORD checksum; }PLACEABLEWMFHEADER; #pragma pack() #define PLACEABLEKEY 0x9AC6CDD7 // //metafile function table lookup data definitions // #define NUMENHMETARECORDS 255 // includes WFM, EMF, EMF+ typedef struct tagEMFMETARECORDS { char *szRecordName; DWORD iType; } EMFMETARECORDS, *LPEMFMETARECORDS; #define NUMMETAFUNCTIONS 79 // WMF record types /* typedef struct tagMETAFUNCTIONS { char *szFuncName; WORD value; } METAFUNCTIONS; */ typedef LPWORD LPPARAMETERS; typedef LPDWORD LPEMFPARAMETERS; // //global vars for main module // #ifdef MAIN HANDLE hInst; HANDLE CurrenthDlg; HANDLE hSaveCursor; HWND hWndMain; HWND hWndList; LPPARAMETERS lpMFParams; LPEMFPARAMETERS lpEMFParams; HANDLE hMem; HANDLE hSelMem; int FAR *lpSelMem; EHNMETAMEMPTR EmfPtr; // //flags // BOOL bInPaint; BOOL bPlayRec; BOOL bPlayItAll; BOOL bBadFile = FALSE; BOOL bValidFile = FALSE; BOOL bEnhMeta = FALSE; BOOL bMetaFileOpen = FALSE; BOOL bMetaInRam = FALSE; BOOL bPlaceableMeta= FALSE; BOOL bPlayList = FALSE; BOOL bPlaySelList = TRUE; BOOL bEnumRange; int iEnumAction; int iStartRange; int iEndRange; DWORD iCount = 0; //index into lpSelMem DWORD iNumSel = 0; //number of listbox selections // //common fo dialog vars // char gszSaveEMFFilter[MAXFILTERLEN]="Enhanced MetaFile(*.EMF)\0*.EMF\0\0"; char gszSaveWMFFilter[MAXFILTERLEN]="Windows MetaFile(*.WMF)\0*.WMF\0\0"; char gszFilter[MAXFILTERLEN]="All Supported File Types(*.EMF,*.WMF,*.CLP)\0*.EMF;*.WMF;*.CLP\0Enhanced MetaFiles(*.EMF)\0*.EMF\0Windows Metafiles(*.WMF)\0*.WMF\0Clipboard Pictures(*.CLP)\0*.CLP\0\0"; char gszBuffer[MAXFILTERLEN]; int nFileOffset; int nExtOffset; // //file io related vars // char OpenName[144]; char SaveName[144]; char str[255]; OFSTRUCT ofStruct; DWORD iLBItemsInBuf; char fnameext[20]; // //metafile related vars // HANDLE hMF; HENHMETAFILE hemf; METAFILEPICT MFP; METARECORD MetaRec; METAHEADER mfHeader; PLACEABLEWMFHEADER placeableWMFHeader; ENHMETAHEADER emfHeader; ENHMETARECORD emfMetaRec; DWORD iRecNum = 0; HANDLE hMFP; LPMETAFILEPICT lpMFP = NULL; LPOLDMETAFILEPICT lpOldMFP = NULL; HGLOBAL hMFBits; LPSTR lpMFBits = NULL; // //printer variables // HDC hPr; // handle for printer device context POINT PhysPageSize; // information about the page BOOL bAbort; // FALSE if user cancels printing HWND hAbortDlgWnd; FARPROC lpAbortDlg; FARPROC lpAbortProc; #endif /* if defined MAIN */ // //externs // #ifndef MAIN extern HANDLE hInst; extern HANDLE CurrenthDlg; extern HANDLE hSaveCursor; extern HWND hWndMain; extern HWND hWndList; extern LPPARAMETERS lpMFParams; extern LPEMFPARAMETERS lpEMFParams; extern HANDLE hMem; extern HANDLE hSelMem; extern int FAR *lpSelMem; extern EHNMETAMEMPTR EmfPtr; // //flags // extern BOOL bInPaint; extern BOOL bPlayRec; extern BOOL bPlayItAll; extern BOOL bBadFile; extern BOOL bValidFile; extern BOOL bEnhMeta; extern BOOL bMetaFileOpen; extern BOOL bMetaInRam; extern BOOL bPlaceableMeta; extern BOOL bPlayList; extern BOOL bPlaySelList; extern BOOL bEnumRange; extern int iEnumAction; extern int iStartRange; extern int iEndRange; extern DWORD iCount; //index into lpSelMem extern DWORD iNumSel; //number of listbox selections // //common dialog vars // extern char gszSaveEMFFilter[MAXFILTERLEN]; extern char gszSaveWMFFilter[MAXFILTERLEN]; extern char gszFilter[MAXFILTERLEN]; extern char gszBuffer[MAXFILTERLEN]; extern int nFileOffset; extern int nExtOffset; // //file io related vars // extern char OpenName[144]; extern char SaveName[144]; extern char str[256]; extern OFSTRUCT ofStruct; extern DWORD iLBItemsInBuf; extern char fnameext[20]; // //metafile related vars // extern HANDLE hMF; extern HENHMETAFILE hemf; extern METAFILEPICT MFP; extern METARECORD MetaRec; extern METAHEADER mfHeader; extern PLACEABLEWMFHEADER placeableWMFHeader; extern ENHMETAHEADER emfHeader; extern ENHMETARECORD emfMetaRec; extern DWORD iRecNum; extern EMFMETARECORDS emfMetaRecords[]; // extern METAFUNCTIONS MetaFunctions[]; extern HANDLE hMFP; extern LPMETAFILEPICT lpMFP; extern LPOLDMETAFILEPICT lpOldMFP; extern HGLOBAL hMFBits; extern LPSTR lpMFBits; // //printer variables // extern HDC hPr; // handle for printer device context extern POINT PhysPageSize; // information about the page extern BOOL bAbort; // FALSE if user cancels printing extern HWND hAbortDlgWnd; #endif /* if !defined MAIN */ // //function prototypes // // //MFDCOD32.C int APIENTRY WinMain(HINSTANCE, HINSTANCE, LPSTR, int); BOOL InitApplication(HANDLE); BOOL InitInstance(HANDLE, int); LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM); HANDLE FAR PASCAL OpenDlg(HWND, unsigned, WORD, LONG); void WaitCursor(BOOL); // //WMFMETA.C // int CALLBACK EnhMetaFileEnumProc(HDC, LPHANDLETABLE, LPENHMETARECORD, int, LPARAM); int CALLBACK MetaEnumProc(HDC, LPHANDLETABLE, LPMETARECORD, int, LPARAM); BOOL LoadParameterLB(HWND, DWORD, int); BOOL PlayMetaFileToDest(HWND, int); BOOL RenderClipMeta(LPVOID, int, WORD); BOOL RenderPlaceableMeta(int); void SetPlaceableExts(HDC, PLACEABLEWMFHEADER, int); void SetNonPlaceableExts(HDC, int); VOID SetClipMetaExts(HDC, LPMETAFILEPICT, LPOLDMETAFILEPICT, int); BOOL ProcessFile(HWND, LPSTR); BOOL ProcessWMF(HWND hWnd, LPSTR lpFileName); BOOL ProcessCLP(HWND hWnd, LPSTR lpFileName); BOOL ProcessEMF(HWND hWnd, LPSTR lpFileName); BOOL GetEMFCoolStuff(void); BOOL GetEMFCoolStuff(void); int EnumMFIndirect(HDC hDC, LPHANDLETABLE lpHTable, LPMETARECORD lpMFR, LPENHMETARECORD lpEMFR, int nObj, LPARAM lpData); BOOL ConvertWMFtoEMF(HMETAFILE hmf, LPSTR lpszFileName); BOOL ConvertEMFtoWMF(HDC hrefDC, HENHMETAFILE hEMF, LPSTR lpszFileName); // //DLGPROC.C // INT_PTR CALLBACK WMFRecDlgProc(HWND, unsigned, WPARAM, LPARAM); INT_PTR CALLBACK EnhMetaHeaderDlgProc(HWND, unsigned, WPARAM, LPARAM); INT_PTR CALLBACK HeaderDlgProc(HWND, unsigned, WPARAM, LPARAM); INT_PTR CALLBACK ClpHeaderDlgProc(HWND, unsigned, WPARAM, LPARAM); INT_PTR CALLBACK PlaceableHeaderDlgProc(HWND, unsigned, WPARAM, LPARAM); INT_PTR CALLBACK EnumRangeDlgProc(HWND, unsigned, WPARAM, LPARAM); INT_PTR CALLBACK ListDlgProc(HWND, unsigned, WPARAM, LPARAM); INT_PTR CALLBACK PlayFromListDlgProc(HWND, unsigned, WPARAM, LPARAM); INT_PTR CALLBACK About(HWND, unsigned, WPARAM, LPARAM); // //WMFPRINT.C // BOOL PrintWMF(BOOL); HANDLE GetPrinterDC(BOOL); INT_PTR CALLBACK AbortDlg(HWND, unsigned, WPARAM, LPARAM); BOOL CALLBACK AbortProc(HDC, int); // //CMNDLG.C // void InitializeStruct(WORD, LPSTR, LPSTR); int OpenFileDialog(LPSTR); int SaveFileDialog(LPSTR, LPSTR); void SplitPath( LPSTR, LPSTR, LPSTR, LPSTR, LPSTR);