VC实现打印预览功能1

在MFC中CView类已经封装好了打印相关的功能,我们只需要添加一些虚函数并加以处理即可。
需要添加的虚函数有:
public:
virtual void OnPrepareDC(CDC* pDC, CPrintInfo* pInfo = NULL);
protected:
virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
virtual void OnPrint(CDC* pDC, CPrintInfo* pInfo);
virtual void OnEndPrintPreview(CDC* pDC, CPrintInfo* pInfo, POINT point, CPreviewView* pView);
其中:
OnPrepareDC是公有类型的,此函数在输出到屏幕时会被调用,在打印和打印预览时也会被调用。
在输出到屏幕时是被CView::OnPaint()调用的,其函数原型为:
void CView::OnPaint()
{
 // standard paint routine
 CPaintDC dc(this);
 OnPrepareDC(&dc);
 OnDraw(&dc);
}
而在打印预览时是被:CPreviewView::OnDraw(CDC* pDC)调用的(其函数原型较长,故此忽略).很明显他是为准备设备上下文环境而被调用的。
当然如果在CView的派生类中添加了WM_PAINT事件则输出到屏幕时OnPrepareDC不会被调用。
在打印预览中以上函数调用的顺序为:
OnPreparePrinting-->OnBeginPrinting-->OnPrepareDC-->OnPrint-->OnEndPrintPreview-->OnEndPrinting.
如果在打印预览中窗口有变动则OnPrepareDC-->OnPrint重复调用.
根据如上过程,我们可以在OnPreparePrinting函数中准备打印信息CPrintInfo* pInfo;
在OnPrint中添加打印信息,当然要去掉OnPrint函数中CView::OnPrint(pDC, pInfo);的调用。CView::OnPrint(pDC, pInfo);它会调用CView类中的OnDraw函数,其函数原型是:
void CView::OnPrint(CDC* pDC, CPrintInfo*)
{
 ASSERT_VALID(pDC);
 // Override and set printing variables based on page number
 OnDraw(pDC);                    // Call Draw
}
如果打印多页的话可以根据CPrintInfo* pInfo的信息在OnPrint函数中进行不同的输出,如:
if(pInfo->m_nCurPage==1){
 输出
}
else if(pInfo->m_nCurPage==2){
 输出
}
由于打印机的分辨率通常要比屏幕的分辨率大得多。假如同样的一条输出语句,在屏幕上输出为1厘米,在打印机上可能就是很短的距离。因此,在输出打印信息时,需要设置一定的输出比例。可以利用CDC的GetDeviceCaps方法间接获取打印机与屏幕的分辨率。该方法如下:
int GetDeviceCaps(int nIndex)const;
参数说明:
nIndex:标识方法返回信息的类型。LOGPIXELSX是当前CDC对象,表示设备水平方向每英寸的像素数量.LOGPIXELSY是当前CDC对象,表示设备垂直方向每英寸的像素数量.
当窗口的CDC对象调用GetDeviceCaps(LOGPIXELSX)方法时,返回的是屏幕水平方向每英寸的像素数量.当打印机的CDC对象调用GetDeviceCaps(LOGPIXELSX)方法时,返回的是打印机水平方向每英寸的像素数量.将这两种方法返回的数据相除就可以获得打印机与屏幕的分辨率比率了。
通常可以在CView类的OnDraw方法中获取屏幕每英寸的像素量,代码如下:
screenx=pDC->GetDeviceCaps(LOGPIXELSX);
screeny=pDC->GetDeviceCaps(LOGPIXELSY);
在CView类的OnBeginPrinting方法中获得打印机每英寸的像素数量,代码如下:
printx=pDC->GetDeviceCaps(LOGPIXELSX);
printy=pDC->GetDeviceCaps(LOGPIXELSY);
xrate=(double)printx/screenx;
yrate=(double)printy/screeny;
在OnDraw函数的输出语句与OnPrint中的输出语句稍微有点变化,如在OnDraw中输出语句为:
pDC->TextOut(100,100,"wjh");
在OnPrint中要改为:
pDC->TextOut((int)100*xrate,(int)100*yrate,"wjh");
当然字体也要放大。

发布了91 篇原创文章 · 获赞 2 · 访问量 21万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览