www.pudn.com > print_preview000.rar > GridCtrlDemoDlg.cpp


// GridCtrlDemoDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "GridCtrlDemo.h" 
#include "GridCtrlDemoDlg.h" 
 
// Added by Kah Hoe (To recognize WM_IDLEUPDATECMDUI) 
#include  
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#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 = 10; 
	m_nRows = 50; 
	m_bEditable = TRUE; 
	m_bHorzLines = TRUE; 
	m_bListMode = FALSE; 
	m_bVertLines = TRUE; 
	m_bSelectable = TRUE; 
	m_bAllowColumnResize = TRUE; 
	m_bAllowRowResize = TRUE; 
	m_bHeaderSort = TRUE; 
	m_bReadOnly = TRUE; 
	m_bItalics = TRUE; 
	m_btitleTips = TRUE; 
	m_bSingleSelMode = FALSE; 
	//}}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_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); 
	DDX_Check(pDX, IDC_EDITABLE, m_bEditable); 
	DDX_Check(pDX, IDC_HORZ_LINES, m_bHorzLines); 
	DDX_Check(pDX, IDC_LISTMODE, m_bListMode); 
	DDX_Check(pDX, IDC_VERT_LINES, m_bVertLines); 
	DDX_Check(pDX, IDC_ALLOW_SELECTION, m_bSelectable); 
	DDX_Check(pDX, IDC_COL_RESIZE, m_bAllowColumnResize); 
	DDX_Check(pDX, IDC_ROW_RESIZE, m_bAllowRowResize); 
	DDX_Check(pDX, IDC_HEADERSORT, m_bHeaderSort); 
	DDX_Check(pDX, IDC_READ_ONLY, m_bReadOnly); 
	DDX_Check(pDX, IDC_ITALICS, m_bItalics); 
	DDX_Check(pDX, IDC_TITLETIPS, m_btitleTips); 
	DDX_Check(pDX, IDC_SINGLESELMODE, m_bSingleSelMode); 
	//}}AFX_DATA_MAP 
 
    // There is a problem with registering the grid as an OLE Drop target 
    // in the CGridCtrl::PreSubclassWindow function that only shows itself 
    // under win95. To ensure that the grid can accept drag and drop items, 
    // we use the DDX_GridControl routine which ensures that CGridCtrl::SubclassWindow 
    // is called, and hence the grid will be registered as a drop target. 
    // 
    // If ANYONE knows a neater way, please let me know. I'm new to this stuff! 
	DDX_GridControl(pDX, IDC_GRID, m_Grid); 
} 
 
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_BN_CLICKED(IDC_HORZ_LINES, OnGridLines) 
	ON_BN_CLICKED(IDC_LISTMODE, OnListmode) 
	ON_BN_CLICKED(IDC_EDITABLE, OnEditable) 
	ON_BN_CLICKED(IDC_PRINT_BUTTON, OnPrintButton) 
	ON_BN_CLICKED(IDC_ALLOW_SELECTION, OnAllowSelection) 
	ON_BN_CLICKED(IDC_ROW_RESIZE, OnRowResize) 
	ON_BN_CLICKED(IDC_COL_RESIZE, OnColResize) 
	ON_BN_CLICKED(IDC_FONT_BUTTON, OnFontButton) 
	ON_WM_SIZE() 
	ON_BN_CLICKED(IDC_HEADERSORT, OnHeaderSort) 
	ON_COMMAND(ID_EDIT_SELECTALL, OnEditSelectall) 
	ON_COMMAND(ID_APP_ABOUT, OnAppAbout) 
	ON_BN_CLICKED(IDC_READ_ONLY, OnReadOnly) 
	ON_BN_CLICKED(IDC_ITALICS, OnItalics) 
	ON_BN_CLICKED(IDC_TITLETIPS, OnTitletips) 
	ON_BN_CLICKED(IDC_INSERT_ROW, OnInsertRow) 
	ON_BN_CLICKED(IDC_DELETE_ROW, OnDeleteRow) 
	ON_BN_CLICKED(IDC_SINGLESELMODE, OnSingleselmode) 
	ON_BN_CLICKED(IDC_VERT_LINES, OnGridLines) 
	ON_COMMAND(ID_FILE_PRINT, OnPrintButton) 
	ON_BN_CLICKED(IDC_PRINTPREVIEW_BUTTON, OnPrintpreviewButton) 
	//}}AFX_MSG_MAP 
