|
|
1.1 root 1: /*--------------------------------------------
2: PMCAP.C -- Captures PM Screen to .BMP File
3: --------------------------------------------*/
4:
5: #define INCL_WIN
6: #define INCL_GPI
7: #include <os2.h>
8: #include <stdlib.h>
9: #include <stdio.h>
10: #include "pmcap.h"
11:
12: #define ID_TIMER 1
13:
14: typedef struct
15: {
16: BOOL fMonochrome ;
17: BOOL fHideWindow ;
18: BOOL fAutoDialog ;
19: BOOL fIncludePtr ;
20: SHORT sDelay ;
21: SHORT sDisplay ;
22: }
23: SETTINGS ;
24:
25: MRESULT CALLBACK ClientWndProc (HWND, USHORT, MPARAM, MPARAM) ;
26: MRESULT CALLBACK AboutDlgProc (HWND, USHORT, MPARAM, MPARAM) ;
27: MRESULT CALLBACK SaveDlgProc (HWND, USHORT, MPARAM, MPARAM) ;
28:
29: CHAR szClientClass [] = "PMCAP" ;
30: HAB hab ;
31:
32: int main (void)
33: {
34: static SWCNTRL swctl ;
35: static ULONG flFrameFlags = FCF_TITLEBAR | FCF_SYSMENU |
36: FCF_SIZEBORDER | FCF_MINMAX |
37: FCF_MENU | FCF_ACCELTABLE |
38: FCF_SHELLPOSITION;
39: HMQ hmq ;
40: HSWITCH hsw ;
41: HWND hwndFrame, hwndClient ;
42: QMSG qmsg ;
43:
44: hab = WinInitialize (0) ;
45: hmq = WinCreateMsgQueue (hab, 0) ;
46:
47: WinRegisterClass (hab, szClientClass, ClientWndProc, CS_SIZEREDRAW, 0) ;
48:
49: hwndFrame = WinCreateStdWindow (HWND_DESKTOP, WS_VISIBLE,
50: &flFrameFlags, szClientClass,
51: "PMCAP - Captures PM Screen",
52: 0L, NULL, ID_RESOURCE, &hwndClient) ;
53:
54: WinSendMsg (hwndFrame, WM_SETICON,
55: WinQuerySysPointer (HWND_DESKTOP, SPTR_APPICON, FALSE),
56: NULL) ;
57:
58: swctl.hwnd = hwndFrame ;
59: hsw = WinAddSwitchEntry (&swctl) ;
60:
61: while (WinGetMsg (hab, &qmsg, NULL, 0, 0))
62: WinDispatchMsg (hab, &qmsg) ;
63:
64: WinRemoveSwitchEntry (hsw) ;
65: WinDestroyWindow (hwndFrame) ;
66: WinDestroyMsgQueue (hmq) ;
67: WinTerminate (hab) ;
68: return 0 ;
69: }
70:
71: MRESULT CALLBACK ClientWndProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
72: {
73: static CHAR szFilename [81],
74: szFilePaint [81],
75: szAppName [] = "PMCAP",
76: szKeySet [] = "SETTINGS",
77: szKeyFile [] = "FILENAME" ,
78: szKeyPaint[] = "FILEPAINT" ;
79: static HBITMAP hbm ;
80: static HWND hwndFrame, hwndMenu ;
81: static SETTINGS set = { FALSE, FALSE, TRUE, FALSE,
82: IDM_DELAY15, IDM_ACTUAL } ;
83: static SHORT cxScreen, cyScreen, sCountDown ;
84: HBITMAP hbmClip ;
85: HPS hps ;
86: RECTL rcl ;
87: SHORT sSaveResult, sLen ;
88: USHORT usfInfo ;
89:
90: switch (msg)
91: {
92: case WM_CREATE:
93: cxScreen = (SHORT) WinQuerySysValue (HWND_DESKTOP, SV_CXSCREEN);
94: cyScreen = (SHORT) WinQuerySysValue (HWND_DESKTOP, SV_CYSCREEN);
95:
96: WinQueryProfileData (hab, szAppName, szKeySet, &set, &sLen);
97: WinQueryProfileString (hab, szAppName, szKeyFile,
98: "BITMAP00.BMP", szFilename,
99: sizeof szFilename - 1) ;
100: WinQueryProfileString (hab, szAppName, szKeyPaint,
101: "PAINT00.MSP", szFilePaint,
102: sizeof szFilePaint - 1) ;
103:
104: SaveColorSettings (TRUE, set.fMonochrome) ;
105:
106: hwndFrame = WinQueryWindow (hwnd, QW_PARENT, FALSE) ;
107: hwndMenu = WinWindowFromID (hwndFrame, FID_MENU) ;
108:
109: CheckMenuItem (hwndMenu, IDM_MONO, set.fMonochrome) ;
110: CheckMenuItem (hwndMenu, IDM_HIDE, set.fHideWindow) ;
111: CheckMenuItem (hwndMenu, IDM_AUTODLG, set.fAutoDialog) ;
112: CheckMenuItem (hwndMenu, IDM_POINTER, set.fIncludePtr) ;
113: CheckMenuItem (hwndMenu, set.sDelay, TRUE) ;
114: CheckMenuItem (hwndMenu, set.sDisplay, TRUE) ;
115:
116: AddItemToSysMenu (hwndFrame) ;
117: return 0 ;
118:
119: case WM_INITMENU:
120: switch (SHORT1FROMMP (mp1))
121: {
122: case IDM_FILE:
123: EnableMenuItem (hwndMenu, IDM_SAVE, hbm != NULL) ;
124: EnableMenuItem (hwndMenu, IDM_SAVEPAINT,
125: IsBitmapMonoEGA (hbm)) ;
126: return 0 ;
127:
128: case IDM_EDIT:
129: EnableMenuItem (hwndMenu, IDM_COPY, hbm != NULL) ;
130: EnableMenuItem (hwndMenu, IDM_PASTE,
131: WinQueryClipbrdFmtInfo (hab, CF_BITMAP, &usfInfo)
132: && usfInfo == CFI_HANDLE) ;
133: return 0 ;
134: }
135: break ;
136:
137: case WM_COMMAND:
138: switch (COMMANDMSG(&msg)->cmd)
139: {
140: case IDM_ABOUT:
141: WinDlgBox (HWND_DESKTOP, hwnd, AboutDlgProc,
142: NULL, IDD_ABOUT, NULL) ;
143: return 0 ;
144:
145: case IDM_SAVE:
146: if (!WinDlgBox (HWND_DESKTOP, hwnd, SaveDlgProc,
147: NULL, IDD_SAVE, szFilename))
148: return 0 ;
149:
150: if (hbm != NULL)
151: {
152: WinSetPointer (HWND_DESKTOP,
153: WinQuerySysPointer (HWND_DESKTOP,
154: SPTR_WAIT, FALSE)) ;
155:
156: sSaveResult = SaveBitmap (hbm, szFilename) ;
157:
158: WinSetPointer (HWND_DESKTOP,
159: WinQuerySysPointer (HWND_DESKTOP,
160: SPTR_ARROW, FALSE)) ;
161:
162: if (sSaveResult)
163: ErrorMessage (hwnd, sSaveResult) ;
164: else
165: IncrementFilename (szFilename) ;
166: }
167: return 0 ;
168:
169: case IDM_SAVEPAINT:
170: if (!WinDlgBox (HWND_DESKTOP, hwnd, SaveDlgProc,
171: NULL, IDD_SAVEPAINT, szFilePaint))
172: return 0 ;
173:
174: if (IsBitmapMonoEGA (hbm))
175: {
176: WinSetPointer (HWND_DESKTOP,
177: WinQuerySysPointer (HWND_DESKTOP,
178: SPTR_WAIT, FALSE)) ;
179:
180: sSaveResult = SavePaintFormat (hbm, szFilePaint);
181:
182: WinSetPointer (HWND_DESKTOP,
183: WinQuerySysPointer (HWND_DESKTOP,
184: SPTR_ARROW, FALSE)) ;
185:
186: if (sSaveResult)
187: ErrorMessage (hwnd, sSaveResult) ;
188: else
189: IncrementFilename (szFilePaint) ;
190: }
191: return 0 ;
192:
193: case IDM_COPY:
194: // Make copy of stored bitmap
195:
196: hbmClip = CopyBitmap (hbm) ;
197:
198: // Set clipboard data to copy
199:
200: if (hbmClip != NULL)
201: {
202: WinOpenClipbrd (hab) ;
203: WinEmptyClipbrd (hab) ;
204: WinSetClipbrdData (hab, (ULONG) hbmClip,
205: CF_BITMAP, CFI_HANDLE) ;
206: WinCloseClipbrd (hab) ;
207: }
208: else
209: ErrorMessage (hwnd, IDS_BMPCREATE) ;
210: return 0 ;
211:
212: case IDM_PASTE:
213: // Get bitmap from clipboard
214:
215: WinOpenClipbrd (hab) ;
216: hbmClip = WinQueryClipbrdData (hab, CF_BITMAP) ;
217:
218: if (hbmClip != NULL)
219: {
220: if (hbm != NULL)
221: GpiDeleteBitmap (hbm) ;
222:
223: // Make copy of it
224:
225: hbm = CopyBitmap (hbmClip) ;
226:
227: if (hbm == NULL)
228: ErrorMessage (hwnd, IDS_BMPCREATE) ;
229: }
230: WinCloseClipbrd (hab) ;
231: WinInvalidateRect (hwnd, NULL, FALSE) ;
232: return 0 ;
233:
234: case IDM_BEGIN:
235: if (WinStartTimer (hab, hwnd, ID_TIMER, 1000))
236: {
237: EnableMenuItem (hwndMenu, IDM_BEGIN, FALSE) ;
238: EnableMenuItem (hwndMenu, IDM_ABORT, TRUE) ;
239: sCountDown = set.sDelay - IDM_DELAY ;
240:
241: if (set.fHideWindow)
242: WinShowWindow (hwndFrame, FALSE) ;
243: }
244: else
245: ErrorMessage (hwnd, IDS_TIMER) ;
246:
247: return 0 ;
248:
249: case IDM_ABORT:
250: EnableMenuItem (hwndMenu, IDM_BEGIN, TRUE) ;
251: EnableMenuItem (hwndMenu, IDM_ABORT, FALSE) ;
252:
253: WinStopTimer (hab, hwnd, ID_TIMER) ;
254: return 0 ;
255:
256: case IDM_MONO:
257: CheckMenuItem (hwndMenu, IDM_MONO,
258: set.fMonochrome = !set.fMonochrome) ;
259:
260: SaveColorSettings (FALSE, set.fMonochrome) ;
261: return 0 ;
262:
263: case IDM_HIDE:
264: CheckMenuItem (hwndMenu, IDM_HIDE,
265: set.fHideWindow = !set.fHideWindow) ;
266: return 0 ;
267:
268: case IDM_AUTODLG:
269: CheckMenuItem (hwndMenu, IDM_AUTODLG,
270: set.fAutoDialog = !set.fAutoDialog) ;
271: return 0 ;
272:
273: case IDM_POINTER:
274: CheckMenuItem (hwndMenu, IDM_POINTER,
275: set.fIncludePtr = !set.fIncludePtr) ;
276: return 0 ;
277:
278: case IDM_DELAY5:
279: case IDM_DELAY10:
280: case IDM_DELAY15:
281: case IDM_DELAY30:
282: case IDM_DELAY60:
283: CheckMenuItem (hwndMenu, set.sDelay, FALSE) ;
284: set.sDelay = COMMANDMSG(&msg)->cmd ;
285: CheckMenuItem (hwndMenu, set.sDelay, TRUE) ;
286: return 0 ;
287:
288: case IDM_ACTUAL:
289: case IDM_STRETCH:
290: CheckMenuItem (hwndMenu, set.sDisplay, FALSE) ;
291: set.sDisplay = COMMANDMSG(&msg)->cmd ;
292: CheckMenuItem (hwndMenu, set.sDisplay, TRUE) ;
293:
294: WinInvalidateRect (hwnd, NULL, FALSE) ;
295: return 0 ;
296: }
297:
298: case WM_TIMER:
299: switch (SHORT1FROMMP (mp1))
300: {
301: case ID_TIMER:
302: if (--sCountDown)
303: {
304: DosBeep (1024, 100) ;
305: return 0 ;
306: }
307:
308: DosBeep (1024, 1000) ;
309: WinStopTimer (hab, hwnd, ID_TIMER) ;
310: EnableMenuItem (hwndMenu, IDM_BEGIN, TRUE) ;
311: EnableMenuItem (hwndMenu, IDM_ABORT, FALSE) ;
312:
313: // Delete old bitmap
314: if (hbm != NULL)
315: GpiDeleteBitmap (hbm) ;
316:
317: // Copy screen to bitmap
318:
319: hbm = ScreenToBitmap (cxScreen, cyScreen,
320: set.fIncludePtr,
321: set.fMonochrome) ;
322:
323: if (set.fHideWindow)
324: WinShowWindow (hwndFrame, TRUE) ;
325:
326: if (hbm == NULL)
327: ErrorMessage (hwnd, IDS_BMPCREATE) ;
328:
329: else if (set.fAutoDialog)
330: WinPostMsg (hwnd, WM_COMMAND,
331: MPFROMSHORT (
332: set.fMonochrome ? IDM_SAVEPAINT
333: : IDM_SAVE),
334: NULL) ;
335:
336: WinInvalidateRect (hwnd, NULL, FALSE) ;
337: WinUpdateWindow (hwnd) ;
338: return 0 ;
339: }
340: break ;
341:
342: case WM_PAINT:
343: hps = WinBeginPaint (hwnd, NULL, NULL) ;
344: GpiErase (hps) ;
345:
346: if (hbm != NULL)
347: {
348: WinQueryWindowRect (hwnd, &rcl) ;
349:
350: WinDrawBitmap (hps, hbm, NULL, (PPOINTL) &rcl,
351: CLR_NEUTRAL, CLR_BACKGROUND,
352: set.sDisplay == IDM_STRETCH ?
353: DBM_STRETCH : DBM_NORMAL) ;
354: }
355: WinEndPaint (hps) ;
356: return 0 ;
357:
358: case WM_DESTROY:
359: if (hbm != NULL)
360: GpiDeleteBitmap (hbm) ;
361:
362: WinWriteProfileString (hab, szAppName, szKeyFile, szFilename) ;
363: WinWriteProfileString (hab, szAppName, szKeyPaint,szFilePaint);
364: WinWriteProfileData (hab, szAppName, szKeySet,
365: &set, sizeof set) ;
366:
367: if (set.fMonochrome)
368: SaveColorSettings (FALSE, FALSE) ;
369:
370: return 0 ;
371: }
372: return WinDefWindowProc (hwnd, msg, mp1, mp2) ;
373: }
374:
375: MRESULT CALLBACK AboutDlgProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
376: {
377: switch (msg)
378: {
379: case WM_COMMAND:
380: switch (COMMANDMSG(&msg)->cmd)
381: {
382: case DID_OK:
383: case DID_CANCEL:
384: WinDismissDlg (hwnd, TRUE) ;
385: return 0 ;
386: }
387: break ;
388: }
389: return WinDefDlgProc (hwnd, msg, mp1, mp2) ;
390: }
391:
392: MRESULT CALLBACK SaveDlgProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
393: {
394: static PCHAR szFilename ;
395: FILE *file ;
396:
397: switch (msg)
398: {
399: case WM_INITDLG:
400: szFilename = PVOIDFROMMP (mp2) ;
401:
402: WinSendDlgItemMsg (hwnd, IDD_FILENAME, EM_SETTEXTLIMIT,
403: MPFROMSHORT (80), NULL) ;
404:
405: WinSetDlgItemText (hwnd, IDD_FILENAME, szFilename) ;
406: break ;
407:
408: case WM_COMMAND:
409: switch (COMMANDMSG(&msg)->cmd)
410: {
411: case DID_OK:
412: WinQueryDlgItemText (hwnd, IDD_FILENAME,
413: 80, szFilename) ;
414:
415: // Test if file exists
416:
417: if (file = fopen (szFilename, "r"))
418: {
419: fclose (file) ;
420:
421: if (MBID_NO == WinMessageBox (HWND_DESKTOP, hwnd,
422: "File exists. Replace it?",
423: szClientClass, 0,
424: MB_YESNO | MB_ICONQUESTION |
425: MB_DEFBUTTON2 | MB_MOVEABLE))
426: return 0 ;
427: }
428:
429: WinDismissDlg (hwnd, TRUE) ;
430: return 0 ;
431:
432: case DID_CANCEL:
433: WinDismissDlg (hwnd, FALSE) ;
434: return 0 ;
435: }
436: break ;
437: }
438: return WinDefDlgProc (hwnd, msg, mp1, mp2) ;
439: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.