Paginate and Print MSFlexGrid Content the Easy Way


This article was contributed by Jordi Duatis.

Environment: VC6

MSFlexGrid is a useful control to present data in a Grid, but what happens when this content has to be printed? Here I present a class, PrintGrid, that paginates and prints the grid content. It uses a second Grid control and must be additionally inserted in your CFormView dialog resource or in your dialog.

The instructions are as follows:

  • Add a second MSFlexGrid control to your form or dialog.
  • Change the member in your view or dialog class from CMSFlexGrid to CPrintGrid* m_pxPrintGrid.
  • Change the DDX command: DDX_Control(pDX, IDC_MSFLEXGRID2, *m_pxPrintGrid).
  • Instantiate the control in your constructor: m_pxPrintGrid = new CPrintGrid().
  • Override the operation OnPreparePrinting and OnPrint as follows:

  • BOOL MyFormView::OnPreparePrinting(CPrintInfo* pInfo)
    {
    // Calculate pages for all grid data
    CPrintDialog xPrintDlg(FALSE);
    CDC xDC;
    xPrintDlg.GetDefaults();
    xDC.Attach(xPrintDlg.GetPrinterDC());
    m_pxPrintGrid->Paginate(&xDC, m_pxGrid);
    xDC.Detach();

    // Update the number of pages according to DC size
    pInfo->m_nNumPreviewPages = m_pxPrintGrid->GetNumPages();
    pInfo->SetMinPage(1);
    pInfo->SetMaxPage(m_pxPrintGrid->GetNumPages());

    // Display printer setup dialog and initialize CPrintInfo
    if (!DoPreparePrinting(pInfo))
    {
    return FALSE;
    }
    // call parent
    return CFormView::OnPreparePrinting(pInfo);
    }

    void MyFormView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
    {
    CString sTitle;
    sTitle = “My App title”;
    m_pxPrintGrid->PrintPage(pDC, pInfo->m_nCurPage, m_pxGrid,
    sTitle);
    // Call parent
    CFormView::OnPrint(pDC, pInfo);
    }

Enjoy it! I hope it will be useful.

Downloads

Download Class Code: PrintGrid.zip – 4 Kb

More by Author

Must Read