| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 424 人关注过本帖
标题:求助,我想要用VC对一个打印程序进行修改,高手帮忙,详见内容,谢谢了!! ...
取消只看楼主 加入收藏
zaknafein
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2007-12-20
收藏
 问题点数:0 回复次数:0 
求助,我想要用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]]
搜索更多相关主题的帖子: 打印 
2007-12-20 09:21
快速回复:求助,我想要用VC对一个打印程序进行修改,高手帮忙,详见内容,谢谢了 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025447 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved