|
|
1.1 root 1: /****************************************************************************
2:
3: PROGRAM: Input.c
4:
5: PURPOSE: Input template for Windows applications
6:
7: FUNCTIONS:
8:
9: WinMain() - calls initialization function, processes message loop
10: InitApplication() - initializes window data and registers window
11: InitInstance() - saves instance handle and creates main window
12: MainWndProc() - processes messages
13: About() - processes messages for "About" dialog box
14:
15: ****************************************************************************/
16:
17: #include "windows.h"
18: #include <string.h>
19: #include "input.h"
20:
21: HANDLE hInst;
22:
23: CHAR MouseText[48]; /* mouse state */
24: CHAR ButtonText[48]; /* mouse-button state */
25: CHAR KeyboardText[48]; /* keyboard state */
26: CHAR CharacterText[48]; /* latest character */
27: CHAR ScrollText[48]; /* scroll status */
28: CHAR TimerText[48]; /* timer state */
29: RECT rectMouse;
30: RECT rectButton;
31: RECT rectKeyboard;
32: RECT rectCharacter;
33: RECT rectScroll;
34: RECT rectTimer;
35: INT idTimer; /* timer ID */
36: INT nTimerCount = 0; /* current timer count */
37:
38:
39: #define GET_WM_HSCROLL_CODE(wp, lp) LOWORD(wp)
40: #define GET_WM_HSCROLL_POS(wp, lp) HIWORD(wp)
41: #define GET_WM_HSCROLL_HWND(wp, lp) (HWND)(lp)
42:
43:
44: /****************************************************************************
45:
46: FUNCTION: WinMain(HANDLE, HANDLE, LPSTR, int)
47:
48: PURPOSE: calls initialization function, processes message loop
49:
50: ****************************************************************************/
51:
52: int APIENTRY WinMain(
53: HANDLE hInstance,
54: HANDLE hPrevInstance,
55: LPSTR lpCmdLine,
56: int nCmdShow
57: )
58: {
59: MSG msg;
60:
61: UNREFERENCED_PARAMETER( lpCmdLine );
62:
63: if (!hPrevInstance)
64: if (!InitApplication(hInstance))
65: return (FALSE);
66:
67: if (!InitInstance(hInstance, nCmdShow))
68: return (FALSE);
69:
70: while (GetMessage(&msg, NULL, NULL, NULL)) {
71: TranslateMessage(&msg);
72: DispatchMessage(&msg);
73: }
74: return (msg.wParam);
75: }
76:
77:
78: /****************************************************************************
79:
80: FUNCTION: InitApplication(HANDLE)
81:
82: PURPOSE: Initializes window data and registers window class
83:
84: ****************************************************************************/
85:
86: BOOL InitApplication(HANDLE hInstance)
87: {
88: WNDCLASS wc;
89:
90: wc.style = CS_DBLCLKS; /* double-click messages */
91: wc.lpfnWndProc = (WNDPROC) MainWndProc;
92: wc.cbClsExtra = 0;
93: wc.cbWndExtra = 0;
94: wc.hInstance = hInstance;
95: wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
96: wc.hCursor = LoadCursor(NULL, IDC_ARROW);
97: wc.hbrBackground = GetStockObject(WHITE_BRUSH);
98: wc.lpszMenuName = "InputMenu";
99: wc.lpszClassName = "InputWClass";
100:
101: return (RegisterClass(&wc));
102: }
103:
104:
105: /****************************************************************************
106:
107: FUNCTION: InitInstance(HANDLE, int)
108:
109: PURPOSE: Saves instance handle and creates main window
110:
111: ****************************************************************************/
112:
113: BOOL InitInstance(
114: HANDLE hInstance,
115: INT nCmdShow)
116: {
117: HWND hWnd;
118: HDC hDC;
119: TEXTMETRIC textmetric;
120: RECT rect;
121: INT nLineHeight;
122:
123:
124: hInst = hInstance;
125:
126: hWnd = CreateWindow(
127: "InputWClass",
128: "Input Sample Application",
129: WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL, /* horz & vert scroll bars */
130: CW_USEDEFAULT,
131: CW_USEDEFAULT,
132: CW_USEDEFAULT,
133: CW_USEDEFAULT,
134: NULL,
135: NULL,
136: hInstance,
137: NULL
138: );
139:
140: if (!hWnd)
141: return (FALSE);
142:
143:
144: hDC = GetDC(hWnd);
145: GetTextMetrics(hDC, &textmetric);
146: nLineHeight = textmetric.tmExternalLeading + textmetric.tmHeight;
147:
148: rect.left = GetDeviceCaps(hDC, LOGPIXELSX) / 4; /* 1/4 inch */
149: rect.right = GetDeviceCaps(hDC, HORZRES);
150: rect.top = GetDeviceCaps(hDC, LOGPIXELSY) / 4; /* 1/4 inch */
151: ReleaseDC(hWnd, hDC);
152: rect.bottom = rect.top + nLineHeight;
153: rectMouse = rect;
154:
155: rect.top += nLineHeight;
156: rect.bottom += nLineHeight;
157: rectButton = rect;
158:
159: rect.top += nLineHeight;
160: rect.bottom += nLineHeight;
161: rectKeyboard = rect;
162:
163: rect.top += nLineHeight;
164: rect.bottom += nLineHeight;
165: rectCharacter = rect;
166:
167: rect.top += nLineHeight;
168: rect.bottom += nLineHeight;
169: rectScroll = rect;
170:
171: rect.top += nLineHeight;
172: rect.bottom += nLineHeight;
173: rectTimer = rect;
174:
175: ShowWindow(hWnd, nCmdShow);
176: UpdateWindow(hWnd);
177: return (TRUE);
178:
179: }
180:
181: /****************************************************************************
182:
183: FUNCTION: MainWndProc(HWND, unsigned, WORD, LONG)
184:
185: PURPOSE: Processes messages
186:
187: MESSAGES:
188:
189: WM_COMMAND - application menu (About dialog box)
190: WM_CREATE - create window
191: WM_MOUSEMOVE - mouse movement
192: WM_LBUTTONDOWN - left mouse button pressed
193: WM_LBUTTONUP - left mouse button released
194: WM_LBUTTONDBLCLK - left mouse button double clicked
195: WM_KEYDOWN - key pressed
196: WM_KEYUP - key released
197: WM_CHAR - ASCII character received
198: WM_TIMER - timer has elapsed
199: WM_HSCROLL - mouse click in horizontal scroll bar
200: WM_VSCROLL - mouse click in vertical scroll bar
201: WM_PAINT - update window, draw objects
202: WM_DESTROY - destroy window
203:
204: COMMENTS:
205:
206: This demonstrates how input messages are received, and what the
207: additional information is that comes with the message.
208:
209: ****************************************************************************/
210:
211: LONG APIENTRY MainWndProc(
212: HWND hWnd,
213: UINT message,
214: UINT wParam,
215: LONG lParam)
216: {
217: FARPROC lpProcAbout;
218:
219: HDC hDC; /* display-context variable */
220: PAINTSTRUCT ps; /* paint structure */
221: CHAR HorzOrVertText[12];
222: CHAR ScrollTypeText[20];
223: RECT rect;
224:
225: switch (message) {
226: case WM_COMMAND:
227: if (LOWORD(wParam) == IDM_ABOUT) {
228: lpProcAbout = MakeProcInstance((FARPROC)About, hInst);
229:
230: DialogBox(hInst,
231: "AboutBox",
232: hWnd,
233: (WNDPROC)lpProcAbout);
234:
235: FreeProcInstance(lpProcAbout);
236: break;
237: }
238: else
239: return (DefWindowProc(hWnd, message, wParam, lParam));
240:
241: case WM_CREATE:
242:
243: /* Set the timer for five-second intervals */
244:
245: idTimer = SetTimer(hWnd, NULL, 5000, (WNDPROC)(LPVOID)NULL);
246:
247: break;
248:
249: case WM_MOUSEMOVE:
250: wsprintf(MouseText, "WM_MOUSEMOVE: %x, %d, %d",
251: wParam, LOWORD(lParam), HIWORD(lParam));
252: InvalidateRect(hWnd, &rectMouse, TRUE);
253: break;
254:
255: case WM_LBUTTONDOWN:
256: wsprintf(ButtonText, "WM_LBUTTONDOWN: %x, %d, %d",
257: wParam, LOWORD(lParam), HIWORD(lParam));
258: InvalidateRect(hWnd, &rectButton, TRUE);
259: break;
260:
261: case WM_LBUTTONUP:
262: wsprintf(ButtonText, "WM_LBUTTONUP: %x, %d, %d",
263: wParam, LOWORD(lParam), HIWORD(lParam));
264: InvalidateRect(hWnd, &rectButton, TRUE);
265: break;
266:
267: case WM_LBUTTONDBLCLK:
268: wsprintf(ButtonText, "WM_LBUTTONDBLCLK: %x, %d, %d",
269: wParam, LOWORD(lParam), HIWORD(lParam));
270: InvalidateRect(hWnd, &rectButton, TRUE);
271: break;
272:
273: case WM_RBUTTONDOWN:
274: wsprintf(ButtonText, "WM_RBUTTONDOWN: %x, %d, %d",
275: wParam, LOWORD(lParam), HIWORD(lParam));
276: InvalidateRect(hWnd, &rectButton, TRUE);
277: break;
278:
279: case WM_RBUTTONUP:
280: wsprintf(ButtonText, "WM_RBUTTONUP: %x, %d, %d",
281: wParam, LOWORD(lParam), HIWORD(lParam));
282: InvalidateRect(hWnd, &rectButton, TRUE);
283: break;
284:
285: case WM_RBUTTONDBLCLK:
286: wsprintf(ButtonText, "WM_RBUTTONDBLCLK: %x, %d, %d",
287: wParam, LOWORD(lParam), HIWORD(lParam));
288: InvalidateRect(hWnd, &rectButton, TRUE);
289: break;
290:
291: case WM_KEYDOWN:
292: wsprintf(KeyboardText, "WM_KEYDOWN: %x, %x, %x",
293: wParam, LOWORD(lParam), HIWORD(lParam));
294: InvalidateRect(hWnd, &rectKeyboard, TRUE);
295: break;
296:
297: case WM_KEYUP:
298: wsprintf(KeyboardText, "WM_KEYUP: %x, %x, %x",
299: wParam, LOWORD(lParam), HIWORD(lParam));
300: InvalidateRect(hWnd, &rectKeyboard, TRUE);
301: break;
302:
303: case WM_CHAR:
304: wsprintf(CharacterText, "WM_CHAR: %c, %x, %x",
305: wParam, LOWORD(lParam), HIWORD(lParam));
306: InvalidateRect(hWnd, &rectCharacter, TRUE);
307: break;
308:
309: case WM_TIMER:
310: wsprintf(TimerText, "WM_TIMER: %d seconds",
311: nTimerCount += 5);
312: InvalidateRect(hWnd, &rectTimer, TRUE);
313: break;
314:
315: case WM_HSCROLL:
316: case WM_VSCROLL:
317: strcpy(HorzOrVertText,
318: (message == WM_HSCROLL) ? "WM_HSCROLL" : "WM_VSCROLL");
319: strcpy(ScrollTypeText,
320: (GET_WM_HSCROLL_CODE(wParam, lParam) == SB_LINEUP) ? "SB_LINEUP" :
321: (GET_WM_HSCROLL_CODE(wParam, lParam) == SB_LINEDOWN) ? "SB_LINEDOWN" :
322: (GET_WM_HSCROLL_CODE(wParam, lParam) == SB_PAGEUP) ? "SB_PAGEUP" :
323: (GET_WM_HSCROLL_CODE(wParam, lParam) == SB_PAGEDOWN) ? "SB_PAGEDOWN" :
324: (GET_WM_HSCROLL_CODE(wParam, lParam) == SB_THUMBPOSITION) ? "SB_THUMBPOSITION" :
325: (GET_WM_HSCROLL_CODE(wParam, lParam) == SB_THUMBTRACK) ? "SB_THUMBTRACK" :
326: (GET_WM_HSCROLL_CODE(wParam, lParam) == SB_ENDSCROLL) ? "SB_ENDSCROLL" : "unknown");
327: wsprintf(ScrollText, "%s: %s, %x, %x",
328: (LPSTR)HorzOrVertText,
329: (LPSTR)ScrollTypeText,
330: GET_WM_HSCROLL_POS(wParam, lParam),
331: (INT)GET_WM_HSCROLL_HWND(wParam, lParam));
332: InvalidateRect(hWnd, &rectScroll, TRUE);
333: break;
334:
335: case WM_PAINT:
336: hDC = BeginPaint (hWnd, &ps);
337:
338: if (IntersectRect(&rect, &rectMouse, &ps.rcPaint))
339: TextOut(hDC, rectMouse.left, rectMouse.top,
340: MouseText, strlen(MouseText));
341: if (IntersectRect(&rect, &rectButton, &ps.rcPaint))
342: TextOut(hDC, rectButton.left, rectButton.top,
343: ButtonText, strlen(ButtonText));
344: if (IntersectRect(&rect, &rectKeyboard, &ps.rcPaint))
345: TextOut(hDC, rectKeyboard.left, rectKeyboard.top,
346: KeyboardText, strlen(KeyboardText));
347: if (IntersectRect(&rect, &rectCharacter, &ps.rcPaint))
348: TextOut(hDC, rectCharacter.left, rectCharacter.top,
349: CharacterText, strlen(CharacterText));
350: if (IntersectRect(&rect, &rectTimer, &ps.rcPaint))
351: TextOut(hDC, rectTimer.left, rectTimer.top,
352: TimerText, strlen(TimerText));
353: if (IntersectRect(&rect, &rectScroll, &ps.rcPaint))
354: TextOut(hDC, rectScroll.left, rectScroll.top,
355: ScrollText, strlen(ScrollText));
356:
357: EndPaint(hWnd, &ps);
358: break;
359:
360: case WM_DESTROY:
361: /* Bug?, SetTimer returns an int, KillTimer takes a WORD*/
362: KillTimer(hWnd, (WORD)idTimer); /* Stops the timer */
363: PostQuitMessage(0);
364: break;
365:
366: default:
367: return (DefWindowProc(hWnd, message, wParam, lParam));
368: }
369: return (NULL);
370: }
371:
372:
373: /****************************************************************************
374:
375: FUNCTION: About(HWND, unsigned, WORD, LONG)
376:
377: PURPOSE: Processes messages for "About" dialog box
378:
379: MESSAGES:
380:
381: WM_INITDIALOG - initialize dialog box
382: WM_COMMAND - Input received
383:
384: ****************************************************************************/
385:
386: BOOL APIENTRY About(
387: HWND hDlg,
388: UINT message,
389: UINT wParam,
390: LONG lParam)
391: {
392: switch (message) {
393: case WM_INITDIALOG:
394: return (TRUE);
395:
396: case WM_COMMAND:
397: if (LOWORD(wParam) == IDOK) {
398: EndDialog(hDlg, TRUE);
399: return (TRUE);
400: }
401: break;
402: }
403: return (FALSE);
404: UNREFERENCED_PARAMETER(lParam);
405: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.