|
|
1.1 root 1: /**************************************************************************\
2: * angle.c -- sample program demonstrating the new AngleArc() API.
3: *
4: * written Jan 92 by Steve Firebaugh
5: *
6: * design: There is one main window with one dialog box stretched to fill
7: * the top of it. The parameters for the AngleArc painted into the main
8: * window are stored in the entry fields of this dialog box. The user
9: * may change these values and see the effect on the arc. Invalid values
10: * will prevent the arc from being drawn.
11: \**************************************************************************/
12:
13:
14: #include <windows.h>
15: #include <math.h>
16: #include <string.h>
17: #include "angle.h"
18:
19: HANDLE hInst;
20: HWND hwndMain, hwndDlg;
21:
22:
23: /**************************************************************************\
24: *
25: * function: WinMain()
26: *
27: * input parameters: c.f. generic sample
28: *
29: \**************************************************************************/
30: int APIENTRY WinMain(HANDLE hInstance, HANDLE hPrevInstance,
31: LPSTR lpCmdLine, int nCmdShow)
32: {
33: MSG msg;
34: RECT rect;
35:
36: UNREFERENCED_PARAMETER( lpCmdLine );
37:
38:
39: /* Check for previous instance. If none, then register class. */
40: if (!hPrevInstance) {
41: WNDCLASS wc;
42:
43: wc.style = NULL;
44: wc.lpfnWndProc = (WNDPROC)MainWndProc;
45:
46: wc.cbClsExtra = 0;
47: wc.cbWndExtra = 0;
48: wc.hInstance = hInstance;
49: wc.hIcon = LoadIcon(hInstance, "AngleIcon");
50: wc.hCursor = LoadCursor(NULL, IDC_ARROW);
51: wc.hbrBackground = GetStockObject(LTGRAY_BRUSH);
52: wc.lpszMenuName = NULL;
53: wc.lpszClassName = "angle";
54:
55: if (!RegisterClass(&wc)) return (FALSE);
56: } /* class registered o.k. */
57:
58:
59: /* Create the main window. Return false if CreateWindow() fails */
60: hInst = hInstance;
61:
62: hwndMain = CreateWindow(
63: "angle",
64: "AngleArc",
65: WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
66: CW_USEDEFAULT,
67: CW_USEDEFAULT,
68: CW_USEDEFAULT,
69: CW_USEDEFAULT,
70: NULL,
71: NULL,
72: hInstance,
73: NULL);
74:
75: if (!hwndMain) return (FALSE);
76: ShowWindow(hwndMain, nCmdShow);
77: UpdateWindow(hwndMain);
78:
79:
80: /* create the top dialog as a child of the main window. */
1.1.1.2 ! root 81: hwndDlg = CreateDialog (hInst, "AngleDlg", hwndMain, (DLGPROC) DlgProc);
1.1 root 82:
83: /* Send main window a WM_SIZE message so that it will size the top
84: * dialog correctly. Also, force a repaint of the main window
85: * now that the dialog is there and we can draw the arc.
86: */
87: GetClientRect (hwndMain, &rect);
88: SendMessage (hwndMain, WM_SIZE, 0, (rect.right - rect.left));
89: ShowWindow (hwndDlg, SW_SHOW);
90: InvalidateRect (hwndMain, NULL, FALSE);
91:
92: /* Loop getting messages and dispatching them. */
93: while (GetMessage(&msg,NULL, NULL, NULL)) {
94: if (!IsDialogMessage (hwndDlg, &msg)){
95: TranslateMessage(&msg);
96: DispatchMessage(&msg);
97: }
98: }
99:
100: return (msg.wParam);
101: }
102:
103:
104:
105: /**************************************************************************\
106: *
107: * function: MainWndProc()
108: *
109: * input parameters: normal window procedure parameters.
110: *
111: * global variables:
112: * hwndDlg - dialog with entry fields containing arc parameters.
113: *
114: \**************************************************************************/
115: LONG APIENTRY MainWndProc(HWND hwnd, UINT message, UINT wParam, LONG lParam)
116: {
117: char buffer[MAXCHARS];
118: static HANDLE hPenGrid, hPenArc;
119:
120: switch (message) {
121:
122: /**********************************************************************\
123: * WM_CREATE
124: *
125: * Then create three pens for drawing with later.
126: \**********************************************************************/
127: case WM_CREATE:
128: hPenGrid = CreatePen (PS_SOLID, 1, GRIDCOLOR);
129: hPenArc = CreatePen (PS_SOLID, 2, (COLORREF) 0x01000005);
130: break;
131:
132:
133: /**********************************************************************\
134: * WM_DESTROY
135: *
136: * Complement of the WM_CREATE message. Delete the pens that were
137: * created and then call postquitmessage.
138: \**********************************************************************/
139: case WM_DESTROY:
140: DeleteObject (hPenGrid);
141: DeleteObject (hPenArc);
142:
143: PostQuitMessage(0);
144: break;
145:
146:
147: /**********************************************************************\
148: * WM_SIZE
149: *
150: * Stretch the top dialog to fill the width of the main window.
151: \**********************************************************************/
152: case WM_SIZE:
153: SetWindowPos (hwndDlg, NULL, 0,0, LOWORD(lParam), DIALOGHEIGHT, NULL);
154: break;
155:
156:
157:
158: /**********************************************************************\
159: * WM_PAINT
160: *
161: * First shift the viewport origin down so that 0,0 is the top left
162: * most visible point (out from underneath the top dialog). Second,
163: * draw the grid with wider lines on the axes. Finally, read the
164: * values out of the top dialog, do elementary validation, and then
165: * try to call AngleArc() with the values. If a value fails validation,
166: * then write a small error message, and don't draw the arc.
167: \**********************************************************************/
168: case WM_PAINT: {
169: HDC hdc;
170: PAINTSTRUCT ps;
171: RECT rect;
172: int i;
173: int x,y,radius;
174: float start, sweep;
175: BOOL success;
176:
177: hdc = BeginPaint(hwnd, &ps);
178:
179: SetViewportOrgEx (hdc, 0, DIALOGHEIGHT, NULL);
180:
181: GetClientRect (hwndMain, &rect);
182:
183: SelectObject(hdc, hPenGrid);
184: /* Draw vertical lines. */
185: for (i = 0; i<= rect.right; i+=TICKSPACE){
186: MoveToEx (hdc, i, rect.top, NULL);
187: LineTo (hdc, i, rect.bottom);
188: }
189: MoveToEx (hdc, 1, 0, NULL);
190: LineTo (hdc, 1, rect.bottom);
191:
192: /* Draw horizontal lines. */
193: for (i = 0; i<= rect.bottom; i+=TICKSPACE){
194: MoveToEx (hdc, rect.left,i, NULL);
195: LineTo (hdc, rect.right,i);
196: }
197: MoveToEx (hdc, 0, 1, NULL);
198: LineTo (hdc, rect.right,1);
199:
200: /* new color pen for the actual arc. */
201: SelectObject(hdc, hPenArc);
202:
203:
204: /* Query the top dialog parameters,
205: * if a value is bad, report that and break out of conditional.
206: * if all values are good, then set the current point and call
207: * AngleArc().
208: */
209: if (IsWindow(hwndDlg)) {
210: x = GetDlgItemInt(hwndDlg, DID_X, &success, TRUE);
211: if (!success) {
212: TextOut (hdc, 10, rect.bottom-2*DIALOGHEIGHT, "Bad X", 5);
213: break;
214: }
215: y = GetDlgItemInt(hwndDlg, DID_Y, &success, TRUE);
216: if (!success) {
217: TextOut (hdc, 30, rect.bottom-2*DIALOGHEIGHT, "Bad Y", 5);
218: break;
219: }
220:
221: radius = GetDlgItemInt(hwndDlg, DID_RADIUS, &success, TRUE);
222: if (!success) {
223: TextOut (hdc, 50, rect.bottom-2*DIALOGHEIGHT, "Bad Radius", 10);
224: break;
225: }
226:
227: /* Hard to validate these floating point numbers. Good chance
228: * that invalid values will just map to 0.0
229: */
230: if (!GetDlgItemText(hwndDlg, DID_START, buffer, MAXCHARS)) {
231: TextOut (hdc, 70, rect.bottom-2*DIALOGHEIGHT, "Bad Start", 9);
232: break;
233: }
234: start = (float)atof (buffer);
235:
236: if (!GetDlgItemText(hwndDlg, DID_SWEEP, buffer, MAXCHARS)) {
237: TextOut (hdc, 90, rect.bottom-2*DIALOGHEIGHT, "Bad Sweep", 9);
238: break;
239: }
240: sweep = (float)atof (buffer);
241:
242: MoveToEx (hdc, x, y, NULL);
243:
244: /**********************************************************/
245: /**********************************************************/
246: AngleArc (hdc, x, y, (DWORD) radius, start, sweep);
247: /**********************************************************/
248: /**********************************************************/
249: }
250:
251: EndPaint (hwnd, &ps);
252:
253: } return FALSE;
254:
255:
256: default:
257: return (DefWindowProc(hwnd, message, wParam, lParam));
258: }
259: return (NULL);
260: }
261:
262:
263:
264:
265: /**************************************************************************\
266: *
267: * function: DlgProc()
268: *
269: * input parameters: normal window procedure parameters.
270: *
271: * global variables:
272: * hwndmain - the main window. also the parent of this dialog
273: *
274: \**************************************************************************/
275: LONG APIENTRY DlgProc(HWND hwnd, UINT message, UINT wParam, LONG lParam)
276: {
277: UNREFERENCED_PARAMETER(lParam);
278:
279: switch (message) {
280: /**********************************************************************\
281: * WM_INITDIALOG
282: *
283: * Fill the entry fields with sensible original values.
284: \**********************************************************************/
285: case WM_INITDIALOG:
286: SetDlgItemText(hwnd, DID_X , "100");
287: SetDlgItemText(hwnd, DID_Y , "100");
288: SetDlgItemText(hwnd, DID_RADIUS, "50");
289: SetDlgItemText(hwnd, DID_START , "0.0");
290: SetDlgItemText(hwnd, DID_SWEEP , "270.0");
291: return TRUE;
292:
293:
294:
295: /**********************************************************************\
296: * WM_COMMAND, DID_DRAW
297: *
298: * Invalidate the main window so that we force a repaint.
299: \**********************************************************************/
300: case WM_COMMAND:
301: if (LOWORD(wParam) == DID_DRAW) {
302: InvalidateRect (hwndMain, NULL, TRUE);
303: }
304: return FALSE;
305:
306:
307: } /* end switch */
308: return (NULL);
309: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.