CRichEdit打印问题

gmsgms 2010-01-28 02:56:54
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();

以上是部分代码,打印CRichEdit控件中的内容,用(long)ceil((float)CharRange/(float)m_RichEdit.FormatRange( &fr, TRUE ))计算总页数,有时打印多出一个空白页,有时没有空白页。
请问高手:
如何精确地计算出总页数;
或者用do-while循环如何设定循环结束的条件。
...全文
131 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
cem_uestc 2012-03-04
  • 打赏
  • 举报
回复
如何连续打印,对于连续进纸的针式打印机?
两页连续打印,中间留一大片空白
gmsgms 2010-01-31
  • 打赏
  • 举报
回复
up
gmsgms 2010-01-30
  • 打赏
  • 举报
回复
打印的内容是有格式的。
fengrx 2010-01-29
  • 打赏
  • 举报
回复
换个思路吧,打印前判断下有没有要打印的数据。
gmsgms 2010-01-29
  • 打赏
  • 举报
回复
up
gmsgms 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fengrx 的回复:]
换个思路吧,打印前判断下有没有要打印的数据。
[/Quote]怎样判断啊?
gmsgms 2010-01-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 fandh 的回复:]
多出的空白页,可能是你里面多出的回车吧!计算前,建议去掉最后的回车!
[/Quote]最后一行没有回车。
fandh 2010-01-28
  • 打赏
  • 举报
回复
多出的空白页,可能是你里面多出的回车吧!计算前,建议去掉最后的回车!
fandh 2010-01-28
  • 打赏
  • 举报
回复
汗,看错了!
fandh 2010-01-28
  • 打赏
  • 举报
回复
long lNum = (long)((float)CharRange/(float)m_RichEdit.FormatRange( &fr, TRUE )+0.5f);
这样试试!

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