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