|
|
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.