WEB开发网
开发学院软件开发VC VC5打印字体的控制 阅读

VC5打印字体的控制

 2008-11-13 19:32:24 来源:WEB开发网   
核心提示: 三、实现OnPrint 函数 在OnPrint 函数中实现真正的文字输出,主要功能包括设置打印字体大小,VC5打印字体的控制(4),计算当前页号文字输出位置,以及文字的输出打印,保留以前的字体CFont newFont;CFont *oldFont;newFont.CreateFontI

---- 三、实现OnPrint 函数

---- 在OnPrint 函数中实现真正的文字输出,主要功能包括设置打印字体大小,计算当前页号文字输出位置,以及文字的输出打印。

---- 程序中首先计算打印区域,文字在这个打印区域内输出。然后设置新的打印字体。

---- 由于OnPrint 函数是每打印一页被调用一次,所以需要根据当前打印页号计算出当前页的文字在整个文字缓冲区的起始偏移量和终止偏移量。这里程序中调用了函数GetOffset(),此函数在下面介绍。

---- 最后调用Windows 的DrawText() 函数实现文字的输出。

OnPrint()函数实现如下:

//====================================
// OnPrint
//========================================
void CTestView::OnPrint(CDC* pDC,
CPrintInfo* pInfo)
{
//计算打印区域//////////////////
long yTopOfPage =(pInfo- >m_nCurPage -1) *
m_LinesPerPage * m_LineHeight;
//左边空出两个字符宽度
pDC- >SetViewportOrg(m_CharWidth * 2,
-yTopOfPage);
int nPageWidth = pDC- >GetDeviceCaps(HORZRES);
CRect rectClip = CRect(0,
yTopOfPage,
nPageWidth,
yTopOfPage + m_LinesPerPage *
m_LineHeight);
/////设置缩小字体///////////////////
//取打印机的横方向和纵方向的分辨率
//即每英寸点数
short cxInch=pDC- >GetDeviceCaps(LOGPIXELSX);
short cyInch= DC- >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 );
/////文字打印输出/////////////////
unsigned short CurrentStartLine ,
CurrentEndLine;
long StartPrintOffset,
EndPrintOffset,
PrintSize;
LPSTR tempPtr;
RECT rect1,rect2;
//根据当前打印页号计算文字起始行
CurrentStartLine=(pInfo- >m_nCurPage-1) * m_LinesPerPage;
//文字终止行
CurrentEndLine = CurrentStartLine+m_LinesPerPage;
if(CurrentEndLine > m_lines)
CurrentEndLine = m_lines;
//计算打印文字的起始位置和终止位置
StartPrintOffset=GetOffset(m_newBuffer,
m_file_length, CurrentStartLine);
EndPrintOffset = GetOffset(m_newBuffer,
m_file_length,CurrentEndLine);
PrintSize = EndPrintOffset - StartPrintOffset;
tempPtr = m_newBuffer + StartPrintOffset;
//文字输出
pDC- >DrawText(tempPtr, PrintSize,
&rectClip,
DT_NOCLIP |DT_NOPREFIX
|DT_EXPANDTABS);
//还原旧的打印字体
pDC- >SelectObject(oldFont );
}

---- 程序中的GetOffset 函数是根据给定的行号计算文字的位置,其实现如下:

//========================================
// GetOffset ()
//========================================
long CTestView::GetOffset(LPSTR buffer,
long buffer_length,
unsigned short StartLine)
{
if(StartLine == 0) return 0;
unsigned short lines=0;
long i,j;
i = 0;
while(i < buffer_length)
{
j=i+1;
if( (buffer[i++] == 0x0d && buffer[j] == 0x0a))
{
lines++;
if(lines == StartLine)
return i;
}
}
return buffer_length;
}

---- 以上是本人在编程中的一点心得,欢迎和大家共同交流。

上一页  1 2 3 4 

Tags:VC 打印 字体

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接