Annotation of mstools/samples/input/input.c, revision 1.1.1.2

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,
1.1.1.2 ! root      233:                    lpProcAbout);
1.1       root      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: 
1.1.1.2 ! root      245:            idTimer =  SetTimer(hWnd, NULL, 5000, (TIMERPROC)(LPVOID)NULL);
1.1       root      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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.