Click here to Skip to main content
15,566,264 members
Articles / Desktop Programming / MFC
Article
Posted 26 Mar 2000

Stats

162.4K views
2.7K downloads
55 bookmarked

Print ListCtrl on multiple pages

Rate me:
Please Sign up or sign in to vote.
4.96/5 (14 votes)
26 Mar 2000CPOL
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)


    Written By
    Germany Germany
    This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

    Comments and Discussions

     
    GeneralMy vote of 5 Pin
    china_hxx11-Nov-14 19:01
    china_hxx11-Nov-14 19:01 
    GeneralMy vote of 5 Pin
    Eduardo_David11-Jul-10 3:39
    Eduardo_David11-Jul-10 3:39 
    QuestionBug or not? Pin
    littlesome12-Jul-07 23:04
    littlesome12-Jul-07 23:04 
    QuestionHow Can I Increase the margin Pin
    vimal19838-Jun-07 1:13
    vimal19838-Jun-07 1:13 
    GeneralA small bug Pin
    _MAK_6-Jun-07 4:21
    _MAK_6-Jun-07 4:21 
    QuestionPrinting in landscape Pin
    jonbong9-Nov-06 4:48
    jonbong9-Nov-06 4:48 
    Generalprint in dialog based application Pin
    y_naga_malleswararao22-Mar-06 4:22
    y_naga_malleswararao22-Mar-06 4:22 
    QuestionRe: print in dialog based application Pin
    rootdial23-May-07 21:22
    rootdial23-May-07 21:22 
    GeneralPrint Preview Pin
    Luke_2123-Oct-05 23:59
    Luke_2123-Oct-05 23:59 
    QuestionIs there a way to print several list controls at the same page? Pin
    Dudi Daabul18-Oct-05 8:20
    Dudi Daabul18-Oct-05 8:20 
    Questionwhat is i am not using ListCtrl on a Dialog based project Pin
    Sameer Khanna22-May-05 20:44
    Sameer Khanna22-May-05 20:44 
    QuestionDoes it need any DLL ? Pin
    AlexPark007022-Aug-04 23:08
    AlexPark007022-Aug-04 23:08 
    AnswerRe: Does it need any DLL ? Pin
    Member 181183429-Mar-05 10:02
    Member 181183429-Mar-05 10:02 
    GeneralPrinting by using horizontal and vertical grid lines Pin
    User 2372726-Feb-04 6:04
    User 2372726-Feb-04 6:04 
    GeneralProblem with Acrobat Distiller Pin
    niederer roland3-Sep-03 22:16
    niederer roland3-Sep-03 22:16 
    QuestionHow do you alter the CPrintDialog styles? Pin
    AORD18-Jan-03 21:54
    AORD18-Jan-03 21:54 
    GeneralPrint columns in order Pin
    Rudy Crespin30-Jul-01 5:19
    Rudy Crespin30-Jul-01 5:19 
    GeneralRe: Print columns in order Pin
    Scot Brennecke6-Apr-02 20:37
    professionalScot Brennecke6-Apr-02 20:37 
    Generalfont changes Pin
    Fig27-Jun-01 19:56
    Fig27-Jun-01 19:56 
    GeneralRe: font changes Pin
    Anonymous30-Oct-02 19:12
    Anonymous30-Oct-02 19:12 
    GeneralRe: font changes Pin
    sbone992-May-03 6:56
    sbone992-May-03 6:56 

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

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