- New implementation of SendMessage, ReceiveMessage, ReplyMessage functions
[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 #include <stdio.h>
15
16 BOOL FileIsPlaceable( LPCSTR szFileName );
17 HMETAFILE GetPlaceableMetaFile( HWND hwnd, LPCSTR szFileName );
18
19 #define FN_LENGTH 80
20
21 HMETAFILE hmf;
22 int deltax = 0, deltay = 0;
23 int width = 0, height = 0;
24 BOOL isAldus;
25
26 BOOL FileOpen(HWND hWnd, char *fn)
27 {
28   OPENFILENAME ofn = { sizeof(OPENFILENAME),
29                        0, 0, "Metafiles\0*.wmf\0", NULL, 0, 0, NULL, 
30                        FN_LENGTH, NULL, 0, NULL, NULL, OFN_CREATEPROMPT |
31                        OFN_SHOWHELP, 0, 0, NULL, 0, NULL };
32   ofn.hwndOwner = hWnd;
33   ofn.lpstrFile = fn;
34   return GetOpenFileName(&ofn);
35 }
36
37
38 LRESULT CALLBACK WndProc(HWND hwnd,
39                          UINT uMessage,
40                          WPARAM wparam,
41                          LPARAM lparam)
42 {
43   switch (uMessage)
44     {
45     case WM_PAINT: 
46       {
47         PAINTSTRUCT ps; 
48         BeginPaint(hwnd, &ps);
49         SetMapMode(ps.hdc, MM_ANISOTROPIC);
50         SetViewportExtEx(ps.hdc, width, height, NULL);
51         SetViewportOrgEx(ps.hdc, deltax, deltay, NULL);
52         if(hmf) PlayMetaFile(ps.hdc, hmf);
53         EndPaint(hwnd, &ps);
54
55       }
56       break;
57
58     case WM_COMMAND: /* message: command from application menu */
59       switch (GET_WM_COMMAND_ID(wparam,lparam))
60         {
61         case IDM_HELLO:
62           MessageBox( hwnd , "Hello there world!", "Hello", MB_OK);
63           break;
64
65         case IDM_OPEN:
66           {
67             char filename[FN_LENGTH];
68             if (FileOpen(hwnd, filename)) {
69               isAldus = FileIsPlaceable(filename);
70               if (isAldus) {
71                 hmf = GetPlaceableMetaFile(hwnd, filename);
72               } else {
73                 RECT r;
74                 hmf = GetMetaFile(filename);
75                 GetClientRect(hwnd, &r);
76                 width = r.right - r.left;
77                 height = r.bottom - r.top;
78               }
79               InvalidateRect( hwnd, NULL, TRUE );
80             }
81           }
82           break;
83           
84         case IDM_SET_EXT_TO_WIN:
85           {
86             RECT r;
87             GetClientRect(hwnd, &r);
88             width = r.right - r.left;
89             height = r.bottom - r.top;
90             InvalidateRect( hwnd, NULL, TRUE );
91           }
92           break;
93
94           
95         case IDM_LEFT:
96           deltax += 100;
97           InvalidateRect( hwnd, NULL, TRUE );
98           break;
99         case IDM_RIGHT:
100           deltax -= 100;
101           InvalidateRect( hwnd, NULL, TRUE );
102           break;
103         case IDM_UP:
104           deltay += 100;
105           InvalidateRect( hwnd, NULL, TRUE );
106           break;
107         case IDM_DOWN:
108           deltay -= 100;
109           InvalidateRect( hwnd, NULL, TRUE );
110           break;
111
112         case IDM_EXIT:
113           DestroyWindow(hwnd);
114           break;
115
116         default:
117           return DefWindowProc(hwnd, uMessage, wparam, lparam);
118         }
119       break;
120
121     case WM_DESTROY:  /* message: window being destroyed */
122       PostQuitMessage(0);
123       break;
124
125     default:          /* Passes it on if unproccessed */
126       return DefWindowProc(hwnd, uMessage, wparam, lparam);
127     }
128     return 0;
129 }
130
131 BOOL FileIsPlaceable( LPCSTR szFileName )
132 {
133   HFILE         hInFile;
134   OFSTRUCT              inof;
135   APMFILEHEADER apmh;
136
137   if( (hInFile = OpenFile( szFileName, &inof, OF_READ ) ) == HFILE_ERROR )
138     return FALSE;
139
140   if( _lread( hInFile, &apmh, sizeof(APMFILEHEADER) ) 
141       != sizeof(APMFILEHEADER) )
142     {
143       _lclose( hInFile );
144       return FALSE;
145     }
146   _lclose( hInFile );
147
148   /* Is it placeable? */
149   return (apmh.key == APMHEADER_KEY);
150 }
151
152 HMETAFILE GetPlaceableMetaFile( HWND hwnd, LPCSTR szFileName )
153 {
154   LPSTR lpData;
155   METAHEADER mfHeader;
156   APMFILEHEADER APMHeader;
157   HFILE fh;
158   HMETAFILE hmf;
159   OFSTRUCT inof;
160   WORD checksum, *p;
161   int i;
162
163   if( (fh = OpenFile( szFileName, &inof, OF_READ ) ) == HFILE_ERROR ) return 0;
164   _llseek(fh, 0, 0);
165   if (!_lread(fh, (LPSTR)&APMHeader, sizeof(APMFILEHEADER))) return 0;
166   _llseek(fh, sizeof(APMFILEHEADER), 0);
167   checksum = 0;
168   p = (WORD *) &APMHeader;
169
170   for(i=0; i<10; i++) 
171     checksum ^= *p++;
172   if (checksum != APMHeader.checksum) {
173     char msg[128];
174     sprintf(msg, "Computed checksum %04x != stored checksum %04x\n", 
175            checksum, APMHeader.checksum);
176         MessageBox(hwnd, msg, "Checksum failed", MB_OK);
177     return 0;
178   }
179
180   if (!_lread(fh, (LPSTR)&mfHeader, sizeof(METAHEADER))) return 0;
181
182   if (!(lpData = (LPSTR) GlobalAlloc(GPTR, (mfHeader.mtSize * 2L)))) return 0;
183
184   _llseek(fh, sizeof(APMFILEHEADER), 0);
185   if (!_lread(fh, lpData, (UINT)(mfHeader.mtSize * 2L)))
186   {
187     GlobalFree(lpData);
188     _lclose(fh);
189     return 0;
190   }
191   _lclose(fh);
192
193   if (!(hmf = SetMetaFileBitsEx(mfHeader.mtSize*2, lpData))) 
194     return 0;
195
196   
197   width = APMHeader.bbox.Right - APMHeader.bbox.Left;
198   height = APMHeader.bbox.Bottom - APMHeader.bbox.Top;
199
200   /*      printf("Ok! width %d height %d inch %d\n", width, height, APMHeader.inch);  */
201   width = width*96/APMHeader.inch;
202   height = height*96/APMHeader.inch;
203
204   deltax = 0;
205   deltay = 0 ;
206   return hmf;
207 }
208
209