home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / windows / hexcalc.zip / HEXCALC.C < prev    next >
Text File  |  1988-03-13  |  4KB  |  153 lines

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