Code:
//Main.cpp
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include "lpCreateParams.h"
#define Debug
#ifdef Debug
FILE* fp=NULL;
#endif
long fnGridProc_OnCreate(WndEventArgs& Wea)
{
MyCreateStruct* pMyCreateStruct=NULL;
CREATESTRUCT* pCreateStruct=NULL;
GridData* pGridData=NULL;
HANDLE hHeap=NULL;
#ifdef Debug
fprintf(fp," Entering fnGridProc_OnCreate()\n");
fprintf(fp," Wea.hWnd = %Iu\n",(size_t)Wea.hWnd);
#endif
pCreateStruct=(CREATESTRUCT*)Wea.lParam;
Wea.hIns=pCreateStruct->hInstance;
hHeap=GetProcessHeap();
pMyCreateStruct=(MyCreateStruct*)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,sizeof(MyCreateStruct));
if(pMyCreateStruct)
{
pGridData=(GridData*)pCreateStruct->lpCreateParams;
pMyCreateStruct->GrdDta.iRows = pGridData->iRows;
pMyCreateStruct->GrdDta.iCols = pGridData->iCols;
pMyCreateStruct->hInstance = pCreateStruct->hInstance;
pMyCreateStruct->hMenu = pCreateStruct->hMenu;
pMyCreateStruct->hwndParent = pCreateStruct->hwndParent;
pMyCreateStruct->cy = pCreateStruct->cy;
pMyCreateStruct->cx = pCreateStruct->cx;
pMyCreateStruct->y = pCreateStruct->y;
pMyCreateStruct->x = pCreateStruct->x;
pMyCreateStruct->style = pCreateStruct->style;
pMyCreateStruct->dwExStyle = pCreateStruct->dwExStyle;
_tcscpy(pMyCreateStruct->szCaption,pCreateStruct->lpszName);
_tcscpy(pMyCreateStruct->szClassName,pCreateStruct->lpszClass);
SetWindowLongPtr(Wea.hWnd,0,(LONG_PTR)pMyCreateStruct);
#ifdef Debug
fprintf(fp," pMyCreateStruct->GrdDta.iRows = %d\n",pMyCreateStruct->GrdDta.iRows);
fprintf(fp," pMyCreateStruct->GrdDta.iCols = %d\n",pMyCreateStruct->GrdDta.iCols);
fprintf(fp," pCreateStruct = %Iu\n",(size_t)pCreateStruct);
fprintf(fp," pMyCreateStruct = %Iu\n",(size_t)pMyCreateStruct);
fprintf(fp," pCreateStruct->lpszName = %s\n",pCreateStruct->lpszName);
#endif
}
#ifdef Debug
fprintf(fp," Leaving fnGridProc_OnCreate()\n");
#endif
return 0;
}
long fnGridProc_OnPaint(WndEventArgs& Wea)
{
MyCreateStruct* pMyCreateStruct=NULL;
TCHAR szBuffer[80], szTmp[24];
HFONT hFont=NULL;
HFONT hTmp=NULL;
PAINTSTRUCT ps;
int iBkGround;
HDC hDC=NULL;
#ifdef Debug
fprintf(fp," Entering fnGridProc_OnPaint()\n");
fprintf(fp," Wea.hWnd = %Iu\n",(size_t)Wea.hWnd);
#endif
hDC=BeginPaint(Wea.hWnd,&ps);
iBkGround=SetBkMode(hDC,TRANSPARENT);
pMyCreateStruct=(MyCreateStruct*)GetWindowLongPtr(Wea.hWnd,0);
if(pMyCreateStruct)
{
hFont=CreateFont(14,0,0,0,FW_HEAVY,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,PROOF_QUALITY,DEFAULT_PITCH,"Lucida Console");
if(hFont)
{
hTmp=(HFONT)SelectObject(hDC,hFont);
_tcscpy(szBuffer,_T("pMyCreateStruct->GrdDta.iRows = ")); // GridData::iRows
_stprintf(szTmp,_T("%d"),pMyCreateStruct->GrdDta.iRows);
_tcscat(szBuffer,szTmp);
TextOut(hDC,0,0,szBuffer,_tcslen(szBuffer));
_tcscpy(szBuffer,_T("pMyCreateStruct->GrdDta.iCols = ")); // GridData::iCols
_stprintf(szTmp,_T("%d"),pMyCreateStruct->GrdDta.iCols);
_tcscat(szBuffer,szTmp);
TextOut(hDC,0,20,szBuffer,_tcslen(szBuffer));
_tcscpy(szBuffer,_T("pMyCreateStruct->hInstance = ")); // pCreateStruct->hInstance
_stprintf(szTmp,_T("%Iu"),(size_t)pMyCreateStruct->hInstance);
_tcscat(szBuffer,szTmp);
TextOut(hDC,0,40,szBuffer,_tcslen(szBuffer));
_tcscpy(szBuffer,_T("pMyCreateStruct->hMenu = ")); // pCreateStruct->hMenu
_stprintf(szTmp,_T("%Iu"),(size_t)pMyCreateStruct->hMenu);
_tcscat(szBuffer,szTmp);
TextOut(hDC,0,60,szBuffer,_tcslen(szBuffer));
_tcscpy(szBuffer,_T("pMyCreateStruct->hParent = ")); // pCreateStruct->hwndParent
_stprintf(szTmp,_T("%Iu"),(size_t)pMyCreateStruct->hwndParent);
_tcscat(szBuffer,szTmp);
TextOut(hDC,0,80,szBuffer,_tcslen(szBuffer));
_tcscpy(szBuffer,_T("pMyCreateStruct->cy = ")); // pCreateStruct->cy
_stprintf(szTmp,_T("%d"),pMyCreateStruct->cy);
_tcscat(szBuffer,szTmp);
TextOut(hDC,0,100,szBuffer,_tcslen(szBuffer));
_tcscpy(szBuffer,_T("pMyCreateStruct->cx = ")); // pCreateStruct->cx
_stprintf(szTmp,_T("%d"),pMyCreateStruct->cx);
_tcscat(szBuffer,szTmp);
TextOut(hDC,0,120,szBuffer,_tcslen(szBuffer));
_tcscpy(szBuffer,_T("pMyCreateStruct->y = ")); // pCreateStruct->y
_stprintf(szTmp,_T("%d"),pMyCreateStruct->y);
_tcscat(szBuffer,szTmp);
TextOut(hDC,0,140,szBuffer,_tcslen(szBuffer));
_tcscpy(szBuffer,_T("pMyCreateStruct->x = ")); // pCreateStruct->x
_stprintf(szTmp,_T("%d"),pMyCreateStruct->x);
_tcscat(szBuffer,szTmp);
TextOut(hDC,0,160,szBuffer,_tcslen(szBuffer));
_tcscpy(szBuffer,_T("pMyCreateStruct->style = ")); // pCreateStruct->style
_stprintf(szTmp,_T("%d"),(int)pMyCreateStruct->style);
_tcscat(szBuffer,szTmp);
TextOut(hDC,0,180,szBuffer,_tcslen(szBuffer));
_tcscpy(szBuffer,_T("pMyCreateStruct->szCaption = "));
_tcscat(szBuffer,pMyCreateStruct->szCaption);
TextOut(hDC,0,200,szBuffer,_tcslen(szBuffer));
_tcscpy(szBuffer,_T("pMyCreateStruct->szClassName = "));
_tcscat(szBuffer,pMyCreateStruct->szClassName);
TextOut(hDC,0,220,szBuffer,_tcslen(szBuffer));
SelectObject(hDC,hTmp);
DeleteObject(hFont);
}
}
SetBkMode(hDC,iBkGround);
EndPaint(Wea.hWnd,&ps);
#ifdef Debug
fprintf(fp," Leaving fnGridProc_OnPaint()\n\n");
#endif
return 0;
}
long fnGridProc_OnDestroy(WndEventArgs& Wea)
{
MyCreateStruct* pMyCreateStruct=NULL;
#ifdef Debug
fprintf(fp," Entering fnGridProc_OnDestroy()\n");
fprintf(fp," Wea.hWnd = %Iu\n",(size_t)Wea.hWnd);
#endif
pMyCreateStruct=(MyCreateStruct*)GetWindowLongPtr(Wea.hWnd,0);
if(pMyCreateStruct)
{
#ifdef Debug
BOOL blnFree=HeapFree(GetProcessHeap(),0,pMyCreateStruct);
fprintf(fp," blnFree = %d\n",blnFree);
#else
HeapFree(GetProcessHeap(),0,pMyCreateStruct);
#endif
}
#ifdef Debug
fprintf(fp," Leaving fnGridProc_OnDestroy()\n");
#endif
return 0;
}
LRESULT CALLBACK fnGridProc(HWND hwnd, unsigned int msg, WPARAM wParam, LPARAM lParam)
{
WndEventArgs Wea;
for(unsigned int i=0; i<dim(GridEventHandler); i++)
{
if(GridEventHandler[i].iMsg==msg)
{
Wea.hWnd=hwnd, Wea.lParam=lParam, Wea.wParam=wParam;
return (*GridEventHandler[i].fnPtr)(Wea);
}
}
return (DefWindowProc(hwnd, msg, wParam, lParam));
}
long fnWndProc_OnCreate(WndEventArgs& Wea)
{
TCHAR szClassName[]=_T("Grid");
HWND hGrid=NULL;
WNDCLASSEX wc;
GridData gd;
#ifdef Debug
fprintf(fp," Entering fnWndProc_OnCreate()\n");
fprintf(fp," Wea.hWnd = %Iu\n",(size_t)Wea.hWnd);
#endif
Wea.hIns=((LPCREATESTRUCT)Wea.lParam)->hInstance;
memset(&wc,0,sizeof(wc));
wc.lpszClassName=szClassName; wc.lpfnWndProc=fnGridProc;
wc.cbSize=sizeof (WNDCLASSEX); wc.style=0;
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION); wc.hInstance=Wea.hIns;
wc.hIconSm=LoadIcon(NULL, IDI_APPLICATION); wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)GetStockObject(LTGRAY_BRUSH); wc.cbWndExtra=sizeof(void*);
wc.lpszMenuName=NULL; wc.cbClsExtra=0;
RegisterClassEx(&wc);
gd.iRows = 15;
gd.iCols = 6;
#ifdef Debug
fprintf(fp," &gd = %p\n",&gd);
#endif
hGrid=CreateWindowEx(WS_EX_CLIENTEDGE,szClassName,_T("Text For A Grid Or Whatever"),WS_CHILD|WS_VISIBLE,15,15,575,375,Wea.hWnd,(HMENU)IDC_GRID,Wea.hIns,&gd);
#ifdef Debug
fprintf(fp," hGrid = %Iu\n",(size_t)hGrid);
fprintf(fp," Leaving fnWndProc_OnCreate()\n\n");
#endif
return 0;
}
long fnWndProc_OnDestroy(WndEventArgs& Wea)
{
#ifdef Debug
fprintf(fp," Entering fnWndProc_OnDestroy()\n");
fprintf(fp," Wea.hWnd = %Iu\n",(size_t)Wea.hWnd);
#endif
PostQuitMessage(0);
#ifdef Debug
fprintf(fp," Leaving fnWndProc_OnDestroy()\n\n");
#endif
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 hInstance, HINSTANCE hPrevIns, LPSTR lpszArgument, int iShow)
{
TCHAR szClassName[]=_T("lpCreateParams Demo");
WNDCLASSEX wc;
MSG messages;
HWND hWnd;
#ifdef Debug
fp=fopen("Output.txt","w");
fprintf(fp,"Entering WinMain()\n");
fprintf(fp," hInstance = %Iu\n",(size_t)hInstance);
#endif
wc.lpszClassName=szClassName; wc.lpfnWndProc=fnWndProc;
wc.cbSize=sizeof (WNDCLASSEX); wc.style=0;
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION); wc.hInstance=hInstance;
wc.hIconSm=LoadIcon(NULL, IDI_APPLICATION); wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)COLOR_BTNSHADOW; wc.cbWndExtra=0;
wc.lpszMenuName=NULL; wc.cbClsExtra=0;
RegisterClassEx(&wc);
#ifdef Debug
fprintf(fp," Right Before CreateWindowEx() Call In WinMain()\n");
#endif
hWnd=CreateWindowEx(0,szClassName,szClassName,WS_OVERLAPPEDWINDOW,75,75,625,450,HWND_DESKTOP,0,hInstance,0);
#ifdef Debug
fprintf(fp," hWnd = %Iu\n",(size_t)hWnd);
fprintf(fp," Right After CreateWindowEx() Call In WinMain()\n");
#endif
ShowWindow(hWnd,iShow);
while(GetMessage(&messages,NULL,0,0))
{
TranslateMessage(&messages);
DispatchMessage(&messages);
}
#ifdef Debug
fprintf(fp,"Leaving WinMain()");
fclose(fp);
#endif
return messages.wParam;
}
If Debug is defined an output.txt log file is created, and here is what I got for a program run...