|
|
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.