VC5打印字体的控制
2008-11-13 19:32:24 来源:WEB开发网---- RedealTextData 函数根据每行最大宽度对文件进行重新调整。主要是计算文件中每行的宽度,如果超过最大宽度则加入换行符(0x0d,0x0a)。函数实现如下:
//=======================================
// RedealTextData
//注:
//pDoc- >buffer为文件缓冲区
//pDoc- >file_length为文件字节长度
//pDoc- >TextLines为文件原行数
//pDoc- >MaxLineLength为文件原最大行字节宽度
//=======================================
void CTextView::RedealTextData()
{
CDocViewDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
short LineLengthMax = m_MaxLineChar;
unsigned short lines=0;
unsigned long i,j;
//申请新的缓冲区保存调整后的文件
long size = pDoc- >file_length + pDoc- >TextLines*
(pDoc- >MaxLineLength/m_MaxLineChar+1);
m_newBuffer = new char [size ];
LPSTR newTempPtr = m_newBuffer;
m_file_length =pDoc- >file_length;
//保存文件新的行数
m_lines = 1;
i = 0;
//记录当前行的宽度
short theLineLength=0;
//记录当前行中汉字字节数,
//以防止将一半汉字分为两行
unsigned short halfChinese=0;
while(i < pDoc- >file_length)
{
*newTempPtr++ = pDoc- >buffer[i];
j=i+1;
if( (pDoc- >buffer[i] == 0x0d && pDoc- >buffer[j] == 0x0a))
{
m_lines++;
theLineLength = 0;
}
else
{
//如果是TAB字符,宽度加8
if(pDoc- >buffer[i] == VK_TAB)
theLineLength += 8;
else
{
//大于0xa1的字节为汉字字节
if((unsigned char)pDoc- >buffer[i] >= 0xa1)
halfChinese++;
theLineLength++;
}
//如果行宽大于每行最大宽度,进行特殊处理
if(theLineLength > LineLengthMax)
{
char buff[256];
short m=255;
newTempPtr--;
if((unsigned char )*newTempPtr < 0xa1)
{
//如果当前字符的前一个字符是数字、
//字母或一些特殊的前置符号时,
//指针循环向前取,
//以防止将一个单词分为两行。
while((*newTempPtr >=0 && *newTempPtr< =9)||
(*newTempPtr >=a && *newTempPtr < = z) ||
(*newTempPtr >=A && *newTempPtr < = Z) ||
*newTempPtr == _ || *newTempPtr == * ||
*newTempPtr == ^ || *newTempPtr == ~ )
buff[m--] = *newTempPtr--;
}
else //汉字
{
//防止将一个汉字分为两行。
if(halfChinese%2)
buff[m--] = *newTempPtr--;
}
newTempPtr++;
//加入换行符,分为两行
*newTempPtr++ = 0x0d;
*newTempPtr++ = 0x0a;
for(short k=m+1; k< 256; k++)
*newTempPtr++ = buff[k];
m_lines++;
theLineLength = 0;
m_file_length += 2;
}
}
i++;
}
}
更多精彩
赞助商链接