|
|
1.1 root 1: /*---------------------------------------------------
2: BLOKOUT2.C -- Mouse Button & Capture Demo 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: int main (void)
12: {
13: static CHAR szClientClass [] = "BlokOut2" ;
14: static ULONG flFrameFlags = FCF_TITLEBAR | FCF_SYSMENU |
15: FCF_SIZEBORDER | FCF_MINMAX |
16: FCF_SHELLPOSITION | FCF_TASKLIST ;
17: HAB hab ;
18: HMQ hmq ;
19: HWND hwndFrame, hwndClient ;
20: QMSG qmsg ;
21:
22: hab = WinInitialize (0) ;
23: hmq = WinCreateMsgQueue (hab, 0) ;
24:
25: WinRegisterClass (hab, szClientClass, ClientWndProc, CS_SIZEREDRAW, 0) ;
26:
27: hwndFrame = WinCreateStdWindow (HWND_DESKTOP, WS_VISIBLE,
28: &flFrameFlags, szClientClass, NULL,
29: 0L, NULL, 0, &hwndClient) ;
30:
31: WinSendMsg (hwndFrame, WM_SETICON,
32: WinQuerySysPointer (HWND_DESKTOP, SPTR_APPICON, FALSE),
33: NULL) ;
34:
35: while (WinGetMsg (hab, &qmsg, NULL, 0, 0))
36: WinDispatchMsg (hab, &qmsg) ;
37:
38: WinDestroyWindow (hwndFrame) ;
39: WinDestroyMsgQueue (hmq) ;
40: WinTerminate (hab) ;
41: return 0 ;
42: }
43:
44: VOID DrawBoxOutline (HWND hwnd, POINTL *pptlStart, POINTL *pptlEnd)
45: {
46: HPS hps ;
47:
48: hps = WinGetPS (hwnd) ;
49: GpiSetMix (hps, FM_INVERT) ;
50:
51: GpiMove (hps, pptlStart) ;
52: GpiBox (hps, DRO_OUTLINE, pptlEnd, 0L, 0L) ;
53:
54: WinReleasePS (hps) ;
55: }
56:
57: MRESULT EXPENTRY ClientWndProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
58: {
59: static BOOL fCapture, fValidBox ;
60: static POINTL ptlStart, ptlEnd, ptlBoxStart, ptlBoxEnd ;
61: HPS hps ;
62:
63: switch (msg)
64: {
65: case WM_BUTTON1DOWN:
66: ptlStart.x = ptlEnd.x = MOUSEMSG(&msg)->x ;
67: ptlStart.y = ptlEnd.y = MOUSEMSG(&msg)->y ;
68:
69: DrawBoxOutline (hwnd, &ptlStart, &ptlEnd) ;
70:
71: WinSetCapture (HWND_DESKTOP, hwnd) ;
72: fCapture = TRUE ;
73: break ; // do default processing
74:
75: case WM_MOUSEMOVE:
76: if (fCapture)
77: {
78: DrawBoxOutline (hwnd, &ptlStart, &ptlEnd) ;
79:
80: ptlEnd.x = MOUSEMSG(&msg)->x ;
81: ptlEnd.y = MOUSEMSG(&msg)->y ;
82:
83: DrawBoxOutline (hwnd, &ptlStart, &ptlEnd) ;
84: }
85: break ; // do default processing
86:
87: case WM_BUTTON1UP:
88: if (fCapture)
89: {
90: DrawBoxOutline (hwnd, &ptlStart, &ptlEnd) ;
91:
92: ptlBoxStart = ptlStart ;
93: ptlBoxEnd.x = MOUSEMSG(&msg)->x ;
94: ptlBoxEnd.y = MOUSEMSG(&msg)->y ;
95:
96: WinSetCapture (HWND_DESKTOP, NULL) ;
97: fCapture = FALSE ;
98: fValidBox = TRUE ;
99: WinInvalidateRect (hwnd, NULL, FALSE) ;
100: }
101: return 0 ;
102:
103: case WM_CHAR:
104: if (fCapture && CHARMSG(&msg)->fs & KC_VIRTUALKEY &&
105: !(CHARMSG(&msg)->fs & KC_KEYUP) &&
106: CHARMSG(&msg)->vkey == VK_ESC)
107: {
108: DrawBoxOutline (hwnd, &ptlStart, &ptlEnd) ;
109:
110: WinSetCapture (HWND_DESKTOP, NULL) ;
111: fCapture = FALSE ;
112: }
113: return 0 ;
114:
115: case WM_PAINT:
116: hps = WinBeginPaint (hwnd, NULL, NULL) ;
117: GpiErase (hps) ;
118:
119: if (fValidBox)
120: {
121: GpiMove (hps, &ptlBoxStart) ;
122: GpiBox (hps, DRO_OUTLINEFILL, &ptlBoxEnd, 0L, 0L) ;
123: }
124: if (fCapture)
125: {
126: GpiSetMix (hps, FM_INVERT) ;
127: GpiMove (hps, &ptlStart) ;
128: GpiBox (hps, DRO_OUTLINE, &ptlEnd, 0L, 0L) ;
129: }
130: WinEndPaint (hps) ;
131: return 0 ;
132: }
133: return WinDefWindowProc (hwnd, msg, mp1, mp2) ;
134: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.