xbgs

C++博客 首页 新随笔 联系 聚合 管理
  7 Posts :: 0 Stories :: 13 Comments :: 0 Trackbacks
    在对话框程序的打印功能中,如果使用针式打印机,那么你可能希望连续打印的多个表中不换页。我们知道,在使用打印功能的时候,每当 dc.startpage()就会开始一页的打印,而dc.endpage()就会结束一页的打印,那么如何能使多个dc.startpage()与 dc.endpage()不换页而实现连续打印呢,方法如下: 假设我们要打印m_nTotalNum个表,每个表有m行,那么要实现m_nTotalNum个表连续打印不换页可以如下实现:(由于打印机制问题,在打满一张后是必须要换页的,我们的做法是在换页的地方让给它留出一定的空白,不太影响表的连续性)
/////////////主函数
void CDlgTest::PrintOneNum() 
{
CDC dc;
CPrintDialog printDlg(FALSE);
CPrintInfo Info;
printDlg.GetDefaults();
dc.Attach(printDlg.GetPrinterDC());
dc.m_bPrinting=TRUE;
CString strTitle;
strTitle.LoadString(AFX_IDS_APP_TITLE);
DOCINFO di;
::ZeroMemory(&di,sizeof(DOCINFO));
di.cbSize=sizeof(DOCINFO);
di.lpszDocName=strTitle;
if(dc.m_hDC)
{
BOOL bPrintingOk=dc.StartDoc(&di);
CPrintInfo Info;
m_nCurrentNum_WhenPrint=1; //当前表数为1,这个用来控制打印的表数
int nPageTotalScale=0; //初始化从0开始
Info.m_nCurPage=1; //从第一页开始
dc.StartPage(); //开始打印页
for(;;)
{
//打印完需要的表数m_nTotalNum则退出循环
if(m_nCurrentNum_WhenPrint >m_nTotalNum) break;
else //打印一张表
{
nPageTotalScale=OnPrintReport (&dc,&Info,nPageTotalScale, m_nCurrentNum_WhenPrint);
m_nCurrentNum_WhenPrint ++;
nPageTotalScale+=30; //打印下一张表的行距从+30开始
}
}
bPrintingOk=(dc.EndPage()>0); //结束一页
m_nCurrentNum_WhenPrint =0;
if(bPrintingOk)
dc.EndDoc();
else
dc.AbortDoc();
}
else
{
MessageBox("请检查打印机是否连接完好?","我的程 序",MB_ICONEXCLAMATION);
}
dc.Detach();
}

/////////////打印函数
int CdlgTest::OnPrintReport(CDC *pDC, CPrintInfo *pInfo, 
int nXBasePointWhenPrint, int m_nCurrentNum_WhenPrint)
{
int nXCurrentPoint=nXBasePointWhenPrint; //进行行控制的变量
//--------换页---------
if(nXCurrentPoint+210> 2000) //210为将要占用的长度
{
pDC->EndPage();
pDC->StartPage();
nXCurrentPoint=0;
pInfo->m_nCurPage++;
}
nXCurrentPoint+=210;
pDC->TextOut(0,nXCurrentPoint,"我的报表内容,从0-210的表长度 ");
//每当打印的输出要换行的时候就要判断if(nXCurrentPoint+将要使用的高度> 2000)2000为规定的一张纸的高度。 如果大于纸张高度就要换页。这样就保证打印内容连续。
return nXCurrentPoint; //最后返回打印完当前表时当前的页面高度,
以便下一张表接着这个高度打印

}
posted on 2006-06-23 23:18 让心飞翔 阅读(958) 评论(0)  编辑 收藏 引用 所属分类: 编程经验

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理