#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); 
 
	OnListmode(); 
 
	///////////////////////////////////////////////////////////////////////// 
	// initialise grid properties 
	///////////////////////////////////////////////////////////////////////// 
 
	m_ImageList.Create(MAKEINTRESOURCE(IDB_IMAGES), 16, 1, RGB(255,255,255)); 
	m_Grid.SetImageList(&m_ImageList); 
 
	m_Grid.SetEditable(m_bEditable); 
	m_Grid.SetListMode(m_bListMode); 
	m_Grid.EnableDragAndDrop(TRUE); 
	m_Grid.SetTextBkColor(RGB(0xFF, 0xFF, 0xE0)); 
 
	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(); 
		e->Delete(); 
		return FALSE; 
	} 
    END_CATCH 
 
    DWORD dwTextStyle = DT_RIGHT|DT_VCENTER|DT_SINGLELINE; 
#ifndef _WIN32_WCE 
    dwTextStyle |= DT_END_ELLIPSIS; 
#endif 
 
	// fill rows/cols with text 
	for (int row = 0; row < m_Grid.GetRowCount(); row++) 
		for (int col = 0; col < m_Grid.GetColumnCount(); col++) 
		{  
			GV_ITEM Item; 
			Item.mask = GVIF_TEXT|GVIF_FORMAT; 
			Item.row = row; 
			Item.col = col; 
			if (row < m_nFixRows) 
            { 
				Item.nFormat = DT_LEFT|DT_WORDBREAK; 
				Item.szText.Format(_T("Column %d"),col); 
			} 
            else if (col < m_nFixCols)  
            { 
				Item.nFormat = dwTextStyle; 
				Item.szText.Format(_T("Row %d"),row); 
			} 
            else  
            { 
				Item.nFormat = dwTextStyle; 
				Item.szText.Format(_T("%d"),row*col); 
			} 
			m_Grid.SetItem(&Item); 
 
			if (col == (m_Grid.GetFixedColumnCount()-1) )//&& row >= m_Grid.GetFixedRowCount()) 
				m_Grid.SetItemImage(row, col, rand()%m_ImageList.GetImageCount()); 
			//else if (rand() % 10 == 1) 
			//	m_Grid.SetItemImage(row, col, 0); 
 
			if (rand() % 10 == 1) 
			{ 
                COLORREF clr = RGB(rand() % 128+128, rand() % 128+128, rand() % 128+128); 
				m_Grid.SetItemBkColour(row, col, clr); 
				m_Grid.SetItemFgColour(row, col, RGB(255,0,0)); 
			} 
		} 
 
	// Make cell 1,1 read-only 
    m_Grid.SetItemState(1,1, m_Grid.GetItemState(1,1) | GVIS_READONLY); 
 
    OnItalics(); 
    OnTitletips(); 
     
	m_Grid.AutoSize(); 
	m_Grid.SetRowHeight(0, 3*m_Grid.GetRowHeight(0)/2); 
	 
	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(); 
		e->Delete(); 
		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(); 
		e->Delete(); 
		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(); 
		e->Delete(); 
		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(); 
		e->Delete(); 
		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()  
{ 
	UpdateData(); 
 
	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); 
} 
 
void CGridCtrlDemoDlg::OnListmode()  
{ 
	UpdateData(); 
	m_Grid.SetListMode(m_bListMode); 
 
	CWnd* pButton = GetDlgItem(IDC_HEADERSORT); 
	if (pButton)  
	{ 
		pButton->ModifyStyle(m_bListMode?WS_DISABLED:0, m_bListMode? 0:WS_DISABLED); 
		pButton->Invalidate(); 
	} 
	pButton = GetDlgItem(IDC_SINGLESELMODE); 
	if (pButton)  
	{ 
		pButton->ModifyStyle(m_bListMode?WS_DISABLED:0, m_bListMode? 0:WS_DISABLED); 
		pButton->Invalidate(); 
	} 
} 
 
void CGridCtrlDemoDlg::OnHeaderSort()  
{ 
	UpdateData(); 
	m_Grid.SetHeaderSort(m_bHeaderSort); 
} 
 
