|
|
1.1 ! root 1: /*------------------------------------- ! 2: SKETCH.C -- Mouse Sketching Program ! 3: -------------------------------------*/ ! 4: ! 5: #define INCL_WIN ! 6: #define INCL_GPI ! 7: #include <os2.h> ! 8: ! 9: MRESULT EXPENTRY ClientWndProc (HWND, USHORT, MPARAM, MPARAM) ; ! 10: ! 11: HAB hab ; ! 12: ! 13: int main (void) ! 14: { ! 15: static CHAR szClientClass [] = "Sketch" ; ! 16: static ULONG flFrameFlags = FCF_TITLEBAR | FCF_SYSMENU | ! 17: FCF_SIZEBORDER | FCF_MINMAX | ! 18: FCF_SHELLPOSITION | FCF_TASKLIST ; ! 19: HMQ hmq ; ! 20: HWND hwndFrame, hwndClient ; ! 21: QMSG qmsg ; ! 22: ! 23: hab = WinInitialize (0) ; ! 24: hmq = WinCreateMsgQueue (hab, 0) ; ! 25: ! 26: WinRegisterClass (hab, szClientClass, ClientWndProc, CS_SIZEREDRAW, 0) ; ! 27: ! 28: hwndFrame = WinCreateStdWindow (HWND_DESKTOP, WS_VISIBLE, ! 29: &flFrameFlags, szClientClass, NULL, ! 30: 0L, NULL, 0, &hwndClient) ; ! 31: ! 32: if (hwndFrame == NULL) ! 33: WinMessageBox (HWND_DESKTOP, HWND_DESKTOP, ! 34: "Not enough memory to create the " ! 35: "bitmap used for storing images.", ! 36: szClientClass, 0, MB_OK | MB_ICONEXCLAMATION) ; ! 37: else ! 38: { ! 39: WinSendMsg (hwndFrame, WM_SETICON, ! 40: WinQuerySysPointer (HWND_DESKTOP, SPTR_APPICON, FALSE), ! 41: NULL) ; ! 42: ! 43: while (WinGetMsg (hab, &qmsg, NULL, 0, 0)) ! 44: WinDispatchMsg (hab, &qmsg) ; ! 45: ! 46: WinDestroyWindow (hwndFrame) ; ! 47: } ! 48: ! 49: WinDestroyMsgQueue (hmq) ; ! 50: WinTerminate (hab) ; ! 51: return 0 ; ! 52: } ! 53: ! 54: MRESULT EXPENTRY ClientWndProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2) ! 55: { ! 56: static BOOL fButton1Down, fButton2Down ; ! 57: static HBITMAP hbm ; ! 58: static HDC hdcMemory ; ! 59: static HPS hpsMemory ; ! 60: static POINTL ptlPointerPos, aptl [3] ; ! 61: BITMAPINFOHEADER bmp ; ! 62: HPS hpsWindow ; ! 63: LONG cxFullScrn, cyFullScrn ; ! 64: SIZEL sizl ; ! 65: ! 66: switch (msg) ! 67: { ! 68: case WM_CREATE: ! 69: cxFullScrn = WinQuerySysValue (HWND_DESKTOP, SV_CXFULLSCREEN) ; ! 70: cyFullScrn = WinQuerySysValue (HWND_DESKTOP, SV_CYFULLSCREEN) ; ! 71: ! 72: /*------------------------- ! 73: Create Memory DC and PS ! 74: -------------------------*/ ! 75: ! 76: hdcMemory = DevOpenDC (hab, OD_MEMORY, "*", 0L, NULL, NULL) ; ! 77: ! 78: sizl.cx = 0 ; ! 79: sizl.cy = 0 ; ! 80: hpsMemory = GpiCreatePS (hab, hdcMemory, &sizl, ! 81: PU_PELS | GPIF_DEFAULT | ! 82: GPIT_MICRO | GPIA_ASSOC) ; ! 83: ! 84: /*---------------------------------------------- ! 85: Create monochrome bitmap, return 1 if cannot ! 86: ----------------------------------------------*/ ! 87: ! 88: bmp.cbFix = sizeof bmp ; ! 89: bmp.cx = (SHORT) cxFullScrn ; ! 90: bmp.cy = (SHORT) cyFullScrn ; ! 91: bmp.cPlanes = 1 ; ! 92: bmp.cBitCount = 1 ; ! 93: hbm = GpiCreateBitmap (hpsMemory, &bmp, 0L, 0L, NULL) ; ! 94: ! 95: if (hbm == NULL) ! 96: { ! 97: GpiDestroyPS (hpsMemory) ; ! 98: DevCloseDC (hdcMemory) ; ! 99: return 1 ; ! 100: } ! 101: ! 102: /*-------------------------------------- ! 103: Set bitmap in memory PS and clear it ! 104: --------------------------------------*/ ! 105: ! 106: GpiSetBitmap (hpsMemory, hbm) ; ! 107: ! 108: aptl[1].x = cxFullScrn ; ! 109: aptl[1].y = cyFullScrn ; ! 110: GpiBitBlt (hpsMemory, NULL, 2L, aptl, ROP_ZERO, BBO_OR) ; ! 111: return 0 ; ! 112: ! 113: case WM_BUTTON1DOWN: ! 114: if (!fButton2Down) ! 115: WinSetCapture (HWND_DESKTOP, hwnd) ; ! 116: ! 117: ptlPointerPos.x = MOUSEMSG(&msg)->x ; ! 118: ptlPointerPos.y = MOUSEMSG(&msg)->y ; ! 119: ! 120: fButton1Down = TRUE ; ! 121: break ; // do default processing ! 122: ! 123: case WM_BUTTON1UP: ! 124: if (!fButton2Down) ! 125: WinSetCapture (HWND_DESKTOP, NULL) ; ! 126: ! 127: fButton1Down = FALSE ; ! 128: return 0 ; ! 129: ! 130: case WM_BUTTON2DOWN: ! 131: if (!fButton1Down) ! 132: WinSetCapture (HWND_DESKTOP, hwnd) ; ! 133: ! 134: ptlPointerPos.x = MOUSEMSG(&msg)->x ; ! 135: ptlPointerPos.y = MOUSEMSG(&msg)->y ; ! 136: ! 137: fButton2Down = TRUE ; ! 138: break ; // do default processing ! 139: ! 140: case WM_BUTTON2UP: ! 141: if (!fButton1Down) ! 142: WinSetCapture (HWND_DESKTOP, NULL) ; ! 143: ! 144: fButton2Down = FALSE ; ! 145: return 0 ; ! 146: ! 147: case WM_MOUSEMOVE: ! 148: if (!fButton1Down && !fButton2Down) ! 149: break ; ! 150: ! 151: hpsWindow = WinGetPS (hwnd) ; ! 152: ! 153: GpiSetColor (hpsMemory, fButton1Down ? CLR_TRUE : CLR_FALSE) ; ! 154: GpiSetColor (hpsWindow, ! 155: fButton1Down ? CLR_NEUTRAL : CLR_BACKGROUND) ; ! 156: ! 157: GpiMove (hpsMemory, &ptlPointerPos) ; ! 158: GpiMove (hpsWindow, &ptlPointerPos) ; ! 159: ! 160: ptlPointerPos.x = MOUSEMSG(&msg)->x ; ! 161: ptlPointerPos.y = MOUSEMSG(&msg)->y ; ! 162: ! 163: GpiLine (hpsMemory, &ptlPointerPos) ; ! 164: GpiLine (hpsWindow, &ptlPointerPos) ; ! 165: ! 166: WinReleasePS (hpsWindow) ; ! 167: break ; // do default processing ! 168: ! 169: case WM_PAINT: ! 170: hpsWindow = WinBeginPaint (hwnd, NULL, (PRECTL) aptl) ; ! 171: ! 172: aptl[2] = aptl[0] ; ! 173: ! 174: GpiBitBlt (hpsWindow, hpsMemory, 3L, aptl, ROP_SRCCOPY, ! 175: BBO_OR) ; ! 176: ! 177: WinEndPaint (hpsWindow) ; ! 178: return 0 ; ! 179: ! 180: case WM_DESTROY: ! 181: GpiDestroyPS (hpsMemory) ; ! 182: DevCloseDC (hdcMemory) ; ! 183: GpiDeleteBitmap (hbm) ; ! 184: return 0 ; ! 185: } ! 186: return WinDefWindowProc (hwnd, msg, mp1, mp2) ; ! 187: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.