65.9K
CodeProject is changing. Read more.
Home

Print ListControl data in the form of a grid on multiple pages

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.82/5 (15 votes)

Jan 6, 2004

CPOL
viewsIcon

64352

downloadIcon

1110

Printing the data of a CListCtrl on multple pages in the form of a grid.

Sample Image - printlistctrl.jpg

Introduction

I wanted to print a list control data in Excel format, but I could not find code for that type of printing anywhere, and I thought why not implement such a class myself, and the result is here.....

My class CPrintListCtrl does the job of printing the list control in Excel format. Simply call the function PrintData(CListCtrl* pListCtrl, CString szPageTitle) which does all the job. pListCtrl is the CListCtrl pointer and szPageTitle is the tile of the print. In this class, I have used the CPrintDialog to do all the job.

bool CPrintListCtrl::PrintData(CListCtrl* pListCtrl, CString szPageTitle)
{
 // Check if the data exists in the list control
 if(pListCtrl->GetItemCount() <= 0)
  return false;
 
 // create the printdialog class pointer with the desired properties 
 // and set the options to the objects 
 CPrintDialog *aPrintDlg = new CPrintDialog(FALSE, 
                               PD_ALLPAGES | PD_RETURNDC, NULL);
 aPrintDlg->m_pd.nMinPage = aPrintDlg->m_pd.nMaxPage = 1;
 aPrintDlg->m_pd.nFromPage = aPrintDlg->m_pd.nToPage = 1;
 // call the printer selection dialog
 aPrintDlg->DoModal();
 // get the HDC of the printer dialog
 m_HdcPrint = aPrintDlg->GetPrinterDC();

 // check for valid handle and proceed
 if(m_HdcPrint != NULL)
 {
  m_CurrentYPos = 130;
  m_Space = 5;
  m_GeneralFont.CreateFont(-((::GetDeviceCaps (m_HdcPrint, LOGPIXELSY)*12)/72),
       0,0,0,FW_NORMAL,FALSE,FALSE,FALSE,DEFAULT_CHARSET,
       OUT_CHARACTER_PRECIS,CLIP_CHARACTER_PRECIS,
       DEFAULT_QUALITY,DEFAULT_PITCH,_T("Arial"));
  m_HeadingFont.CreateFont(-((::GetDeviceCaps (m_HdcPrint, LOGPIXELSY)*18)/72),
     0,0,0,FW_NORMAL,FALSE,FALSE,FALSE,DEFAULT_CHARSET,
     OUT_CHARACTER_PRECIS,CLIP_CHARACTER_PRECIS,
     DEFAULT_QUALITY,DEFAULT_PITCH,_T("Arial"));
  m_ListFont.CreateFont(-((::GetDeviceCaps (m_HdcPrint, LOGPIXELSY)*10)/72),
    0,0,0,FW_NORMAL,FALSE,FALSE,FALSE,DEFAULT_CHARSET,
    OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS,
    DEFAULT_QUALITY,DEFAULT_PITCH,_T("Arial"));
  m_PrintDC = new CDC;
  m_PrintDC->Attach (m_HdcPrint);
  m_PrintDC->StartDoc(_T("Periodical List"));  
  m_PrintDC->StartPage();
  m_PageRect.left = 0;
  m_PageRect.top = 0;
  m_PageRect.right = ::GetDeviceCaps (m_HdcPrint, HORZRES) ;
  m_PageRect.bottom = ::GetDeviceCaps (m_HdcPrint, VERTRES) ;

  // Print the List Control heading  
  PrintListCtrlHeading(pListCtrl, szPageTitle);
  // Finally Print the data
  PrintListData(pListCtrl);

  m_PrintDC->EndPage();
  m_PrintDC->EndDoc();
  m_PrintDC->Detach();
  delete m_PrintDC;
  m_HeadingFont.Detach();
  m_GeneralFont.Detach();
  m_ListFont.Detach();
 }
 else
 {
  delete aPrintDlg;
  return false;
 }
 delete aPrintDlg;
 return true;
}

You are free to change the print title color and the list control heading color. Have fun...