#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) ;        
}        
HEXCALC.RC (摘录)         
//Microsoft Developer Studio generated resource script.        
#include "resource.h"        
#include "afxres.h"        
/////////////////////////////////////////////////////////////////////////////        
// Icon        
HEXCALC                                   ICON    DISCARDABLE                      "HexCalc.ico"        
/////////////////////////////////////////////////////////////////////////////        
#include "hexcalc.dlg"        
HEXCALC.DLG        
/*--------------------------------        
  HEXCALC.DLG dialog script        
----------------------------------*/        
HexCalc DIALOG -1, -1, 102, 122        
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX        
CLASS "HexCalc"        
CAPTION "Hex Calculator"        
{        
   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        
}