//Main.cpp
#define UNICODE
#define _UNICODE
#include <windows.h>
#include <tchar.h>
#include <string>
#include "ProgEx39d.h"
long fnWndProc_OnCreate(lpWndEventArgs Wea) //Message Handler For WM_CREATE Message
{
std::wstring* pStr=NULL;
ProgramData* pPD=NULL;
long iCntr=0;
pStr=new std::wstring;
SetWindowLong(Wea->hWnd,0,(long)pStr);
pPD=(ProgramData*)GlobalAlloc(GPTR,sizeof(ProgramData));
if(pPD)
SetWindowLong(Wea->hWnd,4,(long)pPD);
else
return -1;
iCntr=GetClassLong(Wea->hWnd,0);
iCntr++;
SetClassLong(Wea->hWnd,0,iCntr);
return 0;
}
long fnWndProc_OnSize(lpWndEventArgs Wea) //Message Handler For WM_SIZE Message
{
ProgramData* pPD=NULL;
pPD=(ProgramData*)GetWindowLong(Wea->hWnd,4);
pPD->xSize=LOWORD(Wea->lParam);
pPD->ySize=HIWORD(Wea->lParam);
InvalidateRect(Wea->hWnd,NULL,TRUE);
return 0;
}
long fnWndProc_OnChar(lpWndEventArgs Wea) //Message Handler For WM_CHAR Message
{
std::wstring* pStr=(std::wstring*)GetWindowLong(Wea->hWnd,0);
*pStr+=+Wea->wParam;
InvalidateRect(Wea->hWnd,NULL,FALSE);
return 0;
}
long fnWndProc_OnMouseMove(lpWndEventArgs Wea) //Message Handler For WM_MOUSEMOVE Message
{
ProgramData* pPD=(ProgramData*)GetWindowLong(Wea->hWnd,4);
pPD->xMouse=LOWORD(Wea->lParam);
pPD->yMouse=HIWORD(Wea->lParam);
InvalidateRect(Wea->hWnd,NULL,TRUE);
return 0;
}
long fnWndProc_OnLButtonDown(lpWndEventArgs Wea) //Message Handler For WM_LBUTTONDOWN Message
{
ProgramData* pPD=(ProgramData*)GetWindowLong(Wea->hWnd,4);
pPD->xButton=LOWORD(Wea->lParam);
pPD->yButton=HIWORD(Wea->lParam);
InvalidateRect(Wea->hWnd,NULL,FALSE);
return 0;
}
long fnWndProc_OnPaint(lpWndEventArgs Wea) //Message Handler For WM_PAINT Message
{
ProgramData* pPD=NULL;
std::wstring* pStr;
TCHAR szBuffer[16];
PAINTSTRUCT ps;
std::wstring s1;
std::wstring s2;
HDC hDC;
hDC=BeginPaint(Wea->hWnd,&ps);
pPD=(ProgramData*)GetWindowLong(Wea->hWnd,4);
s1=_T("xMouse=");
_stprintf(szBuffer,_T("%d"),pPD->xMouse);
s2=szBuffer;
s1+=s2+_T(" yMouse=");
_stprintf(szBuffer,_T("%d"),pPD->yMouse);
s2=szBuffer;
s1+=s2;
TextOut(hDC,0,0,s1.c_str(),s1.length());
if(pPD->xButton||pPD->yButton)
{
s1=_T("xButton=");
_stprintf(szBuffer,_T("%d"),pPD->xButton);
s2=szBuffer;
s1+=s2+_T(" yButton=");
_stprintf(szBuffer,_T("%d"),pPD->yButton);
s2=szBuffer;
s1+=s2;
TextOut(hDC,pPD->xButton+12,pPD->yButton,s1.c_str(),s1.length());
pPD->xButton=0, pPD->yButton=0;
}
s1=_T("Width=");
_stprintf(szBuffer,_T("%d"),pPD->xSize);
s2=szBuffer;
s1+=s2+_T(" Height=");
_stprintf(szBuffer,_T("%d"),pPD->ySize);
s2=szBuffer;
s1+=s2;
TextOut(hDC,0,20,s1.c_str(),s1.length());
pStr=(std::wstring*)GetWindowLong(Wea->hWnd,0);
TextOut(hDC,0,40,pStr->c_str(),pStr->length());
EndPaint(Wea->hWnd,&ps);
return 0;
}
long fnWndProc_OnDestroy(lpWndEventArgs Wea) //Message Handler For WM_DESTROY Message
{
ProgramData* pPD=NULL;
std::wstring* pStr;
pStr=(std::wstring*)GetWindowLong(Wea->hWnd,0);
delete pStr;
pPD=(ProgramData*)GetWindowLong(Wea->hWnd,4);
if(pPD)
GlobalFree(pPD);
long iCntr=GetClassLong(Wea->hWnd,0);
iCntr--;
if(iCntr==0)
{
MessageBox(Wea->hWnd,_T("No More Windows Left!"),_T("Will Now Close..."),MB_OK);
PostQuitMessage(0);
}
else
SetClassLong(Wea->hWnd,0,iCntr);
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].iMsg==msg)
{
Wea.hWnd=hwnd, Wea.lParam=lParam, Wea.wParam=wParam;
return (*EventHandler[i].fnPtr)(&Wea);
}
}
return (DefWindowProc(hwnd, msg, wParam, lParam));
}
int WINAPI WinMain(HINSTANCE hIns, HINSTANCE hPrevIns, LPSTR lpszArgument, int iShow)
{
TCHAR szClassName[]=_T("ProgEx39d");
TCHAR szCaption[80];
WNDCLASSEX wc;
MSG messages;
HWND hWnd;
wc.lpszClassName=szClassName, wc.lpfnWndProc=fnWndProc;
wc.cbSize=sizeof (WNDCLASSEX), wc.style=CS_DBLCLKS;
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=8;
wc.lpszMenuName=NULL, wc.cbClsExtra=4;
RegisterClassEx(&wc);
_tcscpy(szCaption,_T("Try Typing Text, Moving Mouse, Clicking Left Mouse Button, Or Sizing Window!"));
for(unsigned i=0; i<4; i++)
{
hWnd=CreateWindowEx(0,szClassName,szCaption,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,325,300,0,0,hIns,0);
ShowWindow(hWnd,iShow);
}
while(GetMessage(&messages,NULL,0,0))
{
TranslateMessage(&messages);
DispatchMessage(&messages);
}
return messages.wParam;
}
//Header File For Above
//ProgEx39d.h
#ifndef ProgEx39d_h
#define ProgEx39d_h
#include <Windows.h>
#define dim(x) (sizeof(x) / sizeof(x[0]))
typedef struct WindowsEventArguments
{
HWND hWnd;
WPARAM wParam;
LPARAM lParam;
HINSTANCE hIns;
}WndEventArgs, *lpWndEventArgs;
long fnWndProc_OnCreate (lpWndEventArgs Wea);
long fnWndProc_OnSize (lpWndEventArgs Wea);
long fnWndProc_OnChar (lpWndEventArgs Wea);
long fnWndProc_OnMouseMove (lpWndEventArgs Wea);
long fnWndProc_OnLButtonDown (lpWndEventArgs Wea);
long fnWndProc_OnPaint (lpWndEventArgs Wea);
long fnWndProc_OnDestroy (lpWndEventArgs Wea);
struct EVENTHANDLER
{
unsigned int iMsg;
long (*fnPtr)(lpWndEventArgs);
};
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