Pass the main exe name in the CREATE_PROCESS debug event.
[wine.git] / programs / view / view.c
blob83cd499b2a514bf063fa32eae2cadc091b4b901d
1 #include <windows.h>
2 #include "resource.h"
4 /*
5 #include <windowsx.h>
6 Wine doesn't have windowsx.h, so we use this
7 */
8 #define GET_WM_COMMAND_ID(wp,lp) LOWORD(wp)
10 /* Wine seems to need this */
11 #include <commdlg.h>
13 #include "globals.h"
14 #include <stdio.h>
16 BOOL FileIsPlaceable( LPCSTR szFileName );
17 HMETAFILE GetPlaceableMetaFile( HWND hwnd, LPCSTR szFileName );
19 #define FN_LENGTH 80
21 HMETAFILE hmf;
22 int deltax = 0, deltay = 0;
23 int width = 0, height = 0;
24 BOOL isAldus;
26 BOOL FileOpen(HWND hWnd, char *fn)
28 OPENFILENAME ofn = { sizeof(OPENFILENAME),
29 0, 0, NULL, NULL, 0, 0, NULL,
30 FN_LENGTH, NULL, 0, NULL, NULL, OFN_CREATEPROMPT |
31 OFN_SHOWHELP, 0, 0, NULL, 0, NULL };
32 ofn.lpstrFilter = "Metafiles\0*.wmf\0";
33 ofn.hwndOwner = hWnd;
34 ofn.lpstrFile = fn;
35 return GetOpenFileName(&ofn);
39 LRESULT CALLBACK WndProc(HWND hwnd,
40 UINT uMessage,
41 WPARAM wparam,
42 LPARAM lparam)
44 switch (uMessage)
46 case WM_PAINT:
48 PAINTSTRUCT ps;
49 BeginPaint(hwnd, &ps);
50 SetMapMode(ps.hdc, MM_ANISOTROPIC);
51 SetViewportExtEx(ps.hdc, width, height, NULL);
52 SetViewportOrgEx(ps.hdc, deltax, deltay, NULL);
53 if(hmf) PlayMetaFile(ps.hdc, hmf);
54 EndPaint(hwnd, &ps);
57 break;
59 case WM_COMMAND: /* message: command from application menu */
60 switch (GET_WM_COMMAND_ID(wparam,lparam))
62 case IDM_HELLO:
63 MessageBox( hwnd , "Hello there world!", "Hello", MB_OK);
64 break;
66 case IDM_OPEN:
68 char filename[FN_LENGTH];
69 if (FileOpen(hwnd, filename)) {
70 isAldus = FileIsPlaceable(filename);
71 if (isAldus) {
72 hmf = GetPlaceableMetaFile(hwnd, filename);
73 } else {
74 RECT r;
75 hmf = GetMetaFile(filename);
76 GetClientRect(hwnd, &r);
77 width = r.right - r.left;
78 height = r.bottom - r.top;
80 InvalidateRect( hwnd, NULL, TRUE );
83 break;
85 case IDM_SET_EXT_TO_WIN:
87 RECT r;
88 GetClientRect(hwnd, &r);
89 width = r.right - r.left;
90 height = r.bottom - r.top;
91 InvalidateRect( hwnd, NULL, TRUE );
93 break;
96 case IDM_LEFT:
97 deltax += 100;
98 InvalidateRect( hwnd, NULL, TRUE );
99 break;
100 case IDM_RIGHT:
101 deltax -= 100;
102 InvalidateRect( hwnd, NULL, TRUE );
103 break;
104 case IDM_UP:
105 deltay += 100;
106 InvalidateRect( hwnd, NULL, TRUE );
107 break;
108 case IDM_DOWN:
109 deltay -= 100;
110 InvalidateRect( hwnd, NULL, TRUE );
111 break;
113 case IDM_EXIT:
114 DestroyWindow(hwnd);
115 break;
117 default:
118 return DefWindowProc(hwnd, uMessage, wparam, lparam);
120 break;
122 case WM_DESTROY: /* message: window being destroyed */
123 PostQuitMessage(0);
124 break;
126 default: /* Passes it on if unproccessed */
127 return DefWindowProc(hwnd, uMessage, wparam, lparam);
129 return 0;
132 BOOL FileIsPlaceable( LPCSTR szFileName )
134 HFILE hInFile;
135 OFSTRUCT inof;
136 APMFILEHEADER apmh;
138 if( (hInFile = OpenFile( szFileName, &inof, OF_READ ) ) == HFILE_ERROR )
139 return FALSE;
141 if( _lread( hInFile, &apmh, sizeof(APMFILEHEADER) )
142 != sizeof(APMFILEHEADER) )
144 _lclose( hInFile );
145 return FALSE;
147 _lclose( hInFile );
149 /* Is it placeable? */
150 return (apmh.key == APMHEADER_KEY);
153 HMETAFILE GetPlaceableMetaFile( HWND hwnd, LPCSTR szFileName )
155 LPSTR lpData;
156 METAHEADER mfHeader;
157 APMFILEHEADER APMHeader;
158 HFILE fh;
159 HMETAFILE hmf;
160 OFSTRUCT inof;
161 WORD checksum, *p;
162 int i;
164 if( (fh = OpenFile( szFileName, &inof, OF_READ ) ) == HFILE_ERROR ) return 0;
165 _llseek(fh, 0, 0);
166 if (!_lread(fh, (LPSTR)&APMHeader, sizeof(APMFILEHEADER))) return 0;
167 _llseek(fh, sizeof(APMFILEHEADER), 0);
168 checksum = 0;
169 p = (WORD *) &APMHeader;
171 for(i=0; i<10; i++)
172 checksum ^= *p++;
173 if (checksum != APMHeader.checksum) {
174 char msg[128];
175 sprintf(msg, "Computed checksum %04x != stored checksum %04x\n",
176 checksum, APMHeader.checksum);
177 MessageBox(hwnd, msg, "Checksum failed", MB_OK);
178 return 0;
181 if (!_lread(fh, (LPSTR)&mfHeader, sizeof(METAHEADER))) return 0;
183 if (!(lpData = (LPSTR) GlobalAlloc(GPTR, (mfHeader.mtSize * 2L)))) return 0;
185 _llseek(fh, sizeof(APMFILEHEADER), 0);
186 if (!_lread(fh, lpData, (UINT)(mfHeader.mtSize * 2L)))
188 GlobalFree((HGLOBAL)lpData);
189 _lclose(fh);
190 return 0;
192 _lclose(fh);
194 if (!(hmf = SetMetaFileBitsEx(mfHeader.mtSize*2, lpData)))
195 return 0;
198 width = APMHeader.bbox.Right - APMHeader.bbox.Left;
199 height = APMHeader.bbox.Bottom - APMHeader.bbox.Top;
201 /* printf("Ok! width %d height %d inch %d\n", width, height, APMHeader.inch); */
202 width = width*96/APMHeader.inch;
203 height = height*96/APMHeader.inch;
205 deltax = 0;
206 deltay = 0 ;
207 return hmf;