Main.cpp

Code:
// Main.cpp
// cl Main.cpp Strings.cpp /O1 /Os /GS- /FeForm3a.exe /Zc:sizedDealloc- TCLib.lib kernel32.lib user32.lib gdi32.lib
// cl Main.cpp Strings.cpp /O1 /Os /GS- /MT /FeForm3b.exe kernel32.lib user32.lib gdi32.lib
// 215,040 Bytes GCC 4.8 x64 UNICODE
// 117,248 Bytes VC19 (VS 2015) x64 UNICODE /MT Linked
//   8,704 Bytes VC19 (VS 2015) x64 UNICODE TCLib Linked
#ifndef UNICODE
   #define UNICODE
#endif
#ifndef _UNICODE
   #define _UNICODE
#endif
#include <windows.h>
#define TCLib
#ifdef TCLib
   #include "tchar.h"
   #include "stdio.h"
#else
   #include <tchar.h>
   #include <stdio.h>
#endif
#include "Form3.h"
#include "Strings.h"


LRESULT fnWndProc_OnCreate(WndEventArgs& Wea)
{
 ProgramData* pProgramData=NULL;
 String* pStr;
 size_t iCtr;

 pStr=new String;
 SetWindowLongPtr(Wea.hWnd,0,(LONG_PTR)pStr);
 pProgramData=(ProgramData*)GlobalAlloc(GPTR,sizeof(ProgramData));
 if(pProgramData)
 {
    SetWindowLongPtr(Wea.hWnd,1*sizeof(void*),(LONG_PTR)pProgramData);
    iCtr=GetClassLongPtr(Wea.hWnd,0);
    iCtr++;
    SetClassLongPtr(Wea.hWnd,0,(LONG_PTR)iCtr);
    return 0;
 }
 else
    return -1;
}


LRESULT fnWndProc_OnSize(WndEventArgs& Wea)
{
 ProgramData* pProgramData=NULL;

 pProgramData=(ProgramData*)GetWindowLongPtr(Wea.hWnd,1*sizeof(void*));
 if(pProgramData)
 {
    pProgramData->xSize=LOWORD(Wea.lParam);
    pProgramData->ySize=HIWORD(Wea.lParam);
    InvalidateRect(Wea.hWnd,NULL,TRUE);
 }

 return 0;
}


LRESULT fnWndProc_OnChar(WndEventArgs& Wea)
{
 String* pStr=NULL;

 pStr=(String*)GetWindowLongPtr(Wea.hWnd,0);
 if(pStr)
 {
    *pStr=*pStr+Wea.wParam;
    InvalidateRect(Wea.hWnd,NULL,FALSE);
 }

 return 0;
}


LRESULT fnWndProc_OnMouseMove(WndEventArgs& Wea)
{
 ProgramData* pProgramData=NULL;

 pProgramData=(ProgramData*)GetWindowLongPtr(Wea.hWnd,1*sizeof(void*));
 if(pProgramData)
 {
    pProgramData->xMouse=LOWORD(Wea.lParam);
    pProgramData->yMouse=HIWORD(Wea.lParam);
    InvalidateRect(Wea.hWnd,NULL,TRUE);
 }

 return 0;
}


LRESULT fnWndProc_OnLButtonDown(WndEventArgs& Wea)
{
 ProgramData* pProgramData=NULL;

 pProgramData=(ProgramData*)GetWindowLongPtr(Wea.hWnd,1*sizeof(void*));
 if(pProgramData)
 {
    pProgramData->xButton=LOWORD(Wea.lParam);
    pProgramData->yButton=HIWORD(Wea.lParam);
    InvalidateRect(Wea.hWnd,NULL,FALSE);
 }

 return 0;
}


LRESULT fnWndProc_OnPaint(WndEventArgs& Wea)
{
 ProgramData* pProgramData=NULL;
 String* pStr=NULL;
 String s1,s2,s3;
 PAINTSTRUCT ps;
 HDC hDC;

 hDC=BeginPaint(Wea.hWnd,&ps);
 pProgramData=(ProgramData*)GetWindowLongPtr(Wea.hWnd,1*sizeof(void*));
 if(pProgramData)
 {
    s1=pProgramData->xMouse;
    s2=pProgramData->yMouse;
    s3=_T("xMouse=");
    s3=s3+s1+_T("  yMouse=")+s2+_T("  ");
    TextOut(hDC,0,0,s3.lpStr(),s3.Len());
    if(pProgramData->xButton||pProgramData->yButton)
    {
       s1=pProgramData->xButton;
       s2=pProgramData->yButton;
       s3=_T("xButton=");
       s3=s3+s1+_T("  yButton=")+s2+_T("  ");
       TextOut(hDC,pProgramData->xButton+12,pProgramData->yButton,s3.lpStr(),s3.Len());
       pProgramData->xButton=0, pProgramData->yButton=0;
    }
    s1=pProgramData->xSize;
    s2=pProgramData->ySize;
    s3=_T("Width=");
    s3=s3+s1+_T("  Height=")+s2+_T("  ");
    TextOut(hDC,0,20,s3.lpStr(),s3.Len());
    pStr=(String*)GetWindowLongPtr(Wea.hWnd,0);
    if(pStr)
       TextOut(hDC,0,40,pStr->lpStr(),pStr->Len());
 }
 EndPaint(Wea.hWnd,&ps);

 return 0;
}


