// GridCtrlDemoDlg.cpp : implementation file
//
#include "stdafx.h"
#include "GridCtrlDemo.h"
#include "GridCtrlDemoDlg.h"
#include "NewCellTypes/GridURLCell.h"
#include "NewCellTypes/GridCellCombo.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#if defined(_WIN32_WCE) && (_WIN32_WCE <= 0x200)
#define MF_DISABLED 0
#define DT_END_ELLIPSIS 0
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg() : CDialog(IDD_ABOUTBOX) {}
};
/////////////////////////////////////////////////////////////////////////////
// CGridCtrlDemoDlg dialog
CGridCtrlDemoDlg::CGridCtrlDemoDlg(CWnd* pParent /*=NULL*/)
: CDialog(CGridCtrlDemoDlg::IDD, pParent)
{
m_OldSize = CSize(-1,-1);
//{{AFX_DATA_INIT(CGridCtrlDemoDlg)
m_nFixCols = 1;
m_nFixRows = 1;
m_nCols = 8;
m_nRows = 20;
m_bEditable = FALSE;
m_bHorzLines = FALSE;
m_bVertLines = FALSE;
m_bListMode = TRUE;
m_bHeaderSort = FALSE;
m_bSingleSelMode = TRUE;
m_bSingleColSelMode = TRUE;
m_bSelectable = FALSE;
m_bAllowColumnResize = FALSE;
m_bAllowRowResize = FALSE;
m_bItalics = FALSE;
m_btitleTips = FALSE;
m_bTrackFocus = FALSE;
m_bFrameFocus = FALSE;
m_bVirtualMode = TRUE;
m_bCallback = TRUE;
m_bVertical = TRUE;
//}}AFX_DATA_INIT
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CGridCtrlDemoDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CGridCtrlDemoDlg)
DDX_Control(pDX, IDC_GRID, m_Grid); // associate the grid window with a C++ object
DDX_Control(pDX, IDC_SPIN_ROW, m_RowSpin);
DDX_Control(pDX, IDC_SPIN_FIXROW, m_FixRowSpin);
DDX_Control(pDX, IDC_SPIN_FIXCOL, m_FixColSpin);
DDX_Control(pDX, IDC_SPIN_COL, m_ColSpin);
DDX_Text(pDX, IDC_EDIT_FIXCOLS, m_nFixCols);
DDX_Text(pDX, IDC_EDIT_FIXROWS, m_nFixRows);
DDX_Text(pDX, IDC_EDIT_COLS, m_nCols);
DDX_Text(pDX, IDC_EDIT_ROWS, m_nRows);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CGridCtrlDemoDlg, CDialog)
//{{AFX_MSG_MAP(CGridCtrlDemoDlg)
ON_WM_SYSCOMMAND()
ON_WM_QUERYDRAGICON()
ON_EN_UPDATE(IDC_EDIT_COLS, OnUpdateEditCols)
ON_EN_UPDATE(IDC_EDIT_FIXCOLS, OnUpdateEditFixcols)
ON_EN_UPDATE(IDC_EDIT_FIXROWS, OnUpdateEditFixrows)
ON_EN_UPDATE(IDC_EDIT_ROWS, OnUpdateEditRows)
ON_COMMAND(IDC_HORZ_LINES, OnHorzGridLines)
ON_COMMAND(IDC_VERT_LINES, OnVertGridLines)
ON_COMMAND(IDC_LISTMODE, OnListmode)
ON_COMMAND(IDC_EDITABLE, OnEditable)
ON_COMMAND(IDC_PRINT_BUTTON, OnPrintButton)
ON_COMMAND(IDC_ALLOW_SELECTION, OnAllowSelection)
ON_COMMAND(IDC_ROW_RESIZE, OnRowResize)
ON_COMMAND(IDC_COL_RESIZE, OnColResize)
ON_COMMAND(IDC_FONT_BUTTON, OnFontButton)
ON_WM_SIZE()
ON_COMMAND(IDC_HEADERSORT, OnHeaderSort)
ON_COMMAND(ID_EDIT_SELECTALL, OnEditSelectall)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
ON_COMMAND(IDC_ITALICS, OnItalics)
ON_COMMAND(IDC_TITLETIPS, OnTitletips)
ON_COMMAND(IDC_INSERT_ROW, OnInsertRow)
ON_COMMAND(IDC_DELETE_ROW, OnDeleteRow)
ON_COMMAND(IDC_SINGLESELMODE, OnSingleselmode)
ON_COMMAND(IDC_SINGLECOLSELMODE, OnSingleColMode)
ON_COMMAND(IDC_EXPAND_TO_FIT, OnExpandToFit)
ON_COMMAND(IDC_AUTO_SIZE, OnAutoSize)
ON_COMMAND(IDC_FILL, OnFill)
ON_BN_CLICKED(IDC_CELL_URL, OnCellUrl)
ON_BN_CLICKED(IDC_CELL_NORMAL, OnCellNormal)
ON_BN_CLICKED(IDC_CELL_COMBO, OnCellCombo)
ON_BN_CLICKED(IDC_CELL_READONLY, OnCellReadonly)
ON_COMMAND(IDC_TRACKFOCUS, OnTrackfocus)
ON_COMMAND(IDC_FRAMEFOCUS, OnFramefocus)
ON_COMMAND(IDC_EXPAND_LAST, OnExpandLast)
ON_COMMAND(IDC_SET_FOCUS, OnSetFocus11)
ON_COMMAND(IDC_VIRTUAL_MODE, OnVirtualMode)
ON_COMMAND(IDC_CALLBACK_FUNCTION, OnCallbackFunction)
ON_COMMAND(IDC_FIXEDROW_SELECTION, OnFixedRowSelection)
ON_COMMAND(IDC_FIXEDCOL_SELECTION, OnFixedColSelection)
ON_COMMAND(IDC_VERTICAL_TEXT, OnVertical)
//}}AFX_MSG_MAP
ON_NOTIFY(NM_DBLCLK, IDC_GRID, OnGridDblClick)
ON_NOTIFY(NM_CLICK, IDC_GRID, OnGridClick)
#ifndef GRIDCONTROL_NO_CLIPBOARD
ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
ON_COMMAND(ID_EDIT_CUT, OnEditCut)
ON_COMMAND(ID_EDIT_PASTE, OnEditPaste)
ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateEditCopyOrCut)
ON_UPDATE_COMMAND_UI(ID_EDIT_CUT, OnUpdateEditCopyOrCut)
ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdateEditPaste)
#endif
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGridCtrlDemoDlg message handlers
BOOL CGridCtrlDemoDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
#ifndef _WIN32_WCE
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
#else
CSize ScreenSize();
::SetWindowPos(m_hWnd, HWND_TOP,0,0,
GetSystemMetrics(SM_CXSCREEN),
GetSystemMetrics(SM_CYSCREEN) - 32, // 32 = kludge value
SWP_SHOWWINDOW);
#endif
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
CRect rect;
GetClientRect(rect);
m_OldSize = CSize(rect.Width(), rect.Height());
// init spin controls
m_RowSpin.SetRange(0,999);
m_FixRowSpin.SetRange(0,999);
m_FixColSpin.SetRange(0,999);
m_ColSpin.SetRange(0,999);
/////////////////////////////////////////////////////////////////////////
// initialise grid properties
/////////////////////////////////////////////////////////////////////////
m_ImageList.Create(MAKEINTRESOURCE(IDB_IMAGES), 16, 1, RGB(255,255,255));
m_Grid.SetImageList(&m_ImageList);
m_Grid.EnableDragAndDrop(TRUE);
m_Grid.GetDefaultCell(FALSE, FALSE)->SetBackClr(RGB(0xFF, 0xFF, 0xE0));
OnEditable();
OnVirtualMode(); // Sets the grid mode, fills the grid
OnListmode();
OnCellReadonly();
OnItalics();
OnTitletips();
OnTrackfocus();
OnFramefocus();
OnRowResize();
OnColResize();
OnSingleselmode();
OnSingleColMode();
OnVertGridLines();
OnHorzGridLines();
OnAllowSelection();
OnCallbackFunction();
OnVertical();
OnHeaderSort();
m_Grid.SetFixedColumnSelection(TRUE);
m_Grid.SetFixedRowSelection(TRUE);
UpdateMenuUI();
m_Grid.AutoSize();
m_Grid.SetSortColumn(100);
return TRUE; // return TRUE unless you set the focus to a control
}
void CGridCtrlDemoDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
HCURSOR CGridCtrlDemoDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CGridCtrlDemoDlg::OnUpdateEditCols()
{
if (!::IsWindow(m_Grid.m_hWnd)) return;
UpdateData();
int nOldNumCols = m_Grid.GetColumnCount();
TRY {
m_Grid.SetColumnCount(m_nCols);
}
CATCH (CMemoryException, e)
{
e->ReportError();
return;
}
END_CATCH
m_nCols = m_Grid.GetColumnCount();
m_nFixCols = m_Grid.GetFixedColumnCount();
UpdateData(FALSE);
CString str;
for (int i = nOldNumCols; i < m_nCols; i++)
{
str.Format(_T("Column %d"), i);
m_Grid.SetItemText(0,i,str);
}
}
void CGridCtrlDemoDlg::OnUpdateEditFixcols()
{
if (!::IsWindow(m_Grid.m_hWnd)) return;
UpdateData();
TRY {
m_Grid.SetFixedColumnCount(m_nFixCols);
}
CATCH (CMemoryException, e)
{
e->ReportError();
return;
}
END_CATCH
m_nCols = m_Grid.GetColumnCount();
m_nFixCols = m_Grid.GetFixedColumnCount();
UpdateData(FALSE);
}
void CGridCtrlDemoDlg::OnUpdateEditFixrows()
{
if (!::IsWindow(m_Grid.m_hWnd)) return;
UpdateData();
TRY {
m_Grid.SetFixedRowCount(m_nFixRows);
}
CATCH (CMemoryException, e)
{
e->ReportError();
return;
}
END_CATCH
m_nRows = m_Grid.GetRowCount();
m_nFixRows = m_Grid.GetFixedRowCount();
UpdateData(FALSE);
}
void CGridCtrlDemoDlg::OnUpdateEditRows()
{
if (!::IsWindow(m_Grid.m_hWnd)) return;
UpdateData();
int nOldNumRows = m_Grid.GetRowCount();
TRY {
m_Grid.SetRowCount(m_nRows);
}
CATCH (CMemoryException, e)
{
e->ReportError();
return;
}
END_CATCH
m_nRows = m_Grid.GetRowCount();
m_nFixRows = m_Grid.GetFixedRowCount();
UpdateData(FALSE);
CString str;
for (int i = nOldNumRows; i < m_nRows; i++)
{
str.Format(_T("Row %d"), i);
m_Grid.SetItemText(i,0,str);
}
}
void CGridCtrlDemoDlg::OnGridLines()
{
if (!m_bHorzLines && !m_bVertLines)
m_Grid.SetGridLines(GVL_NONE);
else if (m_bHorzLines && !m_bVertLines)
m_Grid.SetGridLines(GVL_HORZ);
else if (!m_bHorzLines && m_bVertLines)
m_Grid.SetGridLines(GVL_VERT);
else
m_Grid.SetGridLines(GVL_BOTH);
UpdateMenuUI();
}
void CGridCtrlDemoDlg::OnVertGridLines()
{
m_bVertLines = !m_bVertLines;
OnGridLines();
}
void CGridCtrlDemoDlg::OnHorzGridLines()
{
m_bHorzLines = !m_bHorzLines;
OnGridLines();
}
void CGridCtrlDemoDlg::OnListmode()
{
m_bListMode = !m_bListMode;
m_Grid.SetListMode(m_bListMode);
UpdateMenuUI();
}
void CGridCtrlDemoDlg::OnHeaderSort()
{
m_bHeaderSort = !m_bHeaderSort;
m_Grid.SetHeaderSort(m_bHeaderSort);
UpdateMenuUI();
}
void CGridCtrlDemoDlg::OnSingleselmode()
{
m_bSingleSelMode = !m_bSingleSelMode;
m_Grid.SetSingleRowSelection(m_bSingleSelMode);
UpdateMenuUI();
}
void CGridCtrlDemoDlg::OnSingleColMode()
{
m_bSingleColSelMode = !m_bSingleColSelMode;
m_Grid.SetSingleColSelection(m_bSingleColSelMode);
UpdateMenuUI();
}
void CGridCtrlDemoDlg::OnEditable()
{
m_bEditable = !m_bEditable;
m_Grid.SetEditable(m_bEditable);
UpdateMenuUI();
}
void CGridCtrlDemoDlg::OnAllowSelection()
{
m_bSelectable = !m_bSelectable;
m_Grid.EnableSelection(m_bSelectable);
UpdateMenuUI();
}
void CGridCtrlDemoDlg::OnRowResize()
{
m_bAllowRowResize = !m_bAllowRowResize;
m_Grid.SetRowResize(m_bAllowRowResize);
UpdateMenuUI();
}
void CGridCtrlDemoDlg::OnColResize()
{
m_bAllowColumnResize = !m_bAllowColumnResize;
m_Grid.SetColumnResize(m_bAllowColumnResize);
UpdateMenuUI();
}
void CGridCtrlDemoDlg::OnPrintButton()
{
#if !defined(WCE_NO_PRINTING) && !defined(GRIDCONTROL_NO_PRINTING)
m_Grid.Print();
#endif
}
void CGridCtrlDemoDlg::OnFontButton()
{
#ifndef _WIN32_WCE
LOGFONT lf;
m_Grid.GetFont()->GetLogFont(&lf);
CFontDialog dlg(&lf);
if (dlg.DoModal() == IDOK) {
dlg.GetCurrentFont(&lf);
CFont Font;
Font.CreateFontIndirect(&lf);
m_Grid.SetFont(&Font);
OnItalics();
m_Grid.AutoSize();
Font.DeleteObject();
}
#endif
}
BOOL CALLBACK EnumProc(HWND hwnd, LPARAM lParam)
{
CWnd* pWnd = CWnd::FromHandle(hwnd);
CSize* pTranslate = (CSize*) lParam;
CGridCtrlDemoDlg* pDlg = (CGridCtrlDemoDlg*) pWnd->GetParent();
if (!pDlg) return FALSE;
CRect rect;
pWnd->GetWindowRect(rect);
//if (hwnd == pDlg->m_Grid.GetSafeHwnd())
// TRACE(_T("Wnd rect: %d,%d - %d,%d\n"),rect.left,rect.top, rect.right, rect.bottom);
pDlg->ScreenToClient(rect);
//if (hwnd == pDlg->m_Grid.GetSafeHwnd())
// TRACE(_T("Scr rect: %d,%d - %d,%d\n"),rect.left,rect.top, rect.right, rect.bottom);
if (hwnd == pDlg->m_Grid.GetSafeHwnd())
{
if ( ((rect.top >= 7 && pTranslate->cy > 0) || rect.Height() > 20) &&
((rect.left >= 7 && pTranslate->cx > 0) || rect.Width() > 20) )
pDlg->m_Grid.MoveWindow(rect.left, rect.top,
rect.Width()+pTranslate->cx,
rect.Height()+pTranslate->cy, FALSE);
else
pWnd->MoveWindow(rect.left+pTranslate->cx, rect.top+pTranslate->cy,
rect.Width(), rect.Height(), FALSE);
}
else
{
if (pWnd->GetDlgCtrlID() == IDC_SIZEBOX)
pWnd->MoveWindow(rect.left+pTranslate->cx, rect.top+pTranslate->cy,
rect.Width(), rect.Height(), FALSE);
else
pWnd->MoveWindow(rect.left+pTranslate->cx, rect.top, rect.Width(), rect.Height(), FALSE);
}
pDlg->Invalidate();
return TRUE;
}
void CGridCtrlDemoDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
if (cx <= 1 || cy <= 1 )
return;
#ifdef _WIN32_WCE
m_Grid.MoveWindow(0,0, cx,cy, FALSE);
#else
if (IsWindow(m_Grid.GetSafeHwnd()))
{
CRect rect;
m_Grid.GetWindowRect(rect);
ScreenToClient(rect);
m_Grid.MoveWindow(7,7, rect.Width(), cy-14, FALSE);
}
CSize Translate(cx - m_OldSize.cx, cy - m_OldSize.cy);
::EnumChildWindows(GetSafeHwnd(), EnumProc, (LPARAM)&Translate);
m_OldSize = CSize(cx,cy);
#endif
}
#ifndef GRIDCONTROL_NO_CLIPBOARD
void CGridCtrlDemoDlg::OnEditCopy()
{
m_Grid.OnEditCopy();
}
void CGridCtrlDemoDlg::OnEditCut()
{
m_Grid.OnEditCut();
}
void CGridCtrlDemoDlg::OnEditPaste()
{
m_Grid.OnEditPaste();
}
void CGridCtrlDemoDlg::OnUpdateEditCopyOrCut(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_Grid.GetSelectedCount() > 0);
}
void CGridCtrlDemoDlg::OnUpdateEditPaste(CCmdUI* pCmdUI)
{
// Attach a COleDataObject to the clipboard see if there is any data
COleDataObject obj;
pCmdUI->Enable(obj.AttachClipboard() && obj.IsDataAvailable(CF_TEXT));
}
#endif
void CGridCtrlDemoDlg::OnEditSelectall()
{
m_Grid.OnEditSelectAll();
}
void CGridCtrlDemoDlg::OnAppAbout()
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
void CGridCtrlDemoDlg::OnItalics()
{
m_bItalics = !m_bItalics;
CFont *pFont = m_Grid.GetFont();
if (!pFont)
return;
LOGFONT lf;
pFont->GetLogFont(&lf);
lf.lfItalic = (BYTE) m_bItalics;
m_Grid.GetDefaultCell(TRUE, FALSE)->SetFont(&lf);
m_Grid.GetDefaultCell(FALSE, TRUE)->SetFont(&lf);
m_Grid.GetDefaultCell(TRUE, TRUE)->SetFont(&lf);
m_Grid.Invalidate();
m_Grid.AutoSizeColumns(GVS_HEADER);
UpdateMenuUI();
}
void CGridCtrlDemoDlg::OnTitletips()
{
m_btitleTips = !m_btitleTips;
m_Grid.EnableTitleTips(m_btitleTips);
UpdateMenuUI();
}
void CGridCtrlDemoDlg::OnInsertRow()
{
int nRow = m_Grid.GetFocusCell().row;
if (nRow >= 0)
{
m_Grid.InsertRow(_T("Newest Row"), nRow);
m_Grid.Invalidate();
}
}
void CGridCtrlDemoDlg::OnDeleteRow()
{
int nRow = m_Grid.GetFocusCell().row;
if (nRow >= 0)
{
m_Grid.DeleteRow(nRow);
m_Grid.Invalidate();
}
}
// (Thanks to Koay Kah Hoe for this)
BOOL CGridCtrlDemoDlg::PreTranslateMessage(MSG* pMsg)
{
if( pMsg->message == WM_KEYDOWN )
{
if(pMsg->wParam == VK_RETURN
|| pMsg->wParam == VK_ESCAPE )
{
::TranslateMessage(pMsg);
::DispatchMessage(pMsg);
return TRUE; // DO NOT process further
}
}
return CDialog::PreTranslateMessage(pMsg);
}
void CGridCtrlDemoDlg::OnGridDblClick(NMHDR *pNotifyStruct, LRESULT* /*pResult*/)
{
NM_GRIDVIEW* pItem = (NM_GRIDVIEW*) pNotifyStruct;
if (pItem->iRow < 0)
return;
TRACE2("Double Clicked on row %d, col %d\n", pItem->iRow, pItem->iColumn);
}
void CGridCtrlDemoDlg::OnGridClick(NMHDR *pNotifyStruct, LRESULT* /*pResult*/)
{
NM_GRIDVIEW* pItem = (NM_GRIDVIEW*) pNotifyStruct;
if (pItem->iRow < 0)
return;
TRACE2("Clicked on row %d, col %d\n", pItem->iRow, pItem->iColumn);
}
void CGridCtrlDemoDlg::OnExpandToFit()
{
m_Grid.ExpandToFit();
}
void CGridCtrlDemoDlg::OnAutoSize()
{
m_Grid.AutoSize();
}
void CGridCtrlDemoDlg::OnFill()
{
m_Grid.DeleteAllItems();
m_Grid.AutoFill();
}
void CGridCtrlDemoDlg::OnCellNormal()
{
m_Grid.SetCellType(1,1, RUNTIME_CLASS(CGridCell));
m_Grid.SetItemText(1,1, _T("1"));
m_Grid.SetItemState(1,1, m_Grid.GetItemState(1,1) & ~GVIS_READONLY);
m_Grid.Invalidate();
}
void CGridCtrlDemoDlg::OnCellReadonly()
{
OnCellNormal();
m_Grid.SetItemState(1,1, m_Grid.GetItemState(1,1) | GVIS_READONLY);
}
void CGridCtrlDemoDlg::OnCellUrl()
{
OnCellNormal();
if (!m_Grid.SetCellType(1,1, RUNTIME_CLASS(CGridURLCell)))
return;
m_Grid.SetItemText(1,1, _T("www.codeproject.com"));
}
void CGridCtrlDemoDlg::OnCellCombo()
{
OnCellNormal();
if (!m_Grid.SetCellType(1,1, RUNTIME_CLASS(CGridCellCombo)))
return;
m_Grid.SetItemText(1,1, _T("www.codeproject.com"));
CStringArray options;
options.Add(_T("Option 1"));
options.Add(_T("Option 2"));
options.Add(_T("Option 3"));
CGridCellCombo *pCell = (CGridCellCombo*) m_Grid.GetCell(1,1);
pCell->SetOptions(options);
}
void CGridCtrlDemoDlg::OnTrackfocus()
{
m_bTrackFocus = !m_bTrackFocus;
m_Grid.SetTrackFocusCell(m_bTrackFocus);
m_Grid.Invalidate();
UpdateMenuUI();
}
void CGridCtrlDemoDlg::OnFramefocus()
{
m_bFrameFocus = !m_bFrameFocus;
m_Grid.SetFrameFocusCell(m_bFrameFocus);
m_Grid.Invalidate();
UpdateMenuUI();
}
void CGridCtrlDemoDlg::OnExpandLast()
{
m_Grid.ExpandLastColumn();
}
void CGridCtrlDemoDlg::OnSetFocus11()
{
CCellID cell(1,1);
m_Grid.SetFocusCell(cell);
if (m_Grid.GetListMode())
m_Grid.SetSelectedRange(1, m_Grid.GetFixedColumnCount(), 1, m_Grid.GetColumnCount()-1, TRUE);
else
m_Grid.SetSelectedRange(1,1,1,1, TRUE);
}
void CGridCtrlDemoDlg::OnCallbackFunction()
{
m_bCallback = !m_bCallback;
m_Grid.SetCallbackFunc(m_bCallback? GridCallback : NULL, 0);
m_Grid.Refresh();
UpdateMenuUI();
}
void CGridCtrlDemoDlg::OnVirtualMode()
{
UpdateData();
m_bVirtualMode = !m_bVirtualMode;
m_Grid.SetVirtualMode(m_bVirtualMode);
m_bHeaderSort = m_Grid.GetHeaderSort();
m_bEditable = m_Grid.IsEditable();
if (m_bVirtualMode)
{
m_Grid.SetCallbackFunc(m_bCallback? GridCallback : NULL, 0);
m_nFixCols = 1;
m_nFixRows = 1;
m_nCols = 100;
m_nRows = 100000;
TRY {
m_Grid.SetRowCount(m_nRows);
m_Grid.SetColumnCount(m_nCols);
m_Grid.SetFixedRowCount(m_nFixRows);
m_Grid.SetFixedColumnCount(m_nFixCols);
}
CATCH (CMemoryException, e)
{
e->ReportError();
return;
}
END_CATCH
}
else
{
m_nFixCols = 1;
m_nFixRows = 1;
m_nCols = 8;
m_nRows = 20;
m_Grid.SetEditable(m_bEditable);
m_Grid.SetAutoSizeStyle();
TRY {
m_Grid.SetRowCount(m_nRows);
m_Grid.SetColumnCount(m_nCols);
m_Grid.SetFixedRowCount(m_nFixRows);
m_Grid.SetFixedColumnCount(m_nFixCols);
}
CATCH (CMemoryException, e)
{
e->ReportError();
return;
}
END_CATCH
// fill rows/cols with text
for (int row = 0; row < m_Grid.GetRowCount(); row++)
{
for (int col = 0; col < m_Grid.GetColumnCount(); col++)
{
CString str;
GV_ITEM Item;
Item.mask = GVIF_TEXT;
Item.row = row;
Item.col = col;
if (row < m_nFixRows)
str.Format(_T("Column %d"),col);
else if (col < m_nFixCols)
str.Format(_T("Row %d"), row);
else
str.Format(_T("%d"),row*col);
Item.strText = str;
if (rand() % 10 == 1)
{
COLORREF clr = RGB(rand()%128 + 128, rand()%128 + 128, rand()%128 + 128);
Item.crBkClr = clr; // or - m_Grid.SetItemBkColour(row, col, clr);
Item.crFgClr = RGB(255,0,0); // or - m_Grid.SetItemFgColour(row, col, RGB(255,0,0));
Item.mask |= (GVIF_BKCLR|GVIF_FGCLR);
}
if (col < m_Grid.GetFixedColumnCount())
{
Item.iImage = rand()%m_ImageList.GetImageCount();
Item.mask |= (GVIF_IMAGE);
}
m_Grid.SetItem(&Item);
}
}
}
//m_Grid.GetDefaultCell(FALSE,FALSE)->SetFormat(DT_RIGHT|DT_VCENTER|DT_SINGLELINE|DT_NOPREFIX|DT_END_ELLIPSIS);
//m_Grid.GetDefaultCell(TRUE, FALSE)->SetFormat(DT_RIGHT|DT_VCENTER|DT_SINGLELINE|DT_NOPREFIX|DT_END_ELLIPSIS);
// Having weird Autosize problems with CE 2.11 - possibly just an emulation problem
#if !defined(_WIN32_WCE) || (_WIN32_WCE < 211)
m_Grid.AutoSize();
#endif
UpdateMenuUI();
UpdateData(FALSE);
}
BOOL CGridCtrlDemoDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
if (wParam == (WPARAM)m_Grid.GetDlgCtrlID())
{
*pResult = 1;
GV_DISPINFO *pDispInfo = (GV_DISPINFO*)lParam;
if (GVN_GETDISPINFO == pDispInfo->hdr.code)
{
//TRACE2("Getting Display info for cell %d,%d\n", pDispInfo->item.row, pDispInfo->item.col);
pDispInfo->item.strText.Format(_T("Message %d,%d"),pDispInfo->item.row, pDispInfo->item.col);
return TRUE;
}
else if (GVN_ODCACHEHINT == pDispInfo->hdr.code)
{
GV_CACHEHINT *pCacheHint = (GV_CACHEHINT*)pDispInfo;
TRACE(_T("Cache hint received for cell range %d,%d - %d,%d\n"),
pCacheHint->range.GetMinRow(), pCacheHint->range.GetMinCol(),
pCacheHint->range.GetMaxRow(), pCacheHint->range.GetMaxCol());
}
}
return CDialog::OnNotify(wParam, lParam, pResult);
}
BOOL CALLBACK CGridCtrlDemoDlg::GridCallback(GV_DISPINFO *pDispInfo, LPARAM /*lParam*/)
{
pDispInfo->item.strText.Format(_T("Callback %d,%d"),pDispInfo->item.row, pDispInfo->item.col);
return TRUE;
}
void CGridCtrlDemoDlg::UpdateMenuUI()
{
#ifndef _WIN32_WCE
BOOL bHorzLines = m_Grid.GetGridLines() & GVL_HORZ;
BOOL bVertLines = m_Grid.GetGridLines() & GVL_VERT;
GetMenu()->CheckMenuItem(IDC_HORZ_LINES, MF_BYCOMMAND | (bHorzLines)? MF_CHECKED: MF_UNCHECKED);
GetMenu()->CheckMenuItem(IDC_VERT_LINES, MF_BYCOMMAND | (bVertLines)? MF_CHECKED: MF_UNCHECKED);
GetMenu()->EnableMenuItem(IDC_SINGLESELMODE, MF_BYCOMMAND | (m_Grid.GetListMode())? MF_ENABLED: MF_DISABLED|MF_GRAYED);
GetMenu()->CheckMenuItem(IDC_HEADERSORT, MF_BYCOMMAND | (m_Grid.GetHeaderSort())? MF_CHECKED: MF_UNCHECKED);
GetMenu()->CheckMenuItem(IDC_SINGLESELMODE, MF_BYCOMMAND | (m_Grid.GetSingleRowSelection())? MF_CHECKED: MF_UNCHECKED);
GetMenu()->CheckMenuItem(IDC_SINGLECOLSELMODE, MF_BYCOMMAND | (m_Grid.GetSingleColSelection())? MF_CHECKED: MF_UNCHECKED);
GetMenu()->CheckMenuItem(IDC_EDITABLE, MF_BYCOMMAND | (m_Grid.IsEditable())? MF_CHECKED: MF_UNCHECKED);
GetMenu()->CheckMenuItem(IDC_ALLOW_SELECTION, MF_BYCOMMAND | (m_Grid.IsSelectable())? MF_CHECKED: MF_UNCHECKED);
GetMenu()->CheckMenuItem(IDC_ROW_RESIZE, MF_BYCOMMAND | (m_Grid.GetRowResize())? MF_CHECKED: MF_UNCHECKED);
GetMenu()->CheckMenuItem(IDC_COL_RESIZE, MF_BYCOMMAND | (m_Grid.GetColumnResize())? MF_CHECKED: MF_UNCHECKED);
GetMenu()->CheckMenuItem(IDC_ITALICS, MF_BYCOMMAND | (m_bItalics)? MF_CHECKED: MF_UNCHECKED);
GetMenu()->CheckMenuItem(IDC_TITLETIPS, MF_BYCOMMAND | (m_Grid.GetTitleTips())? MF_CHECKED: MF_UNCHECKED);
GetMenu()->CheckMenuItem(IDC_TRACKFOCUS, MF_BYCOMMAND | (m_Grid.GetTrackFocusCell())? MF_CHECKED: MF_UNCHECKED);
GetMenu()->CheckMenuItem(IDC_FRAMEFOCUS, MF_BYCOMMAND | (m_Grid.GetFrameFocusCell())? MF_CHECKED: MF_UNCHECKED);
GetMenu()->CheckMenuItem(IDC_CALLBACK_FUNCTION, MF_BYCOMMAND | (m_Grid.GetCallbackFunc()!=NULL)? MF_CHECKED: MF_UNCHECKED);
GetMenu()->CheckMenuItem(IDC_VIRTUAL_MODE, MF_BYCOMMAND | (m_Grid.GetVirtualMode())? MF_CHECKED: MF_UNCHECKED);
GetMenu()->EnableMenuItem(IDC_CALLBACK_FUNCTION, MF_BYCOMMAND | (m_Grid.GetVirtualMode())? MF_ENABLED: MF_DISABLED|MF_GRAYED);
GetMenu()->CheckMenuItem(IDC_FIXEDROW_SELECTION, MF_BYCOMMAND | (m_Grid.GetFixedRowSelection())? MF_CHECKED: MF_UNCHECKED);
GetMenu()->CheckMenuItem(IDC_FIXEDCOL_SELECTION, MF_BYCOMMAND | (m_Grid.GetFixedColumnSelection())? MF_CHECKED: MF_UNCHECKED);
GetMenu()->CheckMenuItem(IDC_VERTICAL_TEXT, MF_BYCOMMAND | (m_bVertical)? MF_CHECKED: MF_UNCHECKED);
#endif
}
void CGridCtrlDemoDlg::OnFixedRowSelection()
{
m_Grid.SetFixedRowSelection(!m_Grid.GetFixedRowSelection());
UpdateMenuUI();
}
void CGridCtrlDemoDlg::OnFixedColSelection()
{
m_Grid.SetFixedColumnSelection(!m_Grid.GetFixedColumnSelection());
UpdateMenuUI();
}
void CGridCtrlDemoDlg::OnVertical()
{
m_bVertical = !m_bVertical;
// Set reasonable format
//m_Grid.GetDefaultCell(TRUE, FALSE)->SetFormat(DT_SINGLELINE|DT_NOPREFIX|DT_END_ELLIPSIS|DT_LEFT|DT_BOTTOM);
//m_Grid.GetDefaultCell(TRUE, TRUE)->SetFormat(DT_SINGLELINE|DT_NOPREFIX|DT_END_ELLIPSIS|DT_LEFT|DT_BOTTOM);
// Get the font
CFont* pFont = m_Grid.GetFont();
LOGFONT lf;
pFont->GetLogFont(&lf);
// Make it true-type
memcpy(lf.lfFaceName, _T("Arial"), 6);
// Vertical or horizontal
if (m_bVertical)
{
lf.lfEscapement = 900;
lf.lfOrientation = 900;
}
else
{
lf.lfEscapement = 0;
lf.lfOrientation = 0;
}
// Set the fixed row defaults as this new font
m_Grid.GetDefaultCell(TRUE, FALSE)->SetFont(&lf);
// Set cell 1,1 as the more normal font so URL cells look OK
lf.lfEscapement = 0;
lf.lfOrientation = 0;
m_Grid.SetItemFont(0,1, &lf);
m_Grid.AutoSize(GVS_HEADER);
if (m_btitleTips)
{
m_btitleTips = !m_bVertical;
m_Grid.EnableTitleTips(!m_bVertical);
}
UpdateMenuUI();
}