Click here to Skip to main content
Licence CPOL
First Posted 26 Mar 2000
Views 115,793
Downloads 882
Bookmarked 47 times

Print ListCtrl on multiple pages

By | 26 Mar 2000 | Article
Printing the contents of a CListCtrl or CListView with multiple pages
  • Download demo project - 56 Kb

    Sample Image - listPrint.gif

    The demo consists of a doc/view-framework with a CListView-class. It has a button to fill with data and another to print the stuff.

    The Problem

    MFC has no built-in feature for printing a List Control. Some approaches can be found on the internet but they always have the problem that if you have more columns then will fit to a single page, then the rest is clipped away and not printed.

    The Solution

    My class manages:

    • Printing a CListCtrl or CListView with support for multiple pages
    • The first column is printed again on each page
    • The width of the columns are used for printing
    • Columns can be sorted (nothing new, I know)

    My appraoch is mainly based on the fabulous work of Dan Pilat with his article Printing with MFC Made Easy.

    My work was to build a kind of wrapper over his classes and do the newpage-logic. Each single page is printed just by his classes with some overriden virtual functions.

    The printing from the CListView then looks like this:

    void CListPrintView::OnFilePrintDirect() 
    {
    	CWaitCursor		wait;
    	CListCtrl		&listctrl = GetListCtrl();
    
    	CListCtrlPrintJob	job(&listctrl, !m_bUseSetup);
    	job.Print();
    }
    

    The trick is to calculate a translater for Screen [Pixels] -> Printer [mm]. Then I know how much space a column needs on the paper. This helps me calculating the amount of columns that fit to a page.

    I then loop through all columns and count their width.

    When its time to begin a new one, I define a print-job the Dan Pilat way.

    void CListCtrlPrintJob::OnPrint()
    {
    	...
    
    	widthOfPage = m_pListCtrl->GetColumnWidth(0);
    	iStart      = 1;
    
    	for( i=1 ; i<m_ColCount ; i++ )
    	{
    		widthThisCol = m_pListCtrl->GetColumnWidth(i);
    		bNewPage = FALSE;
    
    		if( widthOfPage+widthThisCol > paperWidthInPixel )
    		{	
    			// not enough place on side, begin new one
    			bNewPage = TRUE;
    		}
    		else
    		{
    			// also print the last one
    			if( i == (m_ColCount-1) )
    				bNewPage = TRUE;
    			
    			// this col needs this space:
    			widthOfPage += widthThisCol;
    		}
    
    		if( bNewPage )
    		{
    			// ok, print it on a new page
    			CListCtrlDataPage data(this, m_pListCtrl, iStart, i);
    			data.Print();
    
    			iStart = i+1;
    			widthOfPage = m_pListCtrl->GetColumnWidth(0);
    		}
    	}
    }
    

    CListCtrlDataPage is derived from GPrintUnit and also has this print-function:

    BOOL CListCtrlDataPage::Print()
    {
    	...
    
    	zeilenMax = m_pListCtrl->GetItemCount();
    		
    	for( zeile=0 ; zeile<zeilenMax ; zeile++ )
    	{
    		nRC = StartRow();
    		// first Col
    		if( m_pListCtrl->GetItemText(zeile, 0, szText, 
                                                                 sizeof(szText)) )
    			PrintCol(colId, szText, DT_LEFT);
    		colId++;
    		for( spalte=m_firstCol ; spalte<=m_lastCol ; spalte++ )
    		{
    			if( m_pListCtrl->GetItemText(zeile, spalte, 
                                                         szText, sizeof(szText)) )
    				PrintCol(colId, szText, DT_LEFT);
    			colId++;
    		}
    
    		EndRow();
    	}
    
    	EndPage();
    	
    	...
    }
    

    Do you have Enchancements (e.g. a print-preview) ?

    Let me know: Markus Loibl, Germany

  • License

    This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

    About the Author

    Markus Loibl



    Germany Germany

    Member



    Sign Up to vote   Poor Excellent
    Add a reason or comment to your vote: x
    Votes of 3 or less require a comment

    Comments and Discussions

     
    You must Sign In to use this message board. (secure sign-in)
     
    Search this forum  
     FAQ
        Noise  Layout  Per page   
      Refresh
    GeneralMy vote of 5 PinmemberDon_Hard2:39 11 Jul '10  
    QuestionBug or not? Pinmemberlittlesome22:04 12 Jul '07  
    QuestionHow Can I Increase the margin Pinmembervimal19830:13 8 Jun '07  
    GeneralA small bug Pinmember_MAK_3:21 6 Jun '07  
    QuestionPrinting in landscape Pinmemberjonbong3:48 9 Nov '06  
    Generalprint in dialog based application Pinmembery_naga_malleswararao3:22 22 Mar '06  
    QuestionRe: print in dialog based application Pinmemberrootdial20:22 23 May '07  
    GeneralPrint Preview PinmemberLuke_2122:59 23 Oct '05  
    QuestionIs there a way to print several list controls at the same page? PinmemberDudi Daabul7:20 18 Oct '05  
    Questionwhat is i am not using ListCtrl on a Dialog based project PinmemberSameer Khanna19:44 22 May '05  
    QuestionDoes it need any DLL ? PinmemberAlexPark007022:08 22 Aug '04  
    AnswerRe: Does it need any DLL ? Pinmembertim+99999:02 29 Mar '05  
    GeneralPrinting by using horizontal and vertical grid lines PinsussErkan Sütçüler5:04 26 Feb '04  
    GeneralProblem with Acrobat Distiller Pinmemberniederer roland21:16 3 Sep '03  
    QuestionHow do you alter the CPrintDialog styles? PinmemberAORD20:54 18 Jan '03  
    GeneralPrint columns in order PinmemberRudy Crespin4:19 30 Jul '01  
    GeneralRe: Print columns in order PinmemberScot Brennecke19:37 6 Apr '02  
    Generalfont changes PinmemberFig18:56 27 Jun '01  
    GeneralRe: font changes PinsussAnonymous18:12 30 Oct '02  
    GeneralRe: font changes Pinsusssbone995:56 2 May '03  

    General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

    Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

    Permalink | Advertise | Privacy | Mobile
    Web01 | 2.5.120517.1 | Last Updated 27 Mar 2000
    Article Copyright 2000 by Markus Loibl
    Everything else Copyright © CodeProject, 1999-2012
    Terms of Use
    Layout: fixed | fluid