home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 8 / 08.iso / d / d022 / 1.ddi / SAMPLES / CALC / USERCODE.C < prev    next >
Encoding:
C/C++ Source or Header  |  1990-07-10  |  3.5 KB  |  134 lines

  1. /*Filename: USERCODE.C                                      */
  2. /*"CALC" Generated by WindowsMAKER                          */
  3. /*Author: Bill G.                                           */
  4.  
  5. #include <WINDOWS.H>
  6. #include "CALC.H"
  7. #include <limits.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <ctype.h>
  11.  
  12. BOOL  bNewNumber = TRUE ;
  13. short operator   = '=' ;
  14. DWORD dwNumber, dwFirstNum ;
  15.  
  16. DWORD Calculate(DWORD,short,DWORD);
  17. void  DisplayNumber(HWND,DWORD);
  18. BOOL CalcInput(HWND,WORD);
  19.  
  20. /* Initialization procedure for class */
  21. BOOL BLD_MainClassClsInit(pWndCls)
  22. WNDCLASS *pWndCls;
  23.     {
  24.     /* Window extra bytes needed for private dialog class */
  25.     pWndCls->cbWndExtra = DLGWINDOWEXTRA;    
  26.     return TRUE;
  27.     }
  28.  
  29. /* Initialization procedure for window */
  30. HWND BLD_MainWindowWndInit(pWndStyle,Coordinate,ppInfo) 
  31. DWORD *pWndStyle;
  32. int Coordinate[];
  33. PSTR *ppInfo;
  34.     {
  35.     /* Let MS-Windows do all the work */
  36.     return CreateDialog (hInst, "CALCULATOR", 0, NULL); 
  37.     }
  38.  
  39. /* Procedure for processing WM_COMMAND (control) messages */
  40. long BLD_WM_COMMANDMsg(hWnd,message,wParam,lParam) 
  41. HWND hWnd;
  42. unsigned message;
  43. WORD wParam;     
  44. LONG lParam;     
  45.     {
  46.     SetFocus(hWnd); 
  47.     CalcInput(hWnd,wParam);
  48.     return 0L;
  49.     }
  50.  
  51. /* Procedure for processing keyboard input */
  52. long BLD_WM_CHARMsg(hWnd,message,wParam,lParam) 
  53. HWND hWnd;
  54. unsigned message;
  55. WORD wParam;     
  56. LONG lParam;     
  57.     {
  58.     HWND         hButton ;
  59.     if ((wParam = toupper (wParam)) == VK_RETURN)
  60.          wParam = '=' ;
  61.  
  62.     if (hButton = GetDlgItem (hWnd, wParam))
  63.          {
  64.          SendMessage (hButton, BM_SETSTATE, 1, 0L) ;
  65.          SendMessage (hButton, BM_SETSTATE, 0, 0L) ;
  66.          CalcInput(hWnd,wParam);
  67.          }
  68.     else
  69.          MessageBeep (0) ;
  70.     return 0L;
  71.     }
  72.  
  73.  
  74. /* Sorting out the different types of input */
  75. BOOL CalcInput(hWnd,wButton)
  76. HWND hWnd;
  77. WORD wButton;     
  78. {
  79.  
  80.     if (wButton == VK_ESCAPE)              /* escape */
  81.          DisplayNumber (hWnd, dwNumber = 0L) ;
  82.  
  83.     else if (isdigit (wButton))             /* digit */
  84.          {
  85.          if (bNewNumber)
  86.               {
  87.               dwFirstNum = dwNumber ;
  88.               dwNumber = 0L ;
  89.               }
  90.          bNewNumber = FALSE ;
  91.          if (dwNumber <= ULONG_MAX >> 4)
  92.               DisplayNumber (hWnd, dwNumber = 10 * dwNumber + wButton- '0') ;
  93.          else
  94.               MessageBeep (0) ;
  95.          }
  96.  
  97.     else                                    /* operator */
  98.          {
  99.          if (!bNewNumber)
  100.               DisplayNumber (hWnd, dwNumber =
  101.                    Calculate (dwFirstNum, operator, dwNumber)) ;
  102.          bNewNumber = TRUE ;
  103.          operator = wButton ;
  104.          }
  105.     return TRUE;
  106. }
  107.  
  108. /* Perform calculation using the operator and numbers */
  109. DWORD Calculate (dwFirstNum, operator, dwNum)
  110.      DWORD dwFirstNum, dwNum ;
  111.      short operator ;
  112.      {
  113.      switch (operator)
  114.           {
  115.           case '=' : return dwNum ;
  116.           case '+' : return dwFirstNum +  dwNum ;
  117.           case '-' : return dwFirstNum -  dwNum ;
  118.           case '*' : return dwFirstNum *  dwNum ;
  119.           case '/' : return dwNum ? dwFirstNum / dwNum : ULONG_MAX ;
  120.           default  : return 0L ;
  121.           }
  122.      }
  123.  
  124. /* Display number in result (VK_ESCAPE) push button */
  125. void DisplayNumber (hWnd, dwNumber)
  126.      HWND  hWnd ;
  127.      DWORD dwNumber ;
  128.      {
  129.      char  szText [20] ;
  130.      SetDlgItemText (hWnd, VK_ESCAPE, strupr (ltoa (dwNumber, szText, 10))) ;
  131.      }
  132.  
  133.  
  134.