16,548
社区成员




long CharRange = 0;
long LastChar = 0;//will store document length
FORMATRANGE fr; //format range structure
::ZeroMemory(&fr, sizeof(FORMATRANGE));
fr.hdc = hdcPrinter;
fr.hdcTarget = hdcPrinter; //Set member in FormatRange struct
//This bit here will get all the dimentions of the printer setup
int nHorizRes = dcPrinter.GetDeviceCaps(HORZRES), //width P in MM
nVertRes = dcPrinter.GetDeviceCaps(VERTRES), //hight in raster lines
nLogPixelsX = dcPrinter.GetDeviceCaps(LOGPIXELSX), //pixels per inch along x
nLogPixelsY = dcPrinter.GetDeviceCaps(LOGPIXELSY); //pixels per inch along y
//set the printable area of printer in the FormatRange struct
fr.rcPage.left = 0; //these 2 mean top left
fr.rcPage.top = 0;
fr.rcPage.right = (nHorizRes/nLogPixelsX) * 1440;//these 2 mean bottom right
fr.rcPage.bottom = (nVertRes/nLogPixelsY) * 1440; //equation changes pixel to TWIPS
// Set up some margins all around. Make them one inch
//results vary on printers depending on setup
fr.rc.left = fr.rcPage.left + 1440; // 1440 TWIPS = 1 inch.
fr.rc.top = fr.rcPage.top + 1440;
fr.rc.right = fr.rcPage.right - 1440;
fr.rc.bottom = fr.rcPage.bottom - 1440;
//select all text for printing
CHARRANGE cr;
cr.cpMin =0;
cr.cpMax = -1;//-1 selects all
fr.chrg = cr;//set this in FormatRange struct
//get length of document, used for more than one page
CharRange = m_RichEdit.GetTextLength();
long lNum = (long)ceil((float)CharRange/(float)m_RichEdit.FormatRange( &fr, TRUE )); //total pages
for(long l = 0; l < lNum; l++)
{
dcPrinter.StartPage(); ///start the page
LastChar = m_RichEdit.FormatRange( &fr, TRUE );//send text to DC, and record index of last fitting char
cr.cpMin = LastChar;//Change charrange struct for next page
cr.cpMax = CharRange; //using last char printed
fr.chrg = cr; //set that in formatrange struct
dcPrinter.EndPage();
}
dcPrinter.EndDoc();