求助,我想要用VC对一个打印程序进行修改,高手帮忙,详见内容,谢谢了!!!
我想用VC对一个打印程序进行修改,这个程序是收银机上用的,以前用的窄小票纸,现在换成宽的了,原来是以“货号 品名 数量 价格”这样的形式打印的,现在要变成“货号 品名 数量 价格”一行打印,但是遇到一个问题就是商品名称过长时,会造成数量和价格被挤到下一行,现在希望在打印的时候将品名限制在一定的字符范围内,超出部分删除不打印,请问怎么修改?
这部分的代码如下:int GetPrintFormatString(const char *szInput, char* szOutput, int nMaxLen) {
if ( strlen(szInput) <= nMaxLen ) {
strcpy(szOutput, szInput);
} else {
//统计非中文数字
int nVISCount = 0;
for ( int i = 0; i < nMaxLen; i ++ ) {
if ( i < nMaxLen && szInput[i] != '\0' ) {
if ( (unsigned char)szInput[i] < 0x7f )
nVISCount ++;
} else
break;
}
memset(szOutput, 0, nMaxLen + 1);
strncpy(szOutput, szInput, nMaxLen - (nVISCount%2));
if ( nVISCount%2 == 1 && (unsigned char)szInput[nMaxLen-1] <= 0x7f ) {
szOutput[nMaxLen-1] = szInput[nMaxLen-1];
szOutput[nMaxLen] = 0;
}
}
int nLeftChars = strlen(szInput)-strlen(szOutput);
//将空余的填充空格
int i = strlen(szOutput);
for ( ; i < nMaxLen; i ++ ) {
szOutput[i] = ' ';
}
szOutput[i] = '\0';
return nLeftChars;
}
//获得包含多个同字符的字符串
void GetPrintChars(char *szOutput, int nMaxLen, int nCharsNum, bool bRightAlign)
{
memset(szOutput, 0, nMaxLen + 1);
if(bRightAlign)
{
memset(szOutput, ' ', nMaxLen - nCharsNum);
memset(szOutput + nMaxLen - nCharsNum, '-', nCharsNum);
}
else
{
memset(szOutput, '-', nCharsNum);
}
}
// 将一个项格式化成打印字符串序列
// 可能多行,需要自己去折
void GetPrintFormatLines(const char *szVar, const char *szFix, char *szOutput, int nMaxLen) {
memset(szOutput, 0, nMaxLen + 1);
strncpy(szOutput, szVar, nMaxLen);
int nInLen = strlen(szVar);
int nOutLen = strlen(szOutput);
char *pt = szOutput;
if ( nInLen == nOutLen ) {
int i = 0;
pt += nOutLen;
//先判断是否够固定长度
if ( nMaxLen - nOutLen >= strlen(szFix) ) {
for ( i = nOutLen; i < nMaxLen - strlen(szFix); i ++ ) {
*(pt++) = ' ';
}
memcpy(pt, szFix, strlen(szFix));
pt += strlen(szFix);
*pt = '\0';
} else {
for ( i = nOutLen; i < nMaxLen; i ++ ) {
*(pt++) = ' ';
}
//再新启一行
for ( i = 0; i < nMaxLen - strlen(szFix); i ++ ) {
*(pt++) = ' ';
}
memcpy(pt, szFix, strlen(szFix));
pt += strlen(szFix);
*pt = '\0';
}
} else if ( nInLen > nOutLen ) {
//统计中文字符个数,用来保证中文不被截断
int nVISCount = 0;
for ( int i = 0; i < nOutLen; i ++ ) {
if ( (unsigned char)szOutput[i] > 0x7f )
nVISCount ++;
}
//如果中文数为奇数,则表示最后一个中文被截断,需要把倒数第二个也截断了,填上空格
if ( nVISCount % 2 == 1 ) {
szOutput[nOutLen-1] = ' ';
}
pt = (char *)szVar;
pt += nOutLen;
pt -= ((nVISCount % 2) == 1) ? 1 : 0;
GetPrintFormatLines( pt, szFix, szOutput + strlen(szOutput), nMaxLen);
}
}
//将打印字符串按照对齐方式格式化
// nAlign = DT_RIGHT / DT_CENTER
void GetPrintFormatAlignString(const char *szInput, char* szOutput, int nMaxLen, int nAlign) {
int nTotalSpace = nMaxLen - strlen(szInput);
if ( nTotalSpace > 0 ) {
int nLeftSpaceCount = 0, nRightSpaceCount = 0;
if ( nAlign == DT_CENTER ) {
nLeftSpaceCount = nTotalSpace/2;
nRightSpaceCount = nTotalSpace - nLeftSpaceCount;
} else {
nLeftSpaceCount = nTotalSpace;
nRightSpaceCount = 0;
}
char *pt = szOutput;
for ( ; nLeftSpaceCount > 0; nLeftSpaceCount -- ) {
*(pt++) = ' ';
}
memcpy(pt, szInput, strlen(szInput));
pt += strlen(szInput);
// for ( int i = 0; i < nRightSpaceCount; i ++ ) {
// *(pt++) = ' ';
// }
*pt = '\0';
} else {
strcpy(szOutput, szInput);
}
}
各位。。跪求啊,在线等,谢谢大侠们了!
[[italic] 本帖最后由 zaknafein 于 2007-12-20 09:42 编辑 [/italic]]