VC视图的多页打印

 

 

MFC框架中内置了打印框架,已实现单页的打印,如果视图中只有一页图形,并依据像素打印视图,不需要添加任何代码就可直接使用,非常方便。侯捷的《深入浅出MFC》中对MFC的打印框架进行了剖析,详细讲解各函数之间的调用关系,但对多页打印,却并未讲解。下面研究如何实现多页打印。

1、页面布局

在界面区域较大时,我们需要多页打印,如Excel表的打印。当横向和纵向都无法打印在一页时,页面的布局可逐行排列,也可以逐列排列。页面布局的两种示意图如下所示。

1)逐行排列页面布局示意如下:

1

2

3

4

5

6

2)逐列排列页面布局示意如下:

1

3

5

2

4

6

 

2、设定页数

在打印前,需要先设定打印的页数,即根据整个视图的大小和页面的大小来计算页数。只要才打印前设置即可。下面是在子类中重载CView类的OnBeginPrinting函数,用于实现页数的计算,实现代码如下:

 

void CMultiPagePrintView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
{
	// TODO: add extra initialization before printing

	/*得到打印纸的像素大小*/
	int iPageWidth = pDC->GetDeviceCaps(HORZRES);
	int iPageHeight = pDC->GetDeviceCaps(VERTRES);
	
	/*得到窗口的大小*/
	CSize szTotalWnd = GetTotalSize();
	
	/*得到行和列的数量*/
	int iRowCnt = szTotalWnd.cy / iPageHeight;
	if (szTotalWnd.cy % iPageHeight > 0)
	{
		iRowCnt++;
	}
	int iColCnt = szTotalWnd.cx / iPageWidth;
	if (szTotalWnd.cx % iPageWidth > 0)
	{
		iColCnt++;
	}
	
	/*得到要打印的页数*/
	int iPageCnt = iRowCnt * iColCnt;
	pInfo->SetMaxPage(iPageCnt);
}


 

3、设置页面原点

在打印每一页的过程中,只需得到当前打印页面的页码,并计算出该页面原点对应的视图中的位置,然后调用CView::OnPrint即可完成打印。由于页面采用逐行排列和逐页排列时,页面对应的视图位置并不相同,因此,需要根据页面的排列模式分开计算。实现代码如下:

 
void CMultiPagePrintView::OnPrint(CDC* pDC, CPrintInfo* pInfo) 
{
	// TODO: Add your specialized code here and/or call the base class
	
	/*得到打印纸的像素大小*/
	int iPageWidth = pDC->GetDeviceCaps(HORZRES);
	int iPageHeight = pDC->GetDeviceCaps(VERTRES);
	
	/*得到窗口的大小*/
	CSize szTotalWnd = GetTotalSize();
	
	/*得到行和列的数量*/
	int iRowCnt = szTotalWnd.cy / iPageHeight;
	if (szTotalWnd.cy % iPageHeight > 0)
	{
		iRowCnt++;
	}
	int iColCnt = szTotalWnd.cx / iPageWidth;
	if (szTotalWnd.cx % iPageWidth > 0)
	{
		iColCnt++;
	}
	
	/*得到当前页的行和列编号,起始编号均为0*/
	int iPageRowIdx = 0;
	int iPageColIdx = 0;

	if (LAYOUT_BY_ROW == m_iPageLayout)
	{
		iPageRowIdx = (pInfo->m_nCurPage-1) / iColCnt;
		iPageColIdx = (pInfo->m_nCurPage-1) % iColCnt;
	}
	else
	{
		iPageRowIdx = (pInfo->m_nCurPage-1) % iRowCnt;
		iPageColIdx = (pInfo->m_nCurPage-1) / iRowCnt;
	}

	
	/*得到当前页的原点*/
	CPoint ptOrgin(0,0);
	ptOrgin.x = iPageColIdx * iPageWidth;
	ptOrgin.y = iPageRowIdx * iPageHeight;
	pDC->SetWindowOrg(ptOrgin);
	
	CScrollView::OnPrint(pDC, pInfo);
}
 

 

4、示例程序

本文以像素分辨率为2480*3507A4打印纸为例,分别实现了逐行排列和逐列排列的打印。为了方便检验打印是否正确,在页面中标注了页码和当前页所在的界面的行和列,其中页面的起始值为1,而行和列的起始值为0

工程文件下载:

PUDN:http://www.pudn.com/downloads407/sourcecode/windows/control/detail1735047.html

CSDN:http://download.csdn.net/detail/xianyunhe1234/3937881

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值