2 * Copyright 1998 Douglas Ridgway
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26 BOOL
FileIsPlaceable( LPCSTR szFileName
);
27 HMETAFILE
GetPlaceableMetaFile( HWND hwnd
, LPCSTR szFileName
);
30 int deltax
= 0, deltay
= 0;
31 int width
= 0, height
= 0;
34 static BOOL
FileOpen(HWND hWnd
, char *fn
, int fnsz
)
36 OPENFILENAME ofn
= { sizeof(OPENFILENAME
),
37 0, 0, NULL
, NULL
, 0, 0, NULL
,
38 fnsz
, NULL
, 0, NULL
, NULL
,
39 OFN_SHOWHELP
, 0, 0, NULL
, 0, NULL
};
40 ofn
.lpstrFilter
= "Metafiles\0*.wmf\0";
46 return GetOpenFileName(&ofn
);
50 LRESULT CALLBACK
WndProc(HWND hwnd
,
60 BeginPaint(hwnd
, &ps
);
61 SetMapMode(ps
.hdc
, MM_ANISOTROPIC
);
62 /* Set the window extent to a sane value in case the metafile doesn't */
63 SetWindowExtEx(ps
.hdc
, width
, height
, NULL
);
64 SetViewportExtEx(ps
.hdc
, width
, height
, NULL
);
65 SetViewportOrgEx(ps
.hdc
, deltax
, deltay
, NULL
);
66 if(hmf
) PlayMetaFile(ps
.hdc
, hmf
);
71 case WM_COMMAND
: /* message: command from application menu */
72 switch (GET_WM_COMMAND_ID(wparam
,lparam
))
75 MessageBox( hwnd
, "Hello there world!", "Hello", MB_OK
);
80 char filename
[MAX_PATH
];
81 if (FileOpen(hwnd
, filename
, sizeof(filename
))) {
82 isAldus
= FileIsPlaceable(filename
);
84 hmf
= GetPlaceableMetaFile(hwnd
, filename
);
87 hmf
= GetMetaFile(filename
);
88 GetClientRect(hwnd
, &r
);
89 width
= r
.right
- r
.left
;
90 height
= r
.bottom
- r
.top
;
92 InvalidateRect( hwnd
, NULL
, TRUE
);
97 case IDM_SET_EXT_TO_WIN
:
100 GetClientRect(hwnd
, &r
);
101 width
= r
.right
- r
.left
;
102 height
= r
.bottom
- r
.top
;
103 InvalidateRect( hwnd
, NULL
, TRUE
);
110 InvalidateRect( hwnd
, NULL
, TRUE
);
114 InvalidateRect( hwnd
, NULL
, TRUE
);
118 InvalidateRect( hwnd
, NULL
, TRUE
);
122 InvalidateRect( hwnd
, NULL
, TRUE
);
130 return DefWindowProc(hwnd
, uMessage
, wparam
, lparam
);
134 case WM_DESTROY
: /* message: window being destroyed */
138 default: /* Passes it on if unprocessed */
139 return DefWindowProc(hwnd
, uMessage
, wparam
, lparam
);
144 BOOL
FileIsPlaceable( LPCSTR szFileName
)
149 if( (hInFile
= _lopen( szFileName
, OF_READ
) ) == HFILE_ERROR
)
152 if( _lread( hInFile
, &apmh
, sizeof(APMFILEHEADER
) )
153 != sizeof(APMFILEHEADER
) )
160 /* Is it placeable? */
161 return (apmh
.key
== APMHEADER_KEY
);
164 HMETAFILE
GetPlaceableMetaFile( HWND hwnd
, LPCSTR szFileName
)
168 APMFILEHEADER APMHeader
;
175 if( (fh
= _lopen( szFileName
, OF_READ
) ) == HFILE_ERROR
) return 0;
177 if (!_lread(fh
, (LPSTR
)&APMHeader
, sizeof(APMFILEHEADER
))) return 0;
178 _llseek(fh
, sizeof(APMFILEHEADER
), 0);
180 p
= (WORD
*) &APMHeader
;
184 if (checksum
!= APMHeader
.checksum
) {
186 sprintf(msg
, "Computed checksum %04x != stored checksum %04x\n",
187 checksum
, APMHeader
.checksum
);
188 MessageBox(hwnd
, msg
, "Checksum failed", MB_OK
);
192 if (!_lread(fh
, (LPSTR
)&mfHeader
, sizeof(METAHEADER
))) return 0;
194 if (!(lpData
= (LPSTR
) GlobalAlloc(GPTR
, (mfHeader
.mtSize
* 2L)))) return 0;
196 _llseek(fh
, sizeof(APMFILEHEADER
), 0);
197 if (!_lread(fh
, lpData
, (UINT
)(mfHeader
.mtSize
* 2L)))
199 GlobalFree((HGLOBAL
)lpData
);
205 if (!(hmf
= SetMetaFileBitsEx(mfHeader
.mtSize
*2, lpData
)))
209 width
= APMHeader
.bbox
.Right
- APMHeader
.bbox
.Left
;
210 height
= APMHeader
.bbox
.Bottom
- APMHeader
.bbox
.Top
;
212 /* printf("Ok! width %d height %d inch %d\n", width, height, APMHeader.inch); */
214 width
= width
* GetDeviceCaps(hdc
, LOGPIXELSX
)/APMHeader
.inch
;
215 height
= height
* GetDeviceCaps(hdc
,LOGPIXELSY
)/APMHeader
.inch
;
216 ReleaseDC(hwnd
, hdc
);