Click here to Skip to main content
6,634,665 members and growing! (15,593 online)
Email Password   helpLost your password?
Desktop Development » Printing » General     Intermediate

LitePrint

By Ivan Markovic

Printing without the doc/view architecture
C++, Windows, Visual Studio, MFC, Dev
Posted:23 Jul 2007
Views:20,396
Bookmarked:33 times
Announcements
Loading...
 
Search    
Advanced Search
Add to IE Search
printPrint   add Share
      Discuss Discuss   Broken Article?Report  
4 votes for this article.
Popularity: 2.71 Rating: 4.50 out of 5

1

2

3
2 votes, 50.0%
4
2 votes, 50.0%
5

Introduction

This set of classes enables printing without using doc/view architecture. This allows you to print directly from your dialog or from any part of your MFC-based application. The code was based on A. Fraydl's "Creating a Printing Class" and George Papaioannou's "Quick Print." Improvements include:

  • UNICODE support
  • Unlimited number of fonts and table columns
  • Each table column can now use different alignment
  • Columns can be sized to fit between page margins
  • Better bitmap printing
  • Loading bitmaps from external file
  • Setting/restoring font for document's header and footer

Using the code

The only thing that you have to do is declare the CLitePrint object and start using it. This generic code shows typical usage:

Void CLitePrintDemoDlg::OnPrintButton ()
{
    CLitePrint prt;
    HLTFONT hFont;

    // Step 1 : call the CPrintDialog

    if (prt.Dialog() == -1)
    return;

    //Step 2 : Start the Print

    prt.StartPrint();      

    //Step 3 : Create a printing font

    hFont = prt.AddFontToEnvironment(_T("Arial"),8,8);     

    //Step 4 : Start Page

    prt.StartPage(); 

    //Step 5 : The actual printing goes here

    prt.PrintText(hFont,_T("Example Text"),FORMAT_NORMAL);   

    //Step 6 :  now end the page

    prt.EndPage();

    //Step 7 :  close the print document

    //          and release it in the spooler

    prt.EndPrint();  
}

An external, user-defined header/footer function is called each time the printing reaches the beginning or the end of a page. An example that prints a logo image, lines and page numbers is given bellow:

void FHeadFoot(CLitePrint* lp,int sides, bool hf)
{
    HLTFONT af = lp->SetHFFont();
    COLORREF tc = lp->GetTextColor();
    lp->SetTextColor(RGB(0,0,0));
    if (hf) //if header

    {
        lp->LF();
        CSize sz;
        sz.cx = 100;
        sz.cy = 50;
        lp->PrintBitmap(IDB_BITMAP2, FORMAT_LEFT, &sz);
        lp->Line(PS_SOLID);
        lp->PrintText(lp->GetActiveFont(),
            _T("Report Document"),FORMAT_CENTER);
        CString nmb;
        nmb.Format(_T("Page %d"),sides);
        lp->PrintText(lp->GetActiveFont(),nmb,FORMAT_RIGHT);
        lp->Line(PS_SOLID,5,RGB(230,200,20));
        lp->LF();
    }
    else //if footer

    {
        CString>nmb;
        nmb.Format(_T("Page %d"),sides);
        lp->PrintText(lp->GetActiveFont(),nmb,FORMAT_CENTER);
        lp->LF(lp->GetActiveFont());
        lp->LF(lp->GetActiveFont());
    }
    lp->SetActiveFont(af);
    lp->SetTextColor(tc);
}

To use tables, one has to define the column widths and alignment. Some helper code has been developed for this purpose. Just fill in the vector with the column's data and pass it to the SetTableColumns() function. Optional parameters will force the columns to occupy complete space between the margins:

vColData vd;
vd.push_back(Col(300,FORMAT_CENTER));
vd.push_back(Col(100,FORMAT_LEFT));
vd.push_back(Col(300,FORMAT_CENTER));
...
prt.SetTableColumns(vd);
//prt.SetTableColumns(vd,TRUE); //fit width

Points of interest

More details about all of the functions can be found in the demo project. Note that print preview is not developed yet. Please, if you see any problems with these classes, feel free to send questions. Good luck!

History

  • 23 July, 2007 -- Original version posted

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Ivan Markovic


Member
Likes C++, templates, patterns, sarmas and loves Luka and Jelena
Occupation: Web Developer
Location: Yugoslavia Yugoslavia

Other popular Printing articles:

Article Top
You must Sign In to use this message board.
FAQ FAQ 
 
Noise Tolerance  Layout  Per page   
 Msgs 1 to 15 of 15 (Total in Forum: 15) (Refresh)FirstPrevNext
GeneralWhat program on a screenshot you used for the virtual printer? PinmemberAlexander Shevchenko9:57 1 Sep '07  
GeneralCan I use your code freely? Pinmember_flix01_8:31 24 Aug '07  
GeneralRe: Can I use your code freely? Pinmember_flix01_3:25 26 Aug '07  
GeneralRe: Can I use your code freely? PinmemberIvan Markovic21:49 26 Aug '07  
GeneralRe: Can I use your code freely? Pinmember_flix01_8:08 28 Aug '07  
GeneralRe: Can I use your code freely? PinmemberIvan Markovic22:17 28 Aug '07  
GeneralNice work! Thanks. PinmemberBui Tan Duoc21:01 17 Aug '07  
GeneralProblems Compiling in VS6.0 PinmemberMike Copeland6:27 1 Aug '07  
Generalnice work:) PinmemberRoman Cherednik4:23 1 Aug '07  
Questionusage for Visual Studio 8.0 PinmemberSiHot20:46 30 Jul '07  
AnswerRe: usage for Visual Studio 8.0 PinmemberIvan Markovic22:05 30 Jul '07  
GeneralNice work PinmemberETA21:46 24 Jul '07  
Generalgreat! Pinmemberhamo200822:03 23 Jul '07  
GeneralLooks nice! PinmvpHans Dietrich9:39 23 Jul '07  
GeneralRe: Looks nice! PinmemberIvan Markovic21:56 23 Jul '07  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 23 Jul 2007
Editor: Sean Ewington
Copyright 2007 by Ivan Markovic
Everything else Copyright © CodeProject, 1999-2009
Web18 | Advertise on the Code Project