WinCode.cpp will have to be broken up. I'll try 1st half ...
#define UNICODE
#define _UNICODE
#include <windows.h>
#include <commctrl.h>
#include <objbase.h>
#include <ocidl.h>
#include <olectl.h>
#include <cstdio>
#include <tchar.h>
#include "Strings.h"
#include "Grid.h"
#include "WinCode.h"
//#define MYDEBUG
#if defined MYDEBUG
extern FILE* fp;
#endif
WNDPROC fnEditWndProc; // edit control subclass
long fnGridProc_OnCreate(lpWndEventArgs Wea)
{
int iEndRectHt,iHalf,iRemainder,iDifference,iNewGridHt;
int iCols=0,iFlds=0,iHdlCount=0,iCtr=0,iSize=0;
CREATESTRUCT* pCreateStruct=NULL;
GridData* pGridData1=NULL;
GridData* pGridData2=NULL;
String* strParseData;
HANDLE hHeap=NULL;
TCHAR szText[64];
String strSetup;
HDITEM hdrItem;
DWORD dwStyle;
HWND hCell;
HDC hDC;
RECT rc;
#if defined MYDEBUG
_ftprintf(fp,_T(" Entering fnGridProc_OnCreate()\n"));
#endif
pCreateStruct=(CREATESTRUCT*)Wea->lParam;
Wea->hIns=pCreateStruct->hInstance;
pGridData1=(GridData*)pCreateStruct->lpCreateParams;
strSetup=(TCHAR*)pCreateStruct->lpszName;
#if defined MYDEBUG
_ftprintf(fp,_T(" Wea->hWnd = %u\n"),Wea->hWnd);
_ftprintf(fp,_T(" pCreateStruct = %u\n"),pCreateStruct);
_ftprintf(fp,_T(" pGridData1 = %u\n"),pGridData1);
_ftprintf(fp,_T(" strSetup.lpStr() = %s\n"),strSetup.lpStr());
_ftprintf(fp,_T(" pCreateStruct->hwndParent = %u\n"),pCreateStruct->hwndParent);
_ftprintf(fp,_T(" pCreateStruct->x = %d\n"),pCreateStruct->x);
_ftprintf(fp,_T(" pCreateStruct->y = %d\n"),pCreateStruct->y);
_ftprintf(fp,_T(" pCreateStruct->cx = %d\n"),pCreateStruct->cx);
_ftprintf(fp,_T(" pCreateStruct->cy = %d\n"),pCreateStruct->cy);
_ftprintf(fp,_T(" pCreateStruct->hMenu = %u\n"),pCreateStruct->hMenu);
_ftprintf(fp,_T(" pGridData1->cx = %d\n"),pGridData1->cx);
_ftprintf(fp,_T(" pGridData1->iRows = %d\n"),pGridData1->iRows);
_ftprintf(fp,_T(" pGridData1->iCols = %d\n"),pGridData1->iCols);
_ftprintf(fp,_T(" pGridData1->iRowHeight = %d\n"),pGridData1->iRowHeight);
_ftprintf(fp,_T(" pGridData1->szFontName = %s\n"),pGridData1->szFontName);
_ftprintf(fp,_T(" pGridData1->iFontSize = %d\n"),pGridData1->iFontSize);
_ftprintf(fp,_T(" pGridData1->iFontWeight = %d\n"),pGridData1->iFontWeight);
#endif
pGridData1->hGrid=Wea->hWnd;
GetClientRect(Wea->hWnd,&rc);
iCols=strSetup.ParseCount(_T(','));
#if defined MYDEBUG
_ftprintf(fp,_T(" rc.left = %d\n"),rc.left);
_ftprintf(fp,_T(" rc.top = %d\n"),rc.top);
_ftprintf(fp,_T(" rc.right = %d\n"),rc.right);
_ftprintf(fp,_T(" rc.bottom = %d\n"),rc.bottom);
_ftprintf(fp,_T(" iCols = %d\n"),iCols);
#endif
if(iCols!=pGridData1->iCols)
return -1;
hHeap=GetProcessHeap();
if(!hHeap)
return -1;
pGridData2=(GridData*)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,sizeof(GridData));
if(!pGridData2)
return -1;
SetWindowLongPtr(Wea->hWnd,0,(LONG_PTR)pGridData2);
pGridData1->blnRowSelected=FALSE;
#if defined MYDEBUG
_ftprintf(fp,_T(" pGridData2 = %u\n"),pGridData2);
#endif
memcpy(pGridData2,pGridData1,sizeof(GridData));
iNewGridHt=pCreateStruct->cy;
iHalf=pGridData2->iRowHeight/2;
iRemainder=rc.bottom % pGridData2->iRowHeight;
#ifdef MYDEBUG
_ftprintf(fp,_T(" iNewGridHt = %d\n"),iNewGridHt);
_ftprintf(fp,_T(" pGridData2->iRowHeight = %d\n"),pGridData2->iRowHeight);
_ftprintf(fp,_T(" iHalf = %d\n"),iHalf);
_ftprintf(fp,_T(" iRemainder = %d\n"),iRemainder);
#endif
if(iRemainder>=iHalf)
{
iDifference=pGridData2->iRowHeight-iRemainder;
iEndRectHt=rc.bottom+(pGridData2->iRowHeight-iRemainder);
}
else
{
iDifference=-iRemainder;
iEndRectHt=rc.bottom-iRemainder;
}
iNewGridHt=iNewGridHt+iDifference;
#ifdef MYDEBUG
_ftprintf(fp,_T(" iEndRectHt = %d\n"),iEndRectHt);
_ftprintf(fp,_T(" iDifference = %d\n"),iDifference);
_ftprintf(fp,_T(" iNewGridHt = %d\n"),iNewGridHt);
#endif
pGridData2->iVisibleRows=(iEndRectHt-pGridData2->iRowHeight)/pGridData2->iRowHeight;
if(pGridData2->iRows<pGridData2->iVisibleRows)
pGridData2->iRows=pGridData2->iVisibleRows+1;
pGridData2->iPaneHeight=(pGridData2->iVisibleRows+1)*pGridData2->iRowHeight;
#if defined MYDEBUG
_ftprintf(fp,_T(" pGridData2->hParent = %u\n"),pGridData2->hParent);
_ftprintf(fp,_T(" pGridData2->hGrid = %u\n"),pGridData2->hGrid);
_ftprintf(fp,_T(" pGridData2->iCtrlId = %d\n"),pGridData2->iCtrlId);
_ftprintf(fp,_T(" pGridData2->cx = %u\n"),pGridData2->cx);
_ftprintf(fp,_T(" pGridData2->cy = %u\n"),pGridData2->cy);
_ftprintf(fp,_T(" pGridData2->iRows = %d\n"),pGridData2->iRows);
_ftprintf(fp,_T(" pGridData2->iCols = %d\n"),pGridData2->iCols);
_ftprintf(fp,_T(" pGridData2->iRowHeight = %d\n"),pGridData2->iRowHeight);
_ftprintf(fp,_T(" pGridData2->szFontName = %s\n"),pGridData2->szFontName);
_ftprintf(fp,_T(" pGridData2->iFontSize = %d\n"),pGridData2->iFontSize);
_ftprintf(fp,_T(" pGridData2->iFontWeight = %d\n"),pGridData2->iFontWeight);
_ftprintf(fp,_T(" pGridData2->iVisibleRows = %d\n"),pGridData2->iVisibleRows);
_ftprintf(fp,_T(" pGridData2->iPaneHeight = %d\n"),pGridData2->iPaneHeight);
_ftprintf(fp,_T(" pGridData2->blnRowSelected = %d\n\n"),pGridData2->blnRowSelected);
_ftprintf(fp,_T(" i strParseData(i) \n"));
_ftprintf(fp,_T(" ============================\n"));
#endif
strParseData=new String[iCols];
strSetup.Parse(strParseData,_T(','));
for(unsigned int i=0; i<iCols; i++)
{
strParseData[i].Trim();
#if defined MYDEBUG
_ftprintf(fp,_T(" %d\t%s\n"),i,strParseData[i].lpStr());
#endif
}
pGridData2->pColWidths=(DWORD*)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,sizeof(DWORD)*(iCols+1));
if(!pGridData2->pColWidths)
goto CleanUp;
#if defined MYDEBUG
_ftprintf(fp,_T("\n pGridData2->pColWidths = %u\n"),pGridData2->pColWidths);
#endif
pGridData2->hBase=CreateWindowEx(0,_T("Base"),_T(""),WS_CHILD|WS_VISIBLE,0,0,0,0,Wea->hWnd,(HMENU)1499,Wea->hIns,0);
pGridData2->hPane=CreateWindowEx(0,_T("Pane"),_T(""),WS_CHILD|WS_VISIBLE,0,0,0,0,pGridData2->hBase,(HMENU)ID_PANE,Wea->hIns,0);
dwStyle=WS_CHILD | WS_BORDER | WS_VISIBLE | HDS_HOTTRACK | HDS_HORZ;
pGridData2->hHeader=CreateWindowEx(0,WC_HEADER,_T(""),dwStyle,0,0,0,0,pGridData2->hPane,(HMENU)ID_HEADER,Wea->hIns,0);
#if defined MYDEBUG
_ftprintf(fp,_T(" pGridData2->hBase = %u\n"),pGridData2->hBase);
_ftprintf(fp,_T(" pGridData2->hPane = %u\n"),pGridData2->hPane);
_ftprintf(fp,_T(" pGridData2->hHeader = %u\n"),pGridData2->hHeader);
_ftprintf(fp,_T(" HDF_LEFT = %d\n"),HDF_LEFT);
_ftprintf(fp,_T(" HDF_CENTER = %d\n"),HDF_CENTER);
_ftprintf(fp,_T(" HDF_RIGHT = %d\n\n"),HDF_RIGHT);
#endif
SetWindowLongPtr(pGridData2->hPane,0,(LONG_PTR)pGridData2);
pGridData2->pCellCtrlTypes=(DWORD*)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,iCols*sizeof(DWORD)); // no extra bytes allocated here, so its zero based
if(!pGridData2->pCellCtrlTypes)
goto CleanUp;
pGridData2->pCtrlHdls=(HWND*)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,iCols*sizeof(HWND*)); // no extra bytes allocated here either, so its zero based
if(!pGridData2->pCtrlHdls)
goto CleanUp;
hdrItem.mask=HDI_FORMAT | HDI_WIDTH | HDI_TEXT;
#if defined MYDEBUG
_ftprintf(fp,_T(" i\tstrFieldData[0]\tpGridData2->pColWidths[i]\tstrFieldData[1]\tstrFieldData[2]\tstrFieldData[3]\tpPos[i]\t\tpGridData2->pCellCtrlTypes[i]\n"));
_ftprintf(fp,_T(" ============================================================================================================================================\n"));
#endif
int* pPos=(int*)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,iCols*sizeof(int)); // and no extra bytes allocated here
if(!pPos)
goto CleanUp;
pGridData2->pColWidths[iCols]=0;
for(unsigned int i=0; i<iCols; i++)
{
iFlds=strParseData[i].ParseCount(_T(':'));
String* strFieldData=new String[iFlds];
strParseData[i].Parse(strFieldData,_T(':'));
pGridData2->pColWidths[i]=(DWORD)strFieldData[0].iVal();
pGridData2->pColWidths[iCols]=pGridData2->pColWidths[iCols]+pGridData2->pColWidths[i];
hdrItem.cxy=pGridData2->pColWidths[i];
_tcscpy(szText,strFieldData[1].lpStr()); // here's the line that's crashing it!!!!!!!!!!!!!!!!!!!!
hdrItem.pszText=szText;
hdrItem.cchTextMax=_tcslen(szText);
hdrItem.fmt=0;
if(strFieldData[2]==_T("<"))
hdrItem.fmt=HDF_LEFT;
else
{
if(strFieldData[2]==_T("^"))
hdrItem.fmt=HDF_CENTER;
else
hdrItem.fmt=HDF_RIGHT;
}
hdrItem.fmt=hdrItem.fmt|HDF_STRING;
Header_InsertItem(pGridData2->hHeader,i,&hdrItem);
if(i)
pPos[i]=pPos[i-1]+pGridData2->pColWidths[i-1];
if(strFieldData[3]==_T("none"))
pGridData2->pCellCtrlTypes[i]=0;
else
{
if(strFieldData[3]==_T("edit"))
pGridData2->pCellCtrlTypes[i]=1;
else
{
if(strFieldData[3]==_T("combo"))
pGridData2->pCellCtrlTypes[i]=2;
if(strFieldData[3]==_T("check"))
pGridData2->pCellCtrlTypes[i]=0;
}
}
#if defined MYDEBUG
_ftprintf
(
fp,
_T(" %d\t%s\t\t%u\t\t\t\t%s\t%s\t\t%s\t\t%d\t\t%u\n"),
i,strFieldData[0].lpStr(),pGridData2->pColWidths[i],strFieldData[1].lpStr(),strFieldData[2].lpStr(),strFieldData[3].lpStr(),pPos[i],pGridData2->pCellCtrlTypes[i]
);
#endif
delete [] strFieldData;
}
#if defined MYDEBUG
_ftprintf(fp,_T("\n"));
_ftprintf(fp,_T(" iCols = %u\n\n"),iCols);
_ftprintf(fp,_T(" i\tpGridData2->pColWidths[i]\n"));
_ftprintf(fp,_T(" ================================\n"));
for(unsigned int i=0; i<=iCols; i++)
_ftprintf(fp,_T(" %u\t\t%u\n"),i,pGridData2->pColWidths[i]);
_ftprintf(fp,_T("\n"));
_ftprintf(fp,_T(" i\tpGridData2->pCtrlHdls[i]\n"));
_ftprintf(fp,_T(" ==================================\n"));
#endif
int blnEditCreated = 0;
int iCboCtr = 0;
for(unsigned int i=0; i<iCols; i++)
{
// Edit Control In Column
if(pGridData2->pCellCtrlTypes[i]==GRID_CELL_CTRL_EDIT)
{
if(blnEditCreated==FALSE)
{
dwStyle = WS_CHILD | ES_AUTOHSCROLL;
pGridData2->pCtrlHdls[i]=CreateWindowEx(0,_T("edit"),_T(""),dwStyle,0,0,0,0,Wea->hWnd,(HMENU)IDC_EDIT,Wea->hIns,0);
pGridData2->hCtrlInCell=pGridData2->pCtrlHdls[i];
blnEditCreated=TRUE;
}
else
{
pGridData2->pCtrlHdls[i]=pGridData2->hCtrlInCell;
}
}
// Combo Box In Column
if(pGridData2->pCellCtrlTypes[i]==GRID_CELL_CTRL_COMBO)
{
dwStyle=WS_CHILD | CBS_DROPDOWNLIST | WS_VSCROLL; //Or %CBS_NOINTEGRALHEIGHT
pGridData2->pCtrlHdls[i]=CreateWindowEx(0,_T("combobox"),_T(""),dwStyle,0,0,0,0,Wea->hWnd,(HMENU)(IDC_COMBO+iCboCtr),Wea->hIns,0);
iCboCtr++;
}
#if defined MYDEBUG
_ftprintf(fp,_T(" %u\t\t%u\n"),i,pGridData2->pCtrlHdls[i]);
#endif
}
pGridData2->hCtrlInCell=0; // DANGER!!!!!! Addition! I don't know why this needes to be initially set?
#if defined MYDEBUG
_ftprintf(fp,_T("\n"));
_ftprintf(fp,_T(" pGridData2->pColWidths[iCols] = %d\n"),pGridData2->pColWidths[iCols]);
_ftprintf(fp,_T("\n"));
#endif
MoveWindow(Wea->hWnd,pCreateStruct->x,pCreateStruct->y,pCreateStruct->cx,iNewGridHt,FALSE);
MoveWindow(pGridData2->hBase,12,0,rc.right-12,pGridData2->iPaneHeight,FALSE);
MoveWindow(pGridData2->hPane,0,0,pGridData2->pColWidths[iCols],pGridData2->iPaneHeight,FALSE);
MoveWindow(pGridData2->hHeader,0,0,pGridData2->pColWidths[iCols],pGridData2->iRowHeight,TRUE);
delete [] strParseData;
pGridData2->pVButtons=(HWND*)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,(pGridData2->iVisibleRows+1)*sizeof(void*));
#if defined MYDEBUG
_ftprintf(fp,_T(" pGridData2->pVButtons = %u\n\n"),pGridData2->pVButtons);
_ftprintf(fp,_T(" i\tpGridData2->pVButtons[i]\n"));
_ftprintf(fp,_T(" ===================================\n"));
#endif
if(!pGridData2->pVButtons)
goto CleanUp;
else
{
for(unsigned int i=0; i<=pGridData2->iVisibleRows; i++)
{
pGridData2->pVButtons[i]=CreateWindowEx(0,_T("button"),_T(""),WS_CHILD|WS_VISIBLE|BS_FLAT,0,pGridData2->iRowHeight*i,12,pGridData2->iRowHeight,Wea->hWnd,(HMENU)(20000+i),Wea->hIns,0);
#if defined MYDEBUG
_ftprintf(fp,_T(" %u\t%u\n"),i,pGridData2->pVButtons[i]);
#endif
}
}
// Now gonna try to create font ...
#if defined MYDEBUG
_ftprintf(fp,_T("\n Now Gonna Try To Create Font...\n"));
_ftprintf(fp,_T(" pGridData2->szFontName = %s\n"),pGridData2->szFontName);
#endif
if(pGridData2->szFontName)
{
hDC=GetDC(Wea->hWnd);
pGridData2->hFont=CreateFont(-1*(pGridData2->iFontSize*GetDeviceCaps(hDC,LOGPIXELSY))/72,0,0,0,pGridData2->iFontWeight,0,0,0,ANSI_CHARSET,0,0,DEFAULT_QUALITY,0,pGridData2->szFontName);
#if defined MYDEBUG
_ftprintf(fp,_T(" pGridData2->hFont = %u\n\n"),pGridData2->hFont);
#endif
ReleaseDC(Wea->hWnd,hDC);
}
else
goto CleanUp;
iHdlCount=pGridData2->iCols*pGridData2->iVisibleRows;
pGridData2->pCellHandles=(HWND*)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,iHdlCount*sizeof(void*));
#if defined MYDEBUG
_ftprintf(fp,_T(" iCols = %d\n"),iCols);
_ftprintf(fp,_T(" pGridData2->iCols = %u\n"),pGridData2->iCols);
_ftprintf(fp,_T(" iHdlCount = %d\n"),iHdlCount);
_ftprintf(fp,_T(" pGridData2->pCellHandles = %u\n"),pGridData2->pCellHandles);
#endif
if(!pGridData2->pCellHandles)
goto CleanUp;
dwStyle=WS_CHILD | WS_VISIBLE | WS_BORDER;
#if defined MYDEBUG
_ftprintf(fp,_T("\n"));
_ftprintf(fp,_T(" i\t\tj\tiPos(j)\tyLoc\thCell\n"));
_ftprintf(fp,_T(" =============================================================\n"));
#endif
for(int i=0; i<pGridData2->iVisibleRows; i++)
{
for(int j=0; j<pGridData2->iCols; j++)
{
hCell=CreateWindowEx(0,_T("Cell"),_T(""),dwStyle,pPos[j],pGridData2->iRowHeight+(i*pGridData2->iRowHeight),pGridData2->pColWidths[j],pGridData2->iRowHeight,pGridData2->hPane,(HMENU)(ID_CELL+iCtr),Wea->hIns,0);
pGridData2->pCellHandles[iCtr]=hCell;
SetWindowLongPtr(hCell,sizeof(void*),(LONG_PTR)pGridData2->hFont); // 4 for 32 bit; 8 for 64 bit
#if defined MYDEBUG
_ftprintf(fp,_T(" %d\t\t%d\t%u\t%d\t%u\n"),i,j,pPos[j],pGridData2->iRowHeight+(i*pGridData2->iRowHeight),hCell);
#endif
iCtr++;
}
}
// grid memory
iSize=pGridData2->iCols*pGridData2->iRows;
pGridData2->pGridMemory=(TCHAR**)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,iSize*sizeof(void*));
if(!pGridData2->pGridMemory)
goto CleanUp;
pGridData2->pTextColor=(COLORREF*)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,iSize*sizeof(void*));
if(!pGridData2->pTextColor)
goto CleanUp;
pGridData2->pBackColor=(HBRUSH*)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,iSize*sizeof(void*));
if(!pGridData2->pBackColor)
goto CleanUp;
pGridData2->pCreatedColors=(COLORREF*)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,(MAX_COLORS+1)*sizeof(void*));
if(!pGridData2->pCreatedColors)
goto CleanUp;
pGridData2->pCreatedBrushes=(HBRUSH*)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,(MAX_COLORS+1)*sizeof(void*));
if(!pGridData2->pCreatedBrushes)
goto CleanUp;
#ifdef MYDEBUG
_ftprintf(fp,_T(" iSize = %d\n"),iSize);
_ftprintf(fp,_T(" pGridData2->pGridMemory = %u\n"),pGridData2->pGridMemory);
#endif
//Done
if(pPos)
HeapFree(hHeap,0,pPos);
#if defined MYDEBUG
_ftprintf(fp,_T(" Everything Allocated OK!\n"));
_ftprintf(fp,_T(" Leaving fnGridProc_OnCreate()\n\n"));
#endif
return 0;
CleanUp:
if(pGridData2->pColWidths)
{
HeapFree(hHeap,0,pGridData2->pColWidths);
pGridData2->pColWidths=NULL;
}
if(pGridData2->pCellCtrlTypes)
{
HeapFree(hHeap,0,pGridData2->pCellCtrlTypes);
pGridData2->pCellCtrlTypes=NULL;
}
if(pGridData2->pCtrlHdls)
{
HeapFree(hHeap,0,pGridData2->pCtrlHdls);
pGridData2->pCtrlHdls=NULL;
}
if(pPos)
HeapFree(hHeap,0,pPos);
if(pGridData2->pVButtons)
{
HeapFree(hHeap,0,pGridData2->pVButtons);
pGridData2->pVButtons=NULL;
}
if(pGridData2->hFont)
DeleteObject(pGridData2->hFont);
if(pGridData2->pCellHandles)
HeapFree(hHeap,0,pGridData2->pCellHandles);
if(pGridData2->pGridMemory)
HeapFree(hHeap,0,pGridData2->pGridMemory);
if(pGridData2->pTextColor)
HeapFree(hHeap,0,pGridData2->pTextColor);
if(pGridData2->pBackColor)
HeapFree(hHeap,0,pGridData2->pBackColor);
if(pGridData2->pCreatedColors)
HeapFree(hHeap,0,pGridData2->pCreatedColors);
if(pGridData2->pCreatedBrushes)
HeapFree(hHeap,0,pGridData2->pCreatedBrushes);
#if defined MYDEBUG
_ftprintf(fp,_T(" Leaving fnGridProc_OnCreate()\n\n"));
#endif
return 0;
}
long fnGridProc_OnSize(lpWndEventArgs Wea)
{
GridData* pGridData=NULL;
SCROLLINFO si;
int iCols;
#if defined MYDEBUG
_ftprintf(fp,_T(" Entering fnGridProc_OnSize()\n"));
_ftprintf(fp,_T(" Wea->hWnd = %u\n"),Wea->hWnd);
#endif
pGridData=(GridData*)GetWindowLongPtr(Wea->hWnd,0);
iCols=pGridData->iCols;
#ifdef MYDEBUG
_ftprintf(fp,_T(" pGridData = %u\n"),pGridData);
_ftprintf(fp,_T(" iCols = %d\n"),iCols);
#endif
//Set Up Horizontal Scrollbar
ZeroMemory(&si, sizeof(SCROLLINFO));
si.cbSize = sizeof(SCROLLINFO);
si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS | SIF_DISABLENOSCROLL;
si.nMin = 0;
si.nMax = pGridData->pColWidths[iCols];
si.nPage = pGridData->cx-33; // 33 is the width of vert
si.nPos = 0; // btns + width scroll bar + window edge
SetScrollInfo(Wea->hWnd,SB_HORZ,&si,TRUE);
#ifdef MYDEBUG
_ftprintf(fp,_T(" Horizontal Scrollbar....\n"));
_ftprintf(fp,_T(" si.nMin = %d\n"),si.nMin);
_ftprintf(fp,_T(" si.nMax = %d\n"),si.nMax);
_ftprintf(fp,_T(" si.nPos = %d\n"),si.nPos);
#endif
//Set Up Verticle Scrollbar
ZeroMemory(&si, sizeof(SCROLLINFO));
si.cbSize = sizeof(SCROLLINFO);
si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS;
si.nMin = 1;
si.nMax = pGridData->iRows;
si.nPage = pGridData->iVisibleRows;
si.nPos = 1;
SetScrollInfo(Wea->hWnd,SB_VERT,&si,TRUE);
#ifdef MYDEBUG
_ftprintf(fp,_T(" Verticle Scrollbar....\n"));
_ftprintf(fp,_T(" si.nMin = %d\n"), si.nMin);
_ftprintf(fp,_T(" si.nMax = %d\n"), si.nMax);
_ftprintf(fp,_T(" si.nPos = %d\n"), si.nPos);
_ftprintf(fp,_T(" Leaving %WM_SIZE Case\n"));
_ftprintf(fp,_T(" Leaving fnGridProc_OnSize()\n\n"));
#endif
return 0;
}
long fnGridProc_OnHScroll(lpWndEventArgs Wea)
{
GridData* pGridData=NULL;
int iCols,iScrollPos;
SCROLLINFO si;
#if defined MYDEBUG
_ftprintf(fp,_T("Entering fnGridProc_OnHScroll()\n"));
_ftprintf(fp,_T(" Wea->hWnd = %u\n"),Wea->hWnd);
#endif
ZeroMemory(&si, sizeof(SCROLLINFO));
pGridData = (GridData*)GetWindowLongPtr(Wea->hWnd,0);
iCols = pGridData->iCols;
si.cbSize = sizeof(SCROLLINFO);
si.fMask = SIF_ALL;
GetScrollInfo(pGridData->hGrid,SB_HORZ,&si);
iScrollPos=si.nPos;
#ifdef MYDEBUG
_ftprintf(fp,_T(" Before Adjustments\n"));
_ftprintf(fp,_T(" si.nMin = %d\n"), si.nMin);
_ftprintf(fp,_T(" si.nMax = %d\n"), si.nMax);
_ftprintf(fp,_T(" si.nPos = %d\n"), si.nPos);
#endif
switch(LOWORD(Wea->wParam))
{
case SB_LINELEFT:
{
if(si.nPos > si.nMin)
si.nPos=si.nPos-50;
break;
}
case SB_PAGELEFT:
{
si.nPos = si.nPos - si.nPage;
break;
}
case SB_LINERIGHT:
{
if(si.nPos<si.nMax)
si.nPos=si.nPos+50;
break;
}
case SB_PAGERIGHT:
{
si.nPos = si.nPos + si.nPage;
break;
}
case SB_THUMBTRACK:
{
si.nPos=si.nTrackPos;
break;
}
}
si.fMask = SIF_POS;
SetScrollInfo(pGridData->hGrid,SB_HORZ,&si,TRUE);
GetScrollInfo(pGridData->hGrid,SB_HORZ,&si);
if(iScrollPos!=si.nPos)
{
if(si.nPos==0)
SetWindowPos(pGridData->hPane,HWND_TOP,0,0,pGridData->pColWidths[iCols],pGridData->iPaneHeight,SWP_SHOWWINDOW);
else
SetWindowPos(pGridData->hPane,HWND_TOP,-si.nPos,0,pGridData->pColWidths[iCols],pGridData->iPaneHeight,SWP_SHOWWINDOW);
}
#ifdef MYDEBUG
_ftprintf(fp,_T(" After All Adjustments\n"));
_ftprintf(fp,_T(" si.nMin = %d\n"),si.nMin);
_ftprintf(fp,_T(" si.nMax = %d\n"),si.nMax);
_ftprintf(fp,_T(" si.nPos = %d\n"),si.nPos);
_ftprintf(fp,_T(" Leaving %WM_HSCROLL Case\n"));
_ftprintf(fp,_T("Leaving fnGridProc_OnHScroll()\n\n"));
#endif
return 0;
}
long fnGridProc_OnVScroll(lpWndEventArgs Wea)
{
GridData* pGridData=NULL;
int iCols,iScrollPos;
SCROLLINFO si;
HWND hCell;
#if defined MYDEBUG
_ftprintf(fp,_T("Entering fnGridProc_OnVScroll()\n"));
_ftprintf(fp,_T(" Wea->hWnd = %u\n"),Wea->hWnd);
#endif
ZeroMemory(&si, sizeof(SCROLLINFO));
pGridData = (GridData*)GetWindowLongPtr(Wea->hWnd,0);
pGridData->pComObj->FlushData();
si.cbSize = sizeof(SCROLLINFO);
si.fMask = SIF_ALL;
GetScrollInfo(pGridData->hGrid,SB_VERT,&si);
iScrollPos=si.nPos;
#ifdef MYDEBUG
_ftprintf(fp,_T(" Before Adjustments\n"));
_ftprintf(fp,_T(" si.nMin = %d\n"), si.nMin);
_ftprintf(fp,_T(" si.nMax = %d\n"), si.nMax);
_ftprintf(fp,_T(" si.nPos = %d\n"), si.nPos);
_ftprintf(fp,_T(" pGridData->hGrid = %u\n"), pGridData->hGrid);
_ftprintf(fp,_T(" pGridData = %u\n"), pGridData);
#endif
switch(LOWORD(Wea->wParam)) // this originally didn't work
{
case SB_LINEUP:
{
if(si.nPos > si.nMin)
si.nPos=si.nPos-1;
break;
}
case SB_PAGEUP:
{
si.nPos = si.nPos - si.nPage;
break;
}
case SB_LINEDOWN:
{
if(si.nPos<si.nMax)
si.nPos=si.nPos+1;
break;
}
case SB_PAGEDOWN:
{
si.nPos = si.nPos + si.nPage;
break;
}
case SB_THUMBTRACK:
{
si.nPos=si.nTrackPos;
break;
}
}
si.fMask=SIF_POS;
SetScrollInfo(pGridData->hGrid,SB_VERT,&si,TRUE);
GetScrollInfo(pGridData->hGrid,SB_VERT,&si);
if(iScrollPos!=si.nPos)
{
int iNum,iLast;
iNum=pGridData->iCols*(si.nPos-1);
iLast=(pGridData->iCols * pGridData->iVisibleRows) - 1;
for(int i=0; i<=iLast; i++)
{
hCell=pGridData->pCellHandles[i];
SetWindowLongPtr(hCell,0,(LONG_PTR)pGridData->pGridMemory[iNum]);
SetWindowLongPtr(hCell,2*sizeof(void*),(LONG_PTR)pGridData->pTextColor[iNum]);
SetWindowLongPtr(hCell,3*sizeof(void*),(LONG_PTR)pGridData->pBackColor[iNum]);
iNum++;
}
}
InvalidateRect(pGridData->hGrid,NULL,TRUE);
#ifdef MYDEBUG
_ftprintf(fp,_T(" After All Adjustments\n"));
_ftprintf(fp,_T(" si.nMin = %d\n"),si.nMin);
_ftprintf(fp,_T(" si.nMax = %d\n"),si.nMax);
_ftprintf(fp,_T(" si.nPos = %d\n"),si.nPos);
_ftprintf(fp,_T(" Leaving %WM_VSCROLL Case\n"));
_ftprintf(fp,_T("Leaving fnGridProc_OnVScroll()\n\n"));
#endif
return 0;
}