LRESULT fnWndProc_OnDestroy(WndEventArgs& Wea)
{
 ProgramData* pProgramData=NULL;
 String* pStr=NULL;
 size_t iCtr;

 pStr=(String*)GetWindowLongPtr(Wea.hWnd,0);
 if(pStr)
    delete pStr;
 pProgramData=(ProgramData*)GetWindowLongPtr(Wea.hWnd,1*sizeof(void*));
 if(pProgramData)
    GlobalFree(pProgramData);
 iCtr=GetClassLongPtr(Wea.hWnd,0);
 iCtr--;
 if(iCtr==0)
 {
    MessageBox(Wea.hWnd,_T("No More Windows Left!  Will Call PostQuitMessage()!"),_T("Time To Go!"),MB_OK);
    PostQuitMessage(0);
 }
 else
 {
    MessageBox(Wea.hWnd,_T("Will Be Just Destroying This Window!"),_T("Another Dead Window!"),MB_OK);
    SetClassLongPtr(Wea.hWnd,0,(LONG_PTR)iCtr);
 }

 return 0;
}


LRESULT CALLBACK fnWndProc(HWND hwnd, unsigned int msg, WPARAM wParam,LPARAM lParam)
{
 WndEventArgs Wea;

 for(unsigned int i=0; i<dim(EventHandler); i++)
 {
     if(EventHandler[i].Code==msg)
     {
        Wea.hWnd=hwnd, Wea.lParam=lParam, Wea.wParam=wParam;
        return (*EventHandler[i].fnPtr)(Wea);
     }
 }

 return (DefWindowProc(hwnd, msg, wParam, lParam));
}


int __stdcall WinMain(HINSTANCE hIns, HINSTANCE hPrevIns, LPSTR lpszArgument, int iShow)
{
 TCHAR szClassName[]=_T("Form3");
 TCHAR szCaption[80];
 WNDCLASSEX wc;
 MSG messages;

 wc.lpszClassName=szClassName,                          wc.lpfnWndProc=fnWndProc;
 wc.cbSize=sizeof(WNDCLASSEX),                          wc.style=0;
 wc.hIcon=LoadIcon(NULL,IDI_APPLICATION),               wc.hInstance=hIns;
 wc.hIconSm=LoadIcon(NULL, IDI_APPLICATION),            wc.hCursor=LoadCursor(NULL,IDC_ARROW);
 wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH),  wc.cbWndExtra=3*sizeof(void*);
 wc.lpszMenuName=NULL,                                  wc.cbClsExtra=8;
 RegisterClassEx(&wc);
 _tcscpy(szCaption,_T("Try Typing Text, Moving Mouse, Clicking Left Mouse Button, Or Sizing Window!"));
 for(size_t i=0; i<4; i++)
     CreateWindowEx(0,szClassName,szCaption,WS_OVERLAPPEDWINDOW|WS_VISIBLE,CW_USEDEFAULT,CW_USEDEFAULT,625,400,HWND_DESKTOP,0,hIns,0);
 while(GetMessage(&messages,NULL,0,0))
 {
    TranslateMessage(&messages);
    DispatchMessage(&messages);
 }

 return messages.wParam;
}
Form3.h
Code:
//Form3.h
#ifndef Form3_h
#define Form3_h

#define dim(x)                  (sizeof(x) / sizeof(x[0]))
#ifdef TCLib
extern "C" int                  _fltused = 1;
#endif

struct                          WndEventArgs
{
 HWND                           hWnd;
 WPARAM                         wParam;
 LPARAM                         lParam;
 HINSTANCE                      hIns;
};

struct                          EVENTHANDLER
{
 unsigned int                   Code;
 LRESULT                        (*fnPtr)(WndEventArgs&);
};

LRESULT fnWndProc_OnCreate      (WndEventArgs& Wea);
LRESULT fnWndProc_OnSize        (WndEventArgs& Wea);
LRESULT fnWndProc_OnChar        (WndEventArgs& Wea);
LRESULT fnWndProc_OnMouseMove   (WndEventArgs& Wea);
LRESULT fnWndProc_OnLButtonDown (WndEventArgs& Wea);
LRESULT fnWndProc_OnPaint       (WndEventArgs& Wea);
LRESULT fnWndProc_OnDestroy     (WndEventArgs& Wea);

const EVENTHANDLER              EventHandler[] =
{
 {WM_CREATE,                    fnWndProc_OnCreate},
 {WM_SIZE,                      fnWndProc_OnSize},
 {WM_CHAR,                      fnWndProc_OnChar},
 {WM_MOUSEMOVE,                 fnWndProc_OnMouseMove},
 {WM_LBUTTONDOWN,               fnWndProc_OnLButtonDown},
 {WM_PAINT,                     fnWndProc_OnPaint},
 {WM_DESTROY,                   fnWndProc_OnDestroy}
};

struct ProgramData
{
 short int                      xMouse;
 short int                      yMouse;
 short int                      xSize;
 short int                      ySize;
 short int                      xButton;
 short int                      yButton;
};

#endif