#include <windows.h>
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
     PSTR szCmdLine, int iCmdShow)
{
 static TCHAR  szAppName[] = TEXT ("HexCalc") ;
 HWND            hwnd ;
 MSG             msg ;
 WNDCLASS        wndclass ;
 
 wndclass.style            = CS_HREDRAW | CS_VREDRAW;
 wndclass.lpfnWndProc      = WndProc ;
 wndclass.cbClsExtra       = 0 ;
 wndclass.cbWndExtra       = DLGWINDOWEXTRA ;       // Note!
 wndclass.hInstance        = hInstance ;
 wndclass.hIcon            = LoadIcon (hInstance, szAppName) ;
 wndclass.hCursor          = LoadCursor (NULL, IDC_ARROW) ;
 wndclass.hbrBackground   = (HBRUSH) (COLOR_BTNFACE + 1) ;
 wndclass.lpszMenuName    = NULL ;
 wndclass.lpszClassName   = szAppName ;
 
 if (!RegisterClass (&wndclass))
 {
  MessageBox ( NULL, TEXT ("This program requires Windows NT!"),
   szAppName, MB_ICONERROR) ;
  return 0 ;
 }
 
 hwnd = CreateDialog (hInstance, szAppName, 0, NULL) ;
 ShowWindow (hwnd, iCmdShow) ;
 while (GetMessage (&msg, NULL, 0, 0))
 {
  TranslateMessage (&msg) ;
  DispatchMessage (&msg) ;
 }
 return msg.wParam ;
}
void ShowNumber (HWND hwnd, UINT iNumber)
{
 TCHAR szBuffer[20] ;
 wsprintf (szBuffer, TEXT ("%X"), iNumber) ;
 SetDlgItemText (hwnd, VK_ESCAPE, szBuffer) ;
}
DWORD CalcIt (UINT iFirstNum, int iOperation, UINT iNum)
{
 switch (iOperation)
 {
 case '=': return iNum ;
 case '+': return iFirstNum +  iNum ;
 case '-': return iFirstNum -  iNum ;
 case '*': return iFirstNum *  iNum ;
 case '&': return iFirstNum &  iNum ;
 case '|': return iFirstNum |  iNum ;
 case '^': return iFirstNum ^  iNum ;
 case '<': return iFirstNum << iNum ;
 case '>': return iFirstNum >> iNum ;
 case '/': return iNum ? iFirstNum / iNum: MAXDWORD ;
 case '%': return iNum ? iFirstNum % iNum: MAXDWORD ;
 default : return 0 ;
 }
}
LRESULT CALLBACK WndProc ( HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam)
{
 static BOOL   bNewNumber = TRUE ;
 static int    iOperation = '=' ;
 static UINT  iNumber, iFirstNum ;
 HWND        hButton ;
 
 switch (message)
 {
 case WM_KEYDOWN:                   // left arrow --> backspace
  if (wParam != VK_LEFT)
   break ;
  wParam = VK_BACK ;
  // fall through
 case WM_CHAR:
  if  ((wParam = (WPARAM) CharUpper ((TCHAR *) wParam)) == VK_RETURN)
   wParam = '=' ;
  
  if  (hButton = GetDlgItem (hwnd, wParam))
  {
   SendMessage (hButton, BM_SETSTATE, 1, 0) ;
   Sleep (100) ;
   SendMessage (hButton, BM_SETSTATE, 0, 0) ;
  }
  else
  {
   MessageBeep (0) ;
   break ;
  }
  // fall through
 case  WM_COMMAND:
  SetFocus (hwnd) ;
  
  if (LOWORD (wParam) == VK_BACK)           //backspace
   ShowNumber (hwnd, iNumber /= 16) ;
  
  else if (LOWORD (wParam) == VK_ESCAPE)    // escape
   ShowNumber (hwnd, iNumber = 0) ;
  
  else if (isxdigit (LOWORD (wParam)))      // hex digit
  {
   if (bNewNumber)
   {
    iFirstNum = iNumber ;
    iNumber = 0 ;
   }
   bNewNumber = FALSE ;
   if  (iNumber <= MAXDWORD >> 4)
    ShowNumber (hwnd, iNumber = 16 * iNumber + wParam -
    (isdigit (wParam) ? '0': 'A' - 10)) ;
   else
    MessageBeep (0) ;
  }
  else    // operation
  {
   if (!bNewNumber)
    ShowNumber (hwnd, iNumber =
    CalcIt (iFirstNum, iOperation, iNumber)) ;
   bNewNumber = TRUE ;
   iOperation = LOWORD (wParam) ;
  }
  return 0 ;
 case  WM_DESTROY:
  PostQuitMessage (0) ;
  return 0 ;
 }
 return DefWindowProc (hwnd, message, wParam, lParam) ;
}
 
 
 
//.RC
//Microsoft Developer Studio generated resource script.
//
#include "resrc1.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "resource.h"
#include "afxres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// Chinese (中国) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
#ifdef _WIN32
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#pragma code_page(936)
#endif //_WIN32
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//
HEXCALC DIALOG DISCARDABLE  65535, 65535, 102, 122
STYLE WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU
CAPTION "Hex Calculator"
CLASS "HexCalc"
BEGIN
    PUSHBUTTON      "D",68,8,24,14,14
    PUSHBUTTON      "A",65,8,40,14,14
    PUSHBUTTON      "7",55,8,56,14,14
    PUSHBUTTON      "4",52,8,72,14,14
    PUSHBUTTON      "1",49,8,88,14,14
    PUSHBUTTON      "0",48,8,104,14,14
    PUSHBUTTON      "0",27,26,4,50,14
    PUSHBUTTON      "E",69,26,24,14,14
    PUSHBUTTON      "B",66,26,40,14,14
    PUSHBUTTON      "8",56,26,56,14,14
    PUSHBUTTON      "5",53,26,72,14,14
    PUSHBUTTON      "2",50,26,88,14,14
    PUSHBUTTON      "Back",8,26,104,32,14
    PUSHBUTTON      "C",67,44,40,14,14
    PUSHBUTTON      "F",70,44,24,14,14
    PUSHBUTTON      "9",57,44,56,14,14
    PUSHBUTTON      "6",54,44,72,14,14
    PUSHBUTTON      "3",51,44,88,14,14
    PUSHBUTTON      "+",43,62,24,14,14
    PUSHBUTTON      "-",45,62,40,14,14
    PUSHBUTTON      "*",42,62,56,14,14
    PUSHBUTTON      "/",47,62,72,14,14
    PUSHBUTTON      "%",37,62,88,14,14
    PUSHBUTTON      "Equals",61,62,104,32,14
    PUSHBUTTON      "&&",38,80,24,14,14
    PUSHBUTTON      "|",124,80,40,14,14
    PUSHBUTTON      "^",94,80,56,14,14
    PUSHBUTTON      "<",60,80,72,14,14
    PUSHBUTTON      ">",62,80,88,14,14
END

#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE DISCARDABLE 
BEGIN
    "resrc1.h\0"
END
2 TEXTINCLUDE DISCARDABLE 
BEGIN
    "#include ""resource.h""\r\n"
    "#include ""afxres.h""\r\n"
    "\0"
END
3 TEXTINCLUDE DISCARDABLE 
BEGIN
    "\r\n"
    "\0"
END
#endif    // APSTUDIO_INVOKED

/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
HexCalc                 ICON    DISCARDABLE     "HexCalc.ico"
#endif    // Chinese (中国) resources
/////////////////////////////////////////////////////////////////////////////
 
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//

/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED