home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / msj / msjv3_1 / hexcalc / hexcalcw.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-03-02  |  5.5 KB  |  180 lines

  1. /*
  2. Microsoft Systems Journal
  3. Volume 3; Issue 1; January, 1988
  4.  
  5. Code Listings For:
  6.  
  7.     Hexcalc
  8.     pp. 39-48
  9.  
  10. Author(s): Charles Petzold
  11. Title:     HEXCALC: An Instructive Pop-Up Calculator for Microsoft Windows
  12.  
  13.  
  14.  
  15. Figure 6w
  16. =========
  17.  
  18. */
  19.  
  20. /*--------------------------------------------------------
  21.    HEXCALCW.C -- Hexadecimal Calculator (Windows version)
  22.   --------------------------------------------------------*/
  23.  
  24. #include <windows.h>
  25. #include <limits.h>
  26. #include <stdlib.h>
  27. #include <string.h>
  28. #include <ctype.h>
  29.  
  30. long FAR PASCAL WndProc (HWND, unsigned, WORD, LONG) ;
  31.  
  32. int PASCAL WinMain (hInstance, hPrevInstance, lpszCmdLine, nCmdShow)
  33.      HANDLE      hInstance, hPrevInstance;
  34.      LPSTR       lpszCmdLine;
  35.      int         nCmdShow;
  36.      {
  37.      static char szAppName [] = "HexCalcW" ;
  38.      HWND        hWnd ;
  39.      MSG         msg;
  40.      WNDCLASS    wndclass ;
  41.  
  42.      if (!hPrevInstance)
  43.           {
  44.           wndclass.style          = CS_HREDRAW | CS_VREDRAW;
  45.           wndclass.lpfnWndProc    = WndProc ;
  46.           wndclass.cbClsExtra     = 0 ;
  47.           wndclass.cbWndExtra     = 0 ;
  48.           wndclass.hInstance      = hInstance ;
  49.           wndclass.hIcon          = LoadIcon (hInstance, szAppName) ;
  50.           wndclass.hCursor        = LoadCursor (NULL, IDC_ARROW) ;
  51.           wndclass.hbrBackground  = COLOR_WINDOW + 1 ;
  52.           wndclass.lpszMenuName   = NULL ;
  53.           wndclass.lpszClassName  = szAppName ;
  54.  
  55.           if (!RegisterClass (&wndclass))
  56.                return FALSE ;
  57.           }
  58.  
  59.      hWnd = CreateDialog (hInstance, szAppName, 0, NULL) ;
  60.  
  61.      ShowWindow (hWnd, nCmdShow) ;
  62.  
  63.      while (GetMessage (&msg, NULL, 0, 0))
  64.           {
  65.           TranslateMessage (&msg) ;
  66.           DispatchMessage (&msg) ;
  67.           }
  68.      return msg.wParam ;
  69.      }
  70.  
  71. void ShowNumber (hWnd, dwNumber)
  72.      HWND  hWnd ;
  73.      DWORD dwNumber ;
  74.      {
  75.      char  szBuffer [20] ;
  76.  
  77.      SetDlgItemText (hWnd, VK_ESCAPE,
  78.                          strupr (ltoa (dwNumber, szBuffer, 16))) ;
  79.      }
  80.  
  81. DWORD CalcIt (dwFirstNum, nOperation, dwNum)
  82.      DWORD dwFirstNum, dwNum ;
  83.      short nOperation ;
  84.      {
  85.      switch (nOperation)
  86.           {
  87.           case '=' : return dwNum ;
  88.           case '+' : return dwFirstNum +  dwNum ;
  89.           case '-' : return dwFirstNum -  dwNum ;
  90.           case '*' : return dwFirstNum *  dwNum ;
  91.           case '&' : return dwFirstNum &  dwNum ;
  92.           case '|' : return dwFirstNum |  dwNum ;
  93.           case '^' : return dwFirstNum ^  dwNum ;
  94.           case '<' : return dwFirstNum << dwNum ;
  95.           case '>' : return dwFirstNum >> dwNum ;
  96.           case '/' : return dwNum ? dwFirstNum / dwNum : ULONG_MAX ;
  97.           case '%' : return dwNum ? dwFirstNum % dwNum : ULONG_MAX ;
  98.           default  : return 0L ;
  99.           }
  100.      }
  101.  
  102. long FAR PASCAL WndProc (hWnd, iMessage, wParam, lParam)
  103.      HWND         hWnd;
  104.      unsigned     iMessage;
  105.      WORD         wParam;
  106.      LONG         lParam;
  107.      {
  108.      static BOOL  bNewNumber = TRUE ;
  109.      static DWORD dwNumber, dwFirstNum ;
  110.      static short nOperation = '=' ;
  111.      HWND         hButton ;
  112.  
  113.      switch (iMessage)
  114.           {
  115.           case WM_KEYDOWN:              /* left arrow --> backspace */
  116.                if (wParam != VK_LEFT)
  117.                     break ;
  118.                wParam = VK_BACK ;
  119.                                              /* fall through */
  120.           case WM_CHAR:
  121.                if ((wParam = toupper (wParam)) == VK_RETURN)
  122.                     wParam = '=' ;
  123.  
  124.                if (hButton = GetDlgItem (hWnd, wParam))
  125.                     {
  126.                     SendMessage (hButton, BM_SETSTATE, 1, 0L) ;
  127.                     SendMessage (hButton, BM_SETSTATE, 0, 0L) ;
  128.                     }
  129.                else
  130.                     {
  131.                     MessageBeep (0) ;
  132.                     break ;
  133.                     }
  134.                                              /* fall through */
  135.           case WM_COMMAND:
  136.                SetFocus (hWnd) ;
  137.  
  138.                if (wParam == VK_BACK)                  /* backspace */
  139.                     ShowNumber (hWnd, dwNumber /= 16) ;
  140.  
  141.                else if (wParam == VK_ESCAPE)           /* escape */
  142.                     ShowNumber (hWnd, dwNumber = 0L) ;
  143.  
  144.                else if (isxdigit (wParam))             /* hex digit */
  145.                     {
  146.                     if (bNewNumber)
  147.                          {
  148.                          dwFirstNum = dwNumber ;
  149.                          dwNumber = 0L ;
  150.                          }
  151.                     bNewNumber = FALSE ;
  152.  
  153.                     if (dwNumber <= ULONG_MAX >> 4)
  154.                          ShowNumber (hWnd, dwNumber =
  155.                               16 * dwNumber + wParam -
  156.                               (isdigit (wParam) ? '0' : 'A' - 10)) ;
  157.                     else
  158.                          MessageBeep (0) ;
  159.                     }
  160.                else                                    /* operation */
  161.                     {
  162.                     if (!bNewNumber)
  163.                          ShowNumber (hWnd, dwNumber =
  164.                               CalcIt (dwFirstNum, nOperation,
  165.                                       dwNumber)) ;
  166.                     bNewNumber = TRUE ;
  167.                     nOperation = wParam ;
  168.                     }
  169.                break ;
  170.  
  171.           case WM_DESTROY:
  172.                PostQuitMessage (0) ;
  173.                break ;
  174.  
  175.           default :
  176.                return DefWindowProc (hWnd, iMessage, wParam, lParam) ;
  177.           }
  178.      return 0L ;
  179.      }
  180.