home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / prog_pm / chap14 / hexcalc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-01-09  |  5.4 KB  |  163 lines

  1. /*-------------------------------------
  2.    HEXCALC.C -- Hexadecimal Calculator
  3.   -------------------------------------*/
  4.  
  5. #define INCL_WIN
  6. #include <os2.h>
  7. #include <ctype.h>
  8. #include <limits.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include "hexcalc.h"
  12.  
  13. MRESULT EXPENTRY ClientWndProc (HWND, USHORT, MPARAM, MPARAM) ;
  14.  
  15. int main (void)
  16.      {
  17.      HAB  hab ;
  18.      HMQ  hmq ;
  19.      HWND hwndFrame ;
  20.      QMSG qmsg ;
  21.  
  22.      hab = WinInitialize (0) ;
  23.      hmq = WinCreateMsgQueue (hab, 0) ;
  24.  
  25.      WinRegisterClass (hab, CLIENTCLASS, ClientWndProc, 0L, 0) ;
  26.  
  27.      hwndFrame = WinLoadDlg (HWND_DESKTOP, HWND_DESKTOP,
  28.                              NULL, NULL, ID_HEXCALC, NULL) ;
  29.  
  30.      WinSendMsg (hwndFrame, WM_SETICON,
  31.                  WinLoadPointer (HWND_DESKTOP, NULL, ID_ICON), NULL) ;
  32.  
  33.      WinSetFocus (HWND_DESKTOP, WinWindowFromID (hwndFrame, FID_CLIENT)) ;
  34.  
  35.      while (WinGetMsg (hab, &qmsg, NULL, 0, 0))
  36.           WinDispatchMsg (hab, &qmsg) ;
  37.  
  38.      WinDestroyWindow (hwndFrame) ;
  39.      WinDestroyMsgQueue (hmq) ;
  40.      WinTerminate (hab) ;
  41.      return 0 ;
  42.      }
  43.  
  44. void ShowNumber (HWND hwnd, ULONG ulNumber)
  45.      {
  46.      CHAR szBuffer [20] ;
  47.  
  48.      WinSetWindowText (WinWindowFromID (hwnd, ESCAPE),
  49.                        strupr (ltoa (ulNumber, szBuffer, 16))) ;
  50.      }
  51.  
  52. ULONG CalcIt (ULONG ulFirstNum, SHORT sOperation, ULONG ulNum)
  53.      {
  54.      switch (sOperation)
  55.           {
  56.           case '=' : return ulNum ;
  57.           case '+' : return ulFirstNum +  ulNum ;
  58.           case '-' : return ulFirstNum -  ulNum ;
  59.           case '*' : return ulFirstNum *  ulNum ;
  60.           case '&' : return ulFirstNum &  ulNum ;
  61.           case '|' : return ulFirstNum |  ulNum ;
  62.           case '^' : return ulFirstNum ^  ulNum ;
  63.           case '<' : return ulFirstNum << ulNum ;
  64.           case '>' : return ulFirstNum >> ulNum ;
  65.           case '/' : return ulNum ? ulFirstNum / ulNum : ULONG_MAX ;
  66.           case '%' : return ulNum ? ulFirstNum % ulNum : ULONG_MAX ;
  67.           default  : return 0L ;
  68.           }
  69.      }
  70.  
  71. MRESULT EXPENTRY ClientWndProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
  72.      {
  73.      static BOOL  fNewNumber = TRUE ;
  74.      static ULONG ulNumber, ulFirstNum ;
  75.      static SHORT sOperation = '=' ;
  76.      HWND         hwndButton ;
  77.      SHORT        idButton ;
  78.  
  79.      switch (msg)
  80.           {
  81.           case WM_CHAR:
  82.                if (CHARMSG(&msg)->fs & KC_KEYUP)
  83.                     return 0 ;
  84.  
  85.                if (CHARMSG(&msg)->fs & KC_VIRTUALKEY)
  86.                     switch (CHARMSG(&msg)->vkey)
  87.                          {
  88.                          case VK_LEFT:
  89.                               if (!(CHARMSG(&msg)->fs & KC_CHAR))
  90.                                    {
  91.                                    CHARMSG(&msg)->chr = '\b' ;
  92.                                    CHARMSG(&msg)->fs |= KC_CHAR ;
  93.                                    }
  94.                               break ;
  95.  
  96.                          case VK_ESC:
  97.                               CHARMSG(&msg)->chr = ESCAPE ;
  98.                               CHARMSG(&msg)->fs |= KC_CHAR ;
  99.                               break ;
  100.  
  101.                          case VK_NEWLINE:
  102.                          case VK_ENTER:
  103.                               CHARMSG(&msg)->chr = '=' ;
  104.                               CHARMSG(&msg)->fs |= KC_CHAR ;
  105.                               break ;
  106.                          }
  107.  
  108.                if (CHARMSG(&msg)->fs & KC_CHAR)
  109.                     {
  110.                     CHARMSG(&msg)->chr = toupper (CHARMSG(&msg)->chr) ;
  111.  
  112.                     if (hwndButton = WinWindowFromID (hwnd,CHARMSG(&msg)->chr))
  113.                          WinSendMsg (hwndButton, BM_CLICK, NULL, NULL) ;
  114.                     else
  115.                          WinAlarm (HWND_DESKTOP, WA_ERROR) ;
  116.                     }
  117.                return 1 ;
  118.  
  119.           case WM_COMMAND:
  120.                idButton = COMMANDMSG(&msg)->cmd ;
  121.  
  122.                if (idButton == '\b')                        // backspace
  123.                     ShowNumber (hwnd, ulNumber /= 16) ;
  124.  
  125.                else if (idButton == ESCAPE)                 // escape
  126.                     ShowNumber (hwnd, ulNumber = 0L) ;
  127.  
  128.                else if (isxdigit (idButton))                // hex digit
  129.                     {
  130.                     if (fNewNumber)
  131.                          {
  132.                          ulFirstNum = ulNumber ;
  133.                          ulNumber = 0L ;
  134.                          }
  135.                     fNewNumber = FALSE ;
  136.  
  137.                     if (ulNumber <= ULONG_MAX >> 4)
  138.                          ShowNumber (hwnd,
  139.                               ulNumber = 16 * ulNumber + idButton -
  140.                                    (isdigit (idButton) ? '0' : 'A' - 10)) ;
  141.                     else
  142.                          WinAlarm (HWND_DESKTOP, WA_ERROR) ;
  143.                     }
  144.                else                                         // operation
  145.                     {
  146.                     if (!fNewNumber)
  147.                          ShowNumber (hwnd, ulNumber =
  148.                               CalcIt (ulFirstNum, sOperation, ulNumber)) ;
  149.                     fNewNumber = TRUE ;
  150.                     sOperation = idButton ;
  151.                     }
  152.                return 0 ;
  153.  
  154.           case WM_BUTTON1DOWN:
  155.                WinAlarm (HWND_DESKTOP, WA_ERROR) ;
  156.                break ;
  157.  
  158.           case WM_ERASEBACKGROUND:
  159.                return 1 ;
  160.           }
  161.      return WinDefWindowProc (hwnd, msg, mp1, mp2) ;
  162.      }
  163.