VC5.0 为Windows 的程序员提供了一个很好的C++ 开发环境,减少了很多编程负担,但同时也为我们在
程序中加入自己的思想增加了难度。本人在一软件开发中,想控制文字打印时的字体,使字体大小缩小一倍,以节省打印纸。经过一段时间的摸索,终于解决了这一
问题,下面分几步向大家做一介绍。
---- 一、对VC5 自动生成的
程序框架进行改进
---- 这里用VC5 自动创建一个例子
程序Test,单文档界面,注意在最后一步修改view 的继承类为CEditView。
---- 在view 类中,VC5 已经自动创建了三个用于支持打印的函数:OnPreparePrinting,OnBeginPrinting,OnEndPrinting。为了实现我们的功能,需要再继承以下几个函数:OnPrepareDC,OnPrint。并将OnPrepareDC 和OnEndPrinting 改为如下实现:
// OnPrepareDC()
void CTestView::OnPrepareDC
(CDC* pDC, CPrintInfo* pInfo)
{
CView::OnPrepareDC(pDC, pInfo);
}
// OnEndPrinting()
void CTestView::OnEndPrinting
(CDC* pDC, CPrintInfo* pInfo)
{
CView::OnEndPrinting(pDC, pInfo);
}
---- 用CView 来替代原来的CEditView,用以避免CEidtView 对打印的控制。控制字体及输出的功能主要在OnBeginPrinting 和OnPrint 两个函数来实现。
---- 二、实现OnBeginPrinting 函数
---- 根据VC5 编程机制,在OnBeginPrinting 函数实现打印前的准备工作,包括设置打印字体,根据打印机当前页面尺寸计算所需页数等。下面的
程序是对打印字体的重新设置和计算所需打印纸页数。
----
程序中首先取得打印机的横向和纵向分辨率,再得到当前打印字体的大小,然后计算出新的字体大小,为默认字体的一半。读者可以根据需要设定自己的打印字体大小。
---- 接着,取得当前打印纸的宽度和高度,再根据新字体的宽度和高度计算出每行的最大字符数和每页的最大行数。
---- 由于打印文件中有些行的宽度可能超过每行的最大字符数,所以
程序中调用函数RedealTextData() 对打印文件进行重新整理,函数的实现在下面介绍。
---- 最后,
程序中计算并设置所需的打印页数。
OnBeginPrinting()函数实现如下:
//====================================
// OnBeginPrinting
//====================================
void CTestView::OnBeginPrinting(CDC* pDC,
CPrintInfo* pInfo)
{
//设置新的? 字体////////////////
//取打印机的横方向和纵方向的分辨率
//即每英寸点数
short cxInch = pDC- >GetDeviceCaps(LOGPIXELSX);
short cyInch = pDC- >GetDeviceCaps(LOGPIXELSY);
// 取当前字体大小
CFont *curFont = pDC- >GetCurrentFont();
LOGFONT curLogFont;
LOGFONT newLogFont;
curFont- >GetLogFont( &curLogFont );
long NewFontWidth = curLogFont.lfWidth;
long NewFontHeight = curLogFont.lfHeight;
newLogFont = curLogFont;
//计算新的字体大小--缩小一倍
newLogFont.lfWidth =(long)((float)NewFontWidth/2.0
* ((float)cxInch / 72.0));
newLogFont.lfHeight =(long)((float)NewFontHeight/2.0
* ((float)cyInch / 72.0));
//创建并设置新的字体,保留以前的字体
CFont newFont;
CFont *oldFont;
newFont.CreateFontIndirect(&newLogFont);
oldFont = pDC- >SelectObject(&newFont );
/////////////////////////////////
//根据字体宽度、高度计算
//每行最大字数及每页最大行数
//取打印纸张高度和宽度
int nPageHeight, nPageWidth;
nPageHeight = pDC- >GetDeviceCaps(VERTRES);
nPageWidth = pDC- >GetDeviceCaps(HORZRES);
TEXTMETRIC TextM;
pDC- >GetTextMetrics(&TextM);
//字体高度
m_LineHeight = (unsigned short)TextM.tmHeight;
//字体平均宽度
m_CharWidth=(unsigned short)
TextM.tmAveCharWidth;