home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c221 / 7.ddi / MWHC.007 / F3 < prev    next >
Encoding:
Text File  |  1990-11-11  |  4.9 KB  |  145 lines

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