// GridCvw.cpp : implementation of the CGridCtrlView class // #include "stdafx.h" #include "GridCtrl.h" #include "GridCdoc.h" #include "GridCvw.h" #ifdef _DEBUG #undef THIS_FILE static char BASED_CODE THIS_FILE[] = __FILE__; #endif #define SMALL_BITMAP_WIDTH 16 #define SMALL_BITMAP_HEIGHT 16 ///////////////////////////////////////////////////////////////////////////// // CGridCtrlView IMPLEMENT_DYNCREATE(CGridCtrlView, CFormView) BEGIN_MESSAGE_MAP(CGridCtrlView, CFormView) //{{AFX_MSG_MAP(CGridCtrlView) ON_BN_CLICKED(IDC_SET_FONT, OnSetFont) ON_BN_CLICKED(IDC_RESET_FONT, OnResetFont) ON_BN_CLICKED(IDC_COLOR_BUTTON, OnColorButton) ON_BN_CLICKED(IDC_CLEAR, OnClear) ON_BN_CLICKED(IDC_INSERT, OnInsert) ON_BN_CLICKED(IDC_SORTABLE, OnSortable) ON_BN_CLICKED(IDC_MULCHECK, OnMulcheck) ON_BN_CLICKED(IDC_EDITCHECK, OnEditcheck) ON_BN_CLICKED(IDC_GRIDLINES, OnGridLines) ON_BN_CLICKED(IDC_CHECKABLE, OnCheckable) ON_NOTIFY(LVN_ITEMCHANGED, IDC_GENERIC1, OnTraceNotification) ON_BN_CLICKED(IDC_AUTO_EDIT, OnAutoEdit) ON_BN_CLICKED(IDC_SHOW_SELECTION, OnShowSelection) ON_EN_CHANGE(IDC_IMAGE_COLUMN, OnChangeImageColumn) ON_BN_CLICKED(IDC_HORIZONTAL_GRID, OnHorizontalGrid) ON_BN_CLICKED(IDC_VERTICAL_GRID, OnVerticalGrid) ON_BN_CLICKED(IDC_GRIDCOLRESIZE, OnGridcolresize) ON_NOTIFY(LVN_ITEMCHANGING, IDC_GENERIC1, OnTraceNotification) ON_NOTIFY(LVN_BEGINDRAG, IDC_GENERIC1, OnTraceNotification) ON_NOTIFY(LVN_BEGINLABELEDIT, IDC_GENERIC1, OnTraceNotification) ON_NOTIFY(LVN_BEGINRDRAG, IDC_GENERIC1, OnTraceNotification) ON_NOTIFY(LVN_COLUMNCLICK, IDC_GENERIC1, OnTraceNotification) ON_NOTIFY(LVN_DELETEALLITEMS, IDC_GENERIC1, OnTraceNotification) ON_NOTIFY(LVN_DELETEITEM, IDC_GENERIC1, OnTraceNotification) ON_NOTIFY(LVN_ENDLABELEDIT, IDC_GENERIC1, OnTraceNotification) ON_NOTIFY(LVN_GETDISPINFO, IDC_GENERIC1, OnTraceNotification) ON_NOTIFY(LVN_INSERTITEM, IDC_GENERIC1, OnTraceNotification) ON_NOTIFY(LVN_KEYDOWN, IDC_GENERIC1, OnTraceNotification) ON_NOTIFY(LVN_SETDISPINFO, IDC_GENERIC1, OnTraceNotification) ON_BN_CLICKED(IDC_RADIOCENTER, OnRadiocenter) ON_BN_CLICKED(IDC_RADIOLEFT, OnRadioleft) ON_BN_CLICKED(IDC_RADIORIGHT, OnRadioright) //}}AFX_MSG_MAP // Standard printing commands ON_COMMAND(ID_FILE_PRINT, CFormView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFormView::OnFilePrintPreview) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CGridCtrlView construction/destruction CGridCtrlView::CGridCtrlView() : CFormView(CGridCtrlView::IDD), m_bInitialized(FALSE) { //{{AFX_DATA_INIT(CGridCtrlView) m_bGridLines = FALSE; m_bEditCheck = FALSE; m_bMulti = FALSE; m_nRegion = 0; m_bSort = FALSE; m_iNumberOfRows = 5; m_iImageColumn = 0; m_bCheckable = FALSE; m_bAutoEdit = FALSE; m_bShowSel = FALSE; m_bHorizontal = TRUE; m_bVertical = TRUE; m_bResize = TRUE; //}}AFX_DATA_INIT } CGridCtrlView::~CGridCtrlView() { } void CGridCtrlView::DoDataExchange(CDataExchange* pDX) { CFormView::DoDataExchange(pDX); //{{AFX_DATA_MAP(CGridCtrlView) // DDX_Control(pDX, IDC_COLOR_BUTTON, m_btnCustomize); DDX_Control(pDX, IDC_IMAGE_COLUMN_SPIN, m_wndImageColumnSpin); DDX_Control(pDX, IDC_NUM_ROWS_SPIN, m_wndNumRowsSpin); DDX_Control(pDX, IDC_GENERIC1, m_GridCtrl); DDX_Check(pDX, IDC_GRIDLINES, m_bGridLines); DDX_Check(pDX, IDC_EDITCHECK, m_bEditCheck); DDX_Check(pDX, IDC_MULCHECK, m_bMulti); DDX_Radio(pDX, IDC_TEXT_COLOR, m_nRegion); DDX_Check(pDX, IDC_SORTABLE, m_bSort); DDX_Text(pDX, IDC_NUM_ROWS, m_iNumberOfRows); DDV_MinMaxInt(pDX, m_iNumberOfRows, 0, 10000); DDX_Text(pDX, IDC_IMAGE_COLUMN, m_iImageColumn); DDV_MinMaxInt(pDX, m_iImageColumn, 0, 50); DDX_Check(pDX, IDC_CHECKABLE, m_bCheckable); DDX_Check(pDX, IDC_AUTO_EDIT, m_bAutoEdit); DDX_Check(pDX, IDC_SHOW_SELECTION, m_bShowSel); DDX_Check(pDX, IDC_HORIZONTAL_GRID, m_bHorizontal); DDX_Check(pDX, IDC_VERTICAL_GRID, m_bVertical); DDX_Check(pDX, IDC_GRIDCOLRESIZE, m_bResize); //}}AFX_DATA_MAP } ///////////////////////////////////////////////////////////////////////////// // CGridCtrlView diagnostics #ifdef _DEBUG void CGridCtrlView::AssertValid() const { CFormView::AssertValid(); } void CGridCtrlView::Dump(CDumpContext& dc) const { CFormView::Dump(dc); } CGridCtrlDoc* CGridCtrlView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGridCtrlDoc))); return (CGridCtrlDoc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CGridCtrlView message handlers void CGridCtrlView::OnInitialUpdate() { CFormView::OnInitialUpdate(); // Add Headers to Grid Control for (int i = 0; i < 4 ; i++) { CString sText; sText.Format(_T("Header %d"),i); m_GridCtrl.InsertColumn(i, sText); } // Set the spin ranges m_wndNumRowsSpin.SetRange(0, 10000); // ... Only four columns (0 - 3) m_wndImageColumnSpin.SetRange(0, 3); // create the small icon image list m_ImageSmall.Create(IDB_IMAGELIST,16,0,RGB(255,255,255)); // Associate the image lists with the grid control m_GridCtrl.SetImageList(&m_ImageSmall, LVSIL_SMALL); m_GridCtrl.SetEqualWidth(); m_GridCtrl.ShowWindow(SW_SHOW); ResizeParentToFit(FALSE); m_bInitialized = TRUE; } void CGridCtrlView::OnSetFont() { LOGFONT logFont; memset(&logFont, 0, sizeof(LOGFONT)); // Logical font struct CFontDialog dlg(&logFont); if (dlg.DoModal() == IDOK) { if (dlg.GetSize() > 90) AfxMessageBox(_T("This font might not fit the row height")); CFont rFont; VERIFY(rFont.CreateFontIndirect(&logFont)); m_GridCtrl.SetTextFont(&rFont); } } void CGridCtrlView::OnResetFont() { m_GridCtrl.SetTextFont(); } void CGridCtrlView::OnColorButton() { if (!UpdateData(TRUE)) return; COLORREF color = 0; switch (m_nRegion) { case 0: color = m_GridCtrl.GetTextColor(); break; case 1: color = m_GridCtrl.GetTextBkColor(); break; case 2: color = m_GridCtrl.GetBkColor(); break; case 3: { BOOL bGridLines; m_GridCtrl.GetGridLines(bGridLines, color); } break; default: TRACE1("CGridCtrlView::OnColorButton : Unexpected case in switch 1 : %i\n", m_nRegion); ASSERT(FALSE); break; } CColorDialog cdlg(color); if (cdlg.DoModal() != IDOK) return; color = cdlg.GetColor(); switch (m_nRegion) { case 0: m_GridCtrl.SetTextColor(color); break; case 1: m_GridCtrl.SetTextBkColor(color); break; case 2: m_GridCtrl.SetBkColor(color); break; case 3: { BOOL bGridLines; COLORREF lineColor; m_GridCtrl.GetGridLines(bGridLines, lineColor); m_GridCtrl.SetGridLines(bGridLines, color); } break; default: TRACE1("CGridCtrlView::OnColorButton : Unexpected case in switch 2 : %i\n", m_nRegion); ASSERT(FALSE); break; } m_GridCtrl.RedrawWindow(); } void CGridCtrlView::OnClear() { BeginWaitCursor(); m_GridCtrl.DeleteAllItems(); m_GridCtrl.Invalidate(); EndWaitCursor(); } void CGridCtrlView::OnInsert() { if (!UpdateData(TRUE)) return; BeginWaitCursor(); m_GridCtrl.LockWindowUpdate(); //////// // Specify the entire row's column entries. 'lParam' points // to the data to be displayed in each column. //////// LV_ITEM lvi; lvi.mask = LVIF_TEXT | LVIF_IMAGE; lvi.cchTextMax = 0; lvi.lParam = 0; int iSubItem; TCHAR sBuffer[20]; // Insert the item for (int j = 0; j < m_iNumberOfRows ; j++) { iSubItem = 0; lvi.iItem = j; lvi.iSubItem = 0; lvi.iImage = 1; wsprintf(sBuffer, _T("Row%i,Col%i"),j + 1, iSubItem + 1); lvi.pszText = sBuffer; int nRtnValue = m_GridCtrl.InsertItem(&lvi); ASSERT(-1 != nRtnValue); // Note that we're starting from iSubItem '1' for (iSubItem = 1; iSubItem < 4; iSubItem++) { wsprintf(sBuffer, _T("Row%i,Col%i"),j + 1, iSubItem + 1); m_GridCtrl.SetItemText(j, iSubItem, sBuffer); } } m_GridCtrl.UnlockWindowUpdate(); EndWaitCursor(); } void CGridCtrlView::OnSortable() { if (!UpdateData(TRUE)) return; // ... Show wait cursor (may take a while) CWaitCursor wc; m_GridCtrl.SetSortable(m_bSort); } void CGridCtrlView::OnMulcheck() { if (!UpdateData(TRUE)) return; m_GridCtrl.SetMultipleSelection(m_bMulti); } void CGridCtrlView::OnEditcheck() { if (!UpdateData(TRUE)) return; m_GridCtrl.SetEditable(m_bEditCheck); } void CGridCtrlView::OnGridLines() { if (!UpdateData(TRUE)) return; BOOL bGridLines; COLORREF lineColor; m_GridCtrl.GetGridLines(bGridLines, lineColor); m_GridCtrl.SetGridLines(m_bGridLines, lineColor); } void CGridCtrlView::OnCheckable() { if (!UpdateData(TRUE)) return; m_GridCtrl.SetCheckable(m_bCheckable != 0); m_GridCtrl.SetCheckStyle(m_bCheckable == 2 ? BS_AUTO3STATE : BS_AUTOCHECKBOX); } void CGridCtrlView::OnTraceNotification(NMHDR* /*pNMHDR*/, LRESULT* pResult) { // NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; static BOOL bAbort = FALSE; *pResult = bAbort; } void CGridCtrlView::OnAutoEdit() { if (!UpdateData(TRUE)) return; m_GridCtrl.SetAutoEdit(m_bAutoEdit); } void CGridCtrlView::OnShowSelection() { if (!UpdateData(TRUE)) return; m_GridCtrl.SetShowSelAlways(m_bShowSel); } void CGridCtrlView::OnChangeImageColumn() { if (!m_bInitialized || !UpdateData(TRUE)) return; if (!m_GridCtrl.SetImageColumn(m_iImageColumn)) AfxMessageBox(_T("Unable to set desired ImageColumn")); } void CGridCtrlView::OnHorizontalGrid() { if (!UpdateData(TRUE)) return; m_GridCtrl.SetGridLineOrientation(m_bHorizontal, m_bVertical); } void CGridCtrlView::OnVerticalGrid() { if (!UpdateData(TRUE)) return; m_GridCtrl.SetGridLineOrientation(m_bHorizontal, m_bVertical); } void CGridCtrlView::OnGridcolresize() { if (!UpdateData(TRUE)) return; m_GridCtrl.SetResizing(m_bResize); } void CGridCtrlView::OnRadiocenter() { LV_COLUMN lvc; lvc.mask = LVCF_FMT; lvc.fmt = LVCFMT_CENTER; m_GridCtrl.SetColumn(1, &lvc); m_GridCtrl.RedrawWindow(); } void CGridCtrlView::OnRadioleft() { LV_COLUMN lvc; lvc.mask = LVCF_FMT; lvc.fmt = LVCFMT_LEFT; m_GridCtrl.SetColumn(1, &lvc); m_GridCtrl.RedrawWindow(); } void CGridCtrlView::OnRadioright() { LV_COLUMN lvc; lvc.mask = LVCF_FMT; lvc.fmt = LVCFMT_RIGHT; m_GridCtrl.SetColumn(1, &lvc); m_GridCtrl.RedrawWindow(); }