|
|
1.1 root 1: /****************************************************************************
2:
3: PROGRAM: Select.c
4:
5: PURPOSE: Contains library routines for selecting a region
6:
7: FUNCTIONS:
8:
9: StartSelection(HWND, POINT, LPRECT, int) - begin selection area
10: UpdateSelection(HWND, POINT, LPRECT, int) - update selection area
11: EndSelection(POINT, LPRECT) - end selection area
12: ClearSelection(HWND, LPRECT, int) - clear selection area
13:
14: *******************************************************************************/
15:
16: #include "windows.h"
17: #include "select.h"
18:
19: /****************************************************************************
20: FUNCTION: LibMain(HANDLE, DWORD, LPVOID)
21:
22: PURPOSE: LibMain is called by Windows when
23: the DLL is initialized, Thread Attached, and other times.
24: Refer to SDK documentation, as to the different ways this
25: may be called.
26:
27: The LibMain function should perform additional initialization
28: tasks required by the DLL. In this example, no initialization
29: tasks are required. LibMain should return a value of 1 if
30: the initialization is successful.
31:
32: *******************************************************************************/
33: INT APIENTRY LibMain(HANDLE hInst, DWORD ul_reason_being_called, LPVOID lpReserved)
34: {
35: return 1;
36: UNREFERENCED_PARAMETER(hInst);
37: UNREFERENCED_PARAMETER(ul_reason_being_called);
38: UNREFERENCED_PARAMETER(lpReserved);
39: }
40:
41:
42: /****************************************************************************
43:
44: FUNCTION: StartSelection(HWND, POINT, LPRECT, int)
45:
46: PURPOSE: Begin selection of region
47:
48: ****************************************************************************/
49:
50: INT APIENTRY StartSelection(
51: HWND hWnd,
52: MPOINT ptCurrent,
53: LPRECT lpSelectRect,
54: INT fFlags)
55: {
56: if (lpSelectRect->left != lpSelectRect->right ||
57: lpSelectRect->top != lpSelectRect->bottom)
58: ClearSelection(hWnd, lpSelectRect, fFlags);
59:
60: lpSelectRect->right = ptCurrent.x;
61: lpSelectRect->bottom = ptCurrent.y;
62:
63: /* If you are extending the box, then invert the current rectangle */
64:
65: if ((fFlags & SL_SPECIAL) == SL_EXTEND)
66: ClearSelection(hWnd, lpSelectRect, fFlags);
67:
68: /* Otherwise, set origin to current location */
69:
70: else {
71: lpSelectRect->left = ptCurrent.x;
72: lpSelectRect->top = ptCurrent.y;
73: }
74: SetCapture(hWnd);
75: return 1;
76: }
77:
78: /****************************************************************************
79:
80: FUNCTION: UpdateSelection(HWND, POINT, LPRECT, int) - update selection area
81:
82: PURPOSE: Update selection
83:
84: ****************************************************************************/
85:
86: INT APIENTRY UpdateSelection(
87: HWND hWnd,
88: MPOINT ptCurrent,
89: LPRECT lpSelectRect,
90: INT fFlags)
91: {
92: HDC hDC;
93: SHORT OldROP;
94:
95: hDC = GetDC(hWnd);
96:
97: switch (fFlags & SL_TYPE) {
98:
99: case SL_BOX:
100: OldROP = (SHORT)SetROP2(hDC, R2_NOTXORPEN);
101: MoveToEx(hDC, lpSelectRect->left, lpSelectRect->top, NULL);
102: LineTo(hDC, lpSelectRect->right, lpSelectRect->top);
103: LineTo(hDC, lpSelectRect->right, lpSelectRect->bottom);
104: LineTo(hDC, lpSelectRect->left, lpSelectRect->bottom);
105: LineTo(hDC, lpSelectRect->left, lpSelectRect->top);
106: LineTo(hDC, ptCurrent.x, lpSelectRect->top);
107: LineTo(hDC, ptCurrent.x, ptCurrent.y);
108: LineTo(hDC, lpSelectRect->left, ptCurrent.y);
109: LineTo(hDC, lpSelectRect->left, lpSelectRect->top);
110: SetROP2(hDC, OldROP);
111: break;
112:
113: case SL_BLOCK:
114: PatBlt(hDC,
115: lpSelectRect->left,
116: lpSelectRect->bottom,
117: lpSelectRect->right - lpSelectRect->left,
118: ptCurrent.y - lpSelectRect->bottom,
119: DSTINVERT);
120: PatBlt(hDC,
121: lpSelectRect->right,
122: lpSelectRect->top,
123: ptCurrent.x - lpSelectRect->right,
124: ptCurrent.y - lpSelectRect->top,
125: DSTINVERT);
126: break;
127: }
128: lpSelectRect->right = ptCurrent.x;
129: lpSelectRect->bottom = ptCurrent.y;
130: ReleaseDC(hWnd, hDC);
131: return 1;
132: }
133:
134: /****************************************************************************
135:
136: FUNCTION: EndSelection(POINT, LPRECT)
137:
138: PURPOSE: End selection of region, release capture of mouse movement
139:
140: ****************************************************************************/
141:
142: INT APIENTRY EndSelection(
143: MPOINT ptCurrent,
144: LPRECT lpSelectRect)
145: {
146: lpSelectRect->right = ptCurrent.x;
147: lpSelectRect->bottom = ptCurrent.y;
148: ReleaseCapture();
149: return 1;
150: }
151:
152: /****************************************************************************
153:
154: FUNCTION: ClearSelection(HWND, LPRECT, int) - clear selection area
155:
156: PURPOSE: Clear the current selection
157:
158: ****************************************************************************/
159:
160: INT APIENTRY ClearSelection(
161: HWND hWnd,
162: LPRECT lpSelectRect,
163: INT fFlags)
164: {
165: HDC hDC;
166: INT2DWORD OldROP;
167:
168: hDC = GetDC(hWnd);
169: switch (fFlags & SL_TYPE) {
170:
171: case SL_BOX:
172: OldROP = SetROP2(hDC, R2_NOTXORPEN);
173: MoveToEx(hDC, lpSelectRect->left, lpSelectRect->top, NULL);
174: LineTo(hDC, lpSelectRect->right, lpSelectRect->top);
175: LineTo(hDC, lpSelectRect->right, lpSelectRect->bottom);
176: LineTo(hDC, lpSelectRect->left, lpSelectRect->bottom);
177: LineTo(hDC, lpSelectRect->left, lpSelectRect->top);
178: SetROP2(hDC, OldROP);
179: break;
180:
181: case SL_BLOCK:
182: PatBlt(hDC,
183: lpSelectRect->left,
184: lpSelectRect->top,
185: lpSelectRect->right - lpSelectRect->left,
186: lpSelectRect->bottom - lpSelectRect->top,
187: DSTINVERT);
188: break;
189: }
190: ReleaseDC(hWnd, hDC);
191: return 1;
192: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.