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