Release 980315
[wine] / programs / view / view.c
1 #include <windows.h>
2
3 /* 
4 #include <windowsx.h>
5    Wine doesn't have windowsx.h, so we use this
6 */
7 #define       GET_WM_COMMAND_ID(wp,lp)        LOWORD(wp)
8
9 /* Wine seems to need this */
10 #include <commdlg.h>
11
12 #include "globals.h"        
13 #include "resource.h"
14
15 BOOL FileIsPlaceable( LPCSTR szFileName );
16 HMETAFILE GetPlaceableMetaFile( LPCSTR szFileName );
17
18 #define FN_LENGTH 80
19
20 HMETAFILE hmf;
21 int deltax = 0, deltay = 0;
22 int width = 0, height = 0;
23 BOOL isAldus;
24
25 BOOL FileOpen(HWND hWnd, char *fn)
26 {
27   OPENFILENAME ofn = { sizeof(OPENFILENAME),
28                        0, NULL, "Metafiles\0*.wmf\0", NULL, 0, 0, NULL, 
29                        FN_LENGTH, NULL, 0, NULL, NULL, OFN_CREATEPROMPT |
30                        OFN_SHOWHELP, 0, 0, NULL, 0, NULL };
31   ofn.hwndOwner = hWnd;
32   ofn.lpstrFile = fn;
33   return GetOpenFileName(&ofn);
34 }
35
36
37 LRESULT CALLBACK WndProc(HWND hwnd,
38                          UINT uMessage,
39                          WPARAM wparam,
40                          LPARAM lparam)
41 {
42   switch (uMessage)
43     {
44     case WM_PAINT: 
45       {
46         PAINTSTRUCT ps; 
47         BeginPaint(hwnd, &ps);
48         SetMapMode(ps.hdc, MM_ANISOTROPIC);
49         SetViewportExt(ps.hdc, width, height);
50         SetViewportOrgEx(ps.hdc, deltax, deltay, NULL);
51         if(hmf) PlayMetaFile(ps.hdc, hmf);
52         EndPaint(hwnd, &ps);
53
54       }
55       break;
56
57     case WM_COMMAND: /* message: command from application menu */
58       switch (GET_WM_COMMAND_ID(wparam,lparam))
59         {
60         case IDM_HELLO:
61           MessageBox( hwnd , "Hello there world!", "Hello", MB_OK);
62           break;
63
64         case IDM_OPEN:
65           {
66             char filename[FN_LENGTH];
67             if (FileOpen(hwnd, filename)) {
68               isAldus = FileIsPlaceable(filename);
69               if (isAldus) {
70 #if 1
71                 hmf = GetPlaceableMetaFile(filename);
72 #else
73                 MessageBox(hwnd, "This is an Aldus placeable metafile: I can't deal with those!",
74                            "Aldus", MB_OK);
75 #endif
76               } else {
77                 RECT r;
78                 hmf = GetMetaFile(filename);
79                 GetClientRect(hwnd, &r);
80                 width = r.right - r.left;
81                 height = r.bottom - r.top;
82               }
83               InvalidateRect( hwnd, NULL, TRUE );
84             }
85           }
86           break;
87           
88         case IDM_LEFT:
89           deltax += 100;
90           InvalidateRect( hwnd, NULL, TRUE );
91           break;
92         case IDM_RIGHT:
93           deltax -= 100;
94           InvalidateRect( hwnd, NULL, TRUE );
95           break;
96         case IDM_UP:
97           deltay += 100;
98           InvalidateRect( hwnd, NULL, TRUE );
99           break;
100         case IDM_DOWN:
101           deltay -= 100;
102           InvalidateRect( hwnd, NULL, TRUE );
103           break;
104
105         case IDM_EXIT:
106           DestroyWindow(hwnd);
107           break;
108
109         default:
110           return DefWindowProc(hwnd, uMessage, wparam, lparam);
111         }
112       break;
113
114     case WM_DESTROY:  /* message: window being destroyed */
115       PostQuitMessage(0);
116       break;
117
118     default:          /* Passes it on if unproccessed */
119       return DefWindowProc(hwnd, uMessage, wparam, lparam);
120     }
121     return 0;
122 }
123
124 BOOL FileIsPlaceable( LPCSTR szFileName )
125 {
126   HFILE         hInFile;
127   OFSTRUCT              inof;
128   APMFILEHEADER apmh;
129
130   if( (hInFile = OpenFile( szFileName, &inof, OF_READ ) ) == HFILE_ERROR )
131     return FALSE;
132
133   if( _lread( hInFile, &apmh, sizeof(APMFILEHEADER) ) 
134       != sizeof(APMFILEHEADER) )
135     {
136       _lclose( hInFile );
137       return FALSE;
138     }
139   _lclose( hInFile );
140
141   /* Is it placeable? */
142   return (apmh.key == APMHEADER_KEY);
143 }
144
145 /* this code doesn't work */
146 #if 1
147 HMETAFILE GetPlaceableMetaFile( LPCSTR szFileName )
148 {
149   HANDLE hData;
150   LPSTR lpData;
151   METAHEADER mfHeader;
152   APMFILEHEADER APMHeader;
153   HMETAFILE hmf = NULL;
154   HFILE fh;
155   OFSTRUCT inof;
156
157   if( (fh = OpenFile( szFileName, &inof, OF_READ ) ) == HFILE_ERROR ) return NULL;
158   _llseek(fh, 0, 0);
159   if (!_lread(fh, (LPSTR)&APMHeader, sizeof(APMFILEHEADER))) return NULL;
160   _llseek(fh, sizeof(APMFILEHEADER), 0);
161   printf("sizeof(APMFILEHEADER) %d\n", sizeof(APMFILEHEADER));
162   if (!_lread(fh, (LPSTR)&mfHeader, sizeof(METAHEADER))) return NULL;
163
164   if (!(hData = GlobalAlloc(GHND, (mfHeader.mtSize * 2L)))) return NULL;
165
166   if (!(lpData = GlobalLock(hData)))
167   {
168     GlobalFree(hData);
169     return NULL;
170   }
171
172   _llseek(fh, sizeof(APMFILEHEADER), 0);
173   if (!_lread(fh, lpData, (UINT)(mfHeader.mtSize * 2L)))
174   {
175     GlobalUnlock(hData);
176     GlobalFree(hData);
177     return NULL;
178   }
179   _lclose(fh);
180   GlobalUnlock(hData);
181
182   if (!(hmf = (HMETAFILE) SetMetaFileBits(hData))) return NULL;
183
184   
185   width = APMHeader.bbox.right - APMHeader.bbox.left;
186   height = APMHeader.bbox.bottom - APMHeader.bbox.top;
187
188   printf("Ok! width %d height %d\n", width, height);
189   deltax = 0;
190   deltay = 0 ;
191   return hmf;
192 }
193 #endif
194
195