// Stupid "Hello World" example
//
// The user clicks a command button, and a "Hello World"
// message box appears.
#include <windows.h> 

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
   {
   static char szAppName[] = "SayHello" ;
   HWND hwnd ;
   MSG msg ;
   WNDCLASSEX wndclass ;

   wndclass.cbSize        = sizeof (wndclass) ;
   wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
   wndclass.lpfnWndProc   = WndProc ;
   wndclass.cbClsExtra    = 0 ;
   wndclass.cbWndExtra    = 0 ;
   wndclass.hInstance     = hInstance ;
   wndclass.hIcon         = LoadIcon(NULL, IDI_APPLICATION) ;
   wndclass.hCursor       = LoadCursor(NULL, IDC_ARROW) ;
   wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH) ;
   wndclass.lpszMenuName  = NULL ;
   wndclass.lpszClassName = szAppName ;
   wndclass.hIconSm       = LoadIcon(NULL, IDI_APPLICATION) ;
  
   RegisterClassEx(&wndclass) ;
   
   hwnd = CreateWindow(szAppName, "Hello World",
                        WS_OVERLAPPEDWINDOW,
                        CW_USEDEFAULT, CW_USEDEFAULT,
                        CW_USEDEFAULT, CW_USEDEFAULT,
                        NULL, NULL, hInstance, NULL) ;

   ShowWindow(hwnd, iCmdShow) ;
   UpdateWindow(hwnd) ;

   while (GetMessage(&msg, NULL, 0, 0))
      {
      TranslateMessage(&msg) ;
      DispatchMessage(&msg) ;
      }
   return msg.wParam ;
   }

LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, 
                         LPARAM lParam)
   {
   int wNotifyCode ;
   HWND hwndCtl ;
   static HWND  hwndButton ;
   static RECT  rect ;
   static int   cxChar, cyChar ;
   HDC          hdc ;
   PAINTSTRUCT  ps ;
   TEXTMETRIC   tm ;

   switch (iMsg)
      {
      case WM_CREATE :
         hdc = GetDC(hwnd) ;
         SelectObject(hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;
         GetTextMetrics(hdc, &tm) ;
         cxChar = tm.tmAveCharWidth ;
         cyChar = tm.tmHeight + tm.tmExternalLeading ;
         ReleaseDC(hwnd, hdc) ;
         GetClientRect( hwnd, &rect ) ;

         hwndButton = CreateWindow("BUTTON", "&Say Hello", 
                      WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
                      (rect.right-rect.left)/20*9,
                      (rect.bottom-rect.top)/10*4, 
                      14 * cxChar, 3 * cyChar,
                      (HWND) hwnd, 1,
                      ((LPCREATESTRUCT) lParam) -> hInstance, NULL) ;

         return 0 ;

      case WM_SIZE :
         rect.left   = 24 * cxChar ;
         rect.top    =  2 * cyChar ;
         rect.right  = LOWORD (lParam) ;
         rect.bottom = HIWORD (lParam) ;
         return 0 ;

      case WM_PAINT :
         InvalidateRect(hwnd, &rect, TRUE) ;
          
          hdc = BeginPaint(hwnd, &ps) ;
          EndPaint(hwnd, &ps) ;
          return 0 ;

      case WM_DRAWITEM :
      case WM_COMMAND :
         wNotifyCode = HIWORD(wParam) ;
         hwndCtl = (HWND) lParam ;
          
          if ((hwndCtl == hwndButton) && (wNotifyCode == BN_CLICKED))
             MessageBox(hwnd, "Hello, World!", "Greetings", MB_OK) ; 

          ValidateRect(hwnd, &rect) ;

          break ;

      case WM_DESTROY :
         PostQuitMessage (0) ;
         return 0 ;
      }
   return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
   }