void CGridCtrlDemoDlg::OnSingleselmode()  
{ 
	UpdateData(); 
	m_Grid.SetSingleRowSelection(m_bSingleSelMode); 
} 
 
void CGridCtrlDemoDlg::OnEditable()  
{ 
	UpdateData(); 
	m_Grid.SetEditable(m_bEditable); 
} 
 
void CGridCtrlDemoDlg::OnAllowSelection()  
{ 
	UpdateData(); 
	m_Grid.EnableSelection(m_bSelectable); 
} 
 
void CGridCtrlDemoDlg::OnRowResize()  
{ 
	UpdateData(); 
	m_Grid.SetRowResize(m_bAllowRowResize); 
} 
 
void CGridCtrlDemoDlg::OnColResize()  
{ 
	UpdateData(); 
	m_Grid.SetColumnResize(m_bAllowColumnResize); 
} 
 
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  
	{ 
		pWnd->MoveWindow(rect.left+pTranslate->cx, rect.top+pTranslate->cy,  
						 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 
	CSize Translate(cx - m_OldSize.cx, cy - m_OldSize.cy); 
 
	::EnumChildWindows(GetSafeHwnd(), EnumProc, (LPARAM)&Translate); 
	m_OldSize = CSize(cx,cy); 
#endif 
 
    //if (::IsWindow(m_Grid.m_hWnd)) 
    //    m_Grid.ExpandToFit(); 
} 
 
#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::OnReadOnly()  
{ 
	UpdateData(); 
    if (m_bReadOnly) 
        m_Grid.SetItemState(1,1, m_Grid.GetItemState(1,1) | GVIS_READONLY); 
    else 
        m_Grid.SetItemState(1,1, m_Grid.GetItemState(1,1) & ~GVIS_READONLY); 
} 
 
void CGridCtrlDemoDlg::OnItalics()  
{ 
    UpdateData(); 
     
    // Set fixed cell fonts as italics 
	for (int row = 0; row < m_Grid.GetRowCount(); row++) 
		for (int col = 0; col < m_Grid.GetColumnCount(); col++) 
		{  
		    if (row < m_Grid.GetFixedRowCount() || col < m_Grid.GetFixedColumnCount()) 
		    { 
		        LOGFONT* pLF = m_Grid.GetItemFont(row ,col); 
		        if (!pLF) continue; 
		         
		        LOGFONT lf; 
		        memcpy(&lf, pLF, sizeof(LOGFONT)); 
		        lf.lfItalic = (BYTE) m_bItalics; 
		         
		        m_Grid.SetItemFont(row, col, &lf); 
		    } 
		} 
	 
	m_Grid.Invalidate(); 
} 
 
void CGridCtrlDemoDlg::OnTitletips()  
{ 
    UpdateData(); 
    m_Grid.EnableTitleTips(m_btitleTips); 
} 
 
void CGridCtrlDemoDlg::OnInsertRow()  
{ 
	//m_Grid.SetSelectedRange(-1,-1,-1,-1); 
	int nRow = m_Grid.GetFocusCell().row; 
    if (nRow >= 0) 
    { 
	    m_Grid.InsertRow(_T("Newest Row"), nRow);	 
	    m_Grid.Invalidate(); 
    } 
	//m_Grid.SetSelectedRange(-1,-1,-1,-1); 
} 
 
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); 
}	 
 
// Added by Kah Hoe 
void CGridCtrlDemoDlg::OnPrintpreviewButton()  
{ 
#if !defined(WCE_NO_PRINTING) && !defined(GRIDCONTROL_NO_PRINTING) 
	m_Grid.PrintPreview(); 
#endif 
} 
 
#if !defined(WCE_NO_PRINTING) && !defined(GRIDCONTROL_NO_PRINTING) 
BOOL CGridCtrlDemoDlg::ContinueModal() 
{ 
	if (m_Grid.m_bPrintPreview) 
		// send WM_IDLEUPDATECMDUI message to update toolbar state 
		// This is normally called by OnIdle function in SDI or MSI applications. 
		// Dialog based applications don't call OnIdle, so send the message from here instead 
		AfxGetApp()->m_pMainWnd->SendMessageToDescendants(WM_IDLEUPDATECMDUI, 
			(WPARAM)TRUE, 0, TRUE, TRUE); 
 
	return CDialog::ContinueModal(); 
} 
#endif