MFC打印技术CPrintDlg

例如,打印超市小票

// 打印小票
void COnTheStageDlg::Print(CString sYje, CString sSje, CString sZl)
{
    CTime time = CTime::GetCurrentTime();
    CString sql, ph, xsph;
    //判断今天的票号,并递增
    sql.Format(_T("select XSPH from TB_SELL where TO_CHAR(XSSJ,‘MMDDYYYY‘)=‘%s‘ order by XSPH"), time.Format("%m%d%Y"));
    AdoConn adoConn;
    adoConn.InitConnect();
    adoConn.m_pRs = adoConn.GetRecordSet((_bstr_t)sql);
    if (!adoConn.m_pRs->adoEOF)
    {
        adoConn.m_pRs->MoveLast();
        ph = (TCHAR*)(_bstr_t)adoConn.m_pRs->GetCollect("XSPH");
        xsph.Format(_T("XS%s%04d"), time.Format("%y%m%d"), _ttoi(ph.Right(4)) + 1);
    }
    else
        xsph.Format(_T("XS%s0001"), time.Format("%y%m%d"));

    //插入记录到数据库 表 tb_sell
    CString spbh, spmc, spjm, splb, txm, xssl, xsdj, xssj;
    for (int i = 0, n = m_Grid.GetItemCount(); i<n; i++)
    {
        spbh = m_Grid.GetItemText(i, 0);
        spmc = m_Grid.GetItemText(i, 1);
        spjm = m_Grid.GetItemText(i, 2);
        splb = m_Grid.GetItemText(i, 3);
        txm = m_Grid.GetItemText(i, 4);
        xssl = m_Grid.GetItemText(i, 5);
        xsdj = m_Grid.GetItemText(i, 6);
        sql.Format(_T("insert into TB_SELL(XSPH,SPBH,SPMC,SPJM,SPLB,TXM,XSSL,SPDJ,XSSJ)\
            values(‘%s‘,‘%s‘,‘%s‘,‘%s‘,‘%s‘,‘%s‘,%d,%f,TO_DATE(‘%s‘,‘MMDDYYYY HH24:MI‘))"),
            xsph, spbh, spmc, spjm, splb, txm, _ttoi(xssl), _ttof(xsdj), time.Format("%m%d%Y %H:%M"));
        adoConn.ExecuteSql((_bstr_t)sql);
    }
    adoConn.ExitConnect();

    const int MAX_SIZE_SP = 100;//所能打印的商品最大数量
    const int MAX_SIZE_COL = 5; //最大列数
    const int HEIGHT_ROW = 20;//每行的标准高度
    const int MAX_SIZE_ROW = 40;//每页的最大行数
    const int LEFT_LOC = 5;//打印的左边位置
    const int RIGHT_LOC = 220;//打印的最右边的坐标位置
    const int TOP_LOC = 10;//打印的最上边的坐标位置
    const int BOTTOM_LOC = TOP_LOC + MAX_SIZE_ROW * HEIGHT_ROW;//打印的最下边的坐标位置,超过了换下一页(40行换页)

    CDC* pDC = GetDC();
    int screenx = pDC->GetDeviceCaps(LOGPIXELSX);//沿屏幕宽度每逻辑英寸的像素数,在多显示器系统中,该值对所显示器相同;
    int screeny = pDC->GetDeviceCaps(LOGPIXELSY);//沿屏幕高度每逻辑英寸的像素数,在多显示器系统中,该值对所显示器相同;
    CPrintDialog m_printdlg(FALSE);
    if (m_printdlg.DoModal() == IDOK)
    {
        CDC dc;
        dc.Attach(m_printdlg.GetPrinterDC());
        //查询打印设备的信息,每逻辑英寸的像素数
        int printx = dc.GetDeviceCaps(LOGPIXELSX);
        int printy = dc.GetDeviceCaps(LOGPIXELSY);
        double ratex = (double)(printx) / screenx;
        double ratey = (double)(printy) / screeny;

        CString str[MAX_SIZE_SP + 1][MAX_SIZE_COL];
        int i = 0;
        str[i][0] = _T("商品编号");
        str[i][1] = _T("商品名称");
        str[i][2] = _T("销售数量");
        str[i][3] = _T("销售单价");
        str[i][4] = _T("销售金额");
        ++i;
        double sum = 0;
        CString strsum;
        for (int nCount = m_Grid.GetItemCount(); i <= (MAX_SIZE_SP < nCount ? MAX_SIZE_SP : nCount); i++)
        {
            str[i][0] = m_Grid.GetItemText(i - 1, 0);//商品编号
            str[i][1] = m_Grid.GetItemText(i - 1, 1);//商品名称
            str[i][2] = m_Grid.GetItemText(i - 1, 5);//销售数量
            str[i][3] = m_Grid.GetItemText(i - 1, 6);//销售单价
            str[i][4].Format(_T("%0.2f"), _ttoi(str[i][2])*_ttof(str[i][3]));//数量*单价
        }
        dc.StartDoc(_T("printstart"));
        CFont pfont;
        pfont.CreatePointFont(110, L"宋体", &dc);
        int x, y;
        x = LEFT_LOC; y = TOP_LOC;
        dc.TextOut((int)ratex * x, (int)ratey * y, _T("XX超市"));
        y = y + HEIGHT_ROW;
        dc.TextOut((int)ratex * x, (int)ratey * y, _T("销售票号:") + xsph);
        y = y + HEIGHT_ROW;
        dc.TextOut((int)ratex * x, (int)ratey * y, _T("销售时间:") + time.Format("%Y-%m-%d %H:%M:%S"));
        y += HEIGHT_ROW;
        //画两根线
        y += 2;
        dc.MoveTo((int)ratex * LEFT_LOC, (int)ratey * y);
        dc.LineTo((int)ratex * RIGHT_LOC, (int)ratey * y);
        y += 2;
        dc.MoveTo((int)ratex * LEFT_LOC, (int)ratey * y);
        dc.LineTo((int)ratex * RIGHT_LOC, (int)ratey * y);
        y += 2;

        //打印所有商品信息
        for (int k = 0; k < i; ++k)
        {
            if (y>BOTTOM_LOC)
            {
                y = TOP_LOC;
                dc.EndPage();
                dc.StartPage();
            }
            for (int j = 0; j < MAX_SIZE_COL; j++)
            {
                if (j < 2)
                {
                    dc.TextOut((int)ratex*(LEFT_LOC + j * 80), (int)ratey * y, str[k][j]);
                }
                else
                {
                    dc.TextOut((int)ratex*(LEFT_LOC + (j - 2) * 80), (int)ratey * (y + HEIGHT_ROW), str[k][j]);
                }
            }
            y += 2 * HEIGHT_ROW;

            if (0 == k)
            {//画一条红色的虚线
                CPen pen(PS_DOT, 1, RGB(200, 0, 0));
                CPen* pOld = dc.SelectObject(&pen);
                y += 1;
                dc.MoveTo((int)ratex * LEFT_LOC, (int)ratey * y);
                dc.LineTo((int)ratex * RIGHT_LOC, (int)ratey * y);
                dc.SelectObject(pOld);
                y += 1;
            }
        }
        //画两根线
        y += 2;
        dc.MoveTo((int)ratex * LEFT_LOC, (int)ratey * y);
        dc.LineTo((int)ratex * RIGHT_LOC, (int)ratey * y);
        y += 2;
        dc.MoveTo((int)ratex * LEFT_LOC, (int)ratey * y);
        dc.LineTo((int)ratex * RIGHT_LOC, (int)ratey * y);
        y += 2;

        //打印金额
        CRect rc((int)ratex * LEFT_LOC, (int)ratey * y, (int)ratex * RIGHT_LOC, (int)ratey * (y + HEIGHT_ROW));
        dc.DrawText(_T("应收金额:") + sYje, rc, DT_RIGHT);

        CFont font2;
        font2.CreatePointFont(1200, _T("楷体"));
        CFont* pOld = dc.SelectObject(&font2);
        y += HEIGHT_ROW;
        CString strTemp = _T("实收:") + sSje;
        CSize sz = dc.GetTextExtent(strTemp);
        rc.SetRect((int)ratex * LEFT_LOC, (int)ratey * y, (int)ratex * RIGHT_LOC, (int)ratey * y + sz.cy);
        dc.DrawText(strTemp, rc, DT_RIGHT);
        dc.SelectObject(pOld);

        rc.SetRect((int)ratex * LEFT_LOC, (int)ratey * y + sz.cy + 2, (int)ratex * RIGHT_LOC, (int)ratey * (y + HEIGHT_ROW) + sz.cy + 2);
        dc.DrawText(_T("找零:") + sZl, rc, DT_RIGHT);

        //谢谢惠顾,欢迎下次光临
        int loc = (int)ratey * (y + HEIGHT_ROW) + sz.cy + 2;
        rc.SetRect((int)ratex * LEFT_LOC, loc, (int)ratex * RIGHT_LOC, loc + (int)ratey * HEIGHT_ROW);
        dc.DrawText(_T("谢谢惠顾,欢迎下次光临"), rc, DT_CENTER);

        dc.EndDoc();
        pfont.DeleteObject();
    }
    ReleaseDC(pDC);
}

********************

原文地址:https://www.cnblogs.com/htj10/p/12343164.html

时间: 2024-11-14 11:59:45

MFC打印技术CPrintDlg的相关文章

重庆用3D打印技术修复世界最大千手观音

近日,重庆市大足石刻景区在千手观音主尊修复工程中首次引入3D打印技术.记者在修复现场看到,缩小版的千手观音主尊像的3D打印模型比例为1:3,打印模型主要用于主尊像的形态修复.? 重庆市大足县宝顶山千手观音雕刻于南宋中后期,距今有800多年历史.整个石刻佛像,包括一个千手观音主尊和四个侍者,有7.7米高.12.5米宽.刻在15?30米高的悬崖上,覆盖了近88平米的崖面,是世界上最大的千手观音雕像.精密拋光? 这次针对千手观音的大型修复工作,是由政府拨款进行的.研究人员没有采用传统的模具和铸造的方法

LAIKA公司应用ProJet 660 色彩3D打印技术改变3D动漫脸部定格动画

LAIKA公司应用 ProJet 660 色彩3D打印技术改变3D动漫脸部定格动画 通过使用彩色3D打印机,我们不仅能够推动面部表情效能提升到一个新的水平,同时我们也能实现人物的脸部的细节和微妙变化水平.布赖恩?麦克莱恩 - 如果你曾经想知道建立3D动画制作需要进行多少工作,得到的答案是"很多,很多" - 特别是如果工作依靠被称为停止运动的技术.定格动画需要动画师捕捉每个操纵建模字符拼凑一个流畅自然的动作.例如只是一秒的面部表情动作,可能12到24种不同的模型改变是必需的. 实现一站式

苹果公司欲使用3D打印技术进行新产品的测试

苹果公司的产品是很多人都在追随的,作为世界上最大的电子产品的企业来说,因为它的产品给了人们更好的用户体验.怎么才能做到这一点呢,这就源于他们的输入设计实验室,这里可以称之为最隐秘并且先进的原型测试实验室其中的一个.这里有很多非常精密的仪器,也有很多为了完美产品的工作人员,不管是从外观体验感以及性能他们都希望能够带给大家完美的产品. 在最近一次苹果公司的公关活动中,他们向媒体展示了这个实验室,让它从神秘不为人知的背后走到了人们的面前,一方面表现出他们对于产品性能测试的重视,同时也向人们说明他们对于

3D打印技术让实现更多天马行空的创意

在3D打印技术还没有出现的时候,我们脑海中一些天马行空的想象是没办法实现的.也有很多创意相关的工作人员在叹息,似乎有一种生不逢时的遗憾.近年来,随着3D打印技术越来越成熟,自由设计成为一种优势弥补了一些在传统制造业的不足,似乎个性化的定制才是一种时尚和潮流的标志.在这样的背景下,一大批充满着个性化的创意产品走入人们的生活,让人们对创意有了更新更奇特的了解. 不久前在微博上热传的一组雕塑图片被很多人转发.一些具有重庆本土特色的方言被创意者形象的刻在了雕塑上,所以当人们看到最终的作品时很有感触.这组

Citrix打印技术实现原理分析

本文基于Citrix的打印体系以及相关解决方案! 一.Windows打印体系以及Citrix嵌入的组件 Windows的打印体系主要由两大部分组成: 1.打印假脱机系统(Print Spooler) 2.打印机驱动程序 这两大部分是Window是打印系统的核心.同时,基于Windows打印体系所支持的打印图形接口以及打印机驱动程序的不同,Windows打印体系架构由有多个版本,分别为V1.V2和V3,其中V3是现目前最为常用的版本,而且Citrix UPD目前也是基于V3的版本构建,因此Citr

3D打印技术的研究成果-3D打印机厂家

3D打印技术,是以计算机三维设计模型为蓝本,通过软件分层离散和数控成型系统,利用激光束.热熔喷嘴等方式将金属粉末.陶瓷粉末.塑料.细胞组织等特殊材料进行逐层堆积粘结,最终叠加成型,制造出实体产品.与传统制造业通过摸具.车铣等机械加工方式对原材料进行定型.切削以最终生产成品不同,3D打印将三维实体变为若干个二维平面,通过对材料处理并逐层叠加进行生产.不需要众多的人力,直接从计算机图形数据中便可生成任何形状的零件,使生产制造得以向更广的生产人群范围延伸. 然而,通过专项研究,3D打印主要的技术形式有

3D打印技术之切片引擎(5)

[此系列文章基于熔融沉积( fused depostion modeling, FDM )成形工艺] 从这一篇文章开始,就开始说填充.在3D打印切片技术中,填充算法是最核心的部分.3D打印技术的常用的指标包括:打印速度,稳固性,柔韧性,逼真度,密度(关系着使用打印材料的多少),都与填充算法有着直接的关系.可以说衡量一个切片引擎的优劣主要看它的填充算法是否优越. 其实我开始研发切片引擎的时候,由于不是所有的模型打印都需要填充,所以前面的算法开发时间很短,大部分时间耗在了填充算法的研究上,也就是填充

MFC打印机制

MFC 打印程序的编制 MFC 在实现打印编程工作时已经建立了一个已有的框架,我们只要往这个框架里面填东西即可. 打印工作其实就是在 DC 上绘图,不过这里的 DC 是打印机的 DC ,明确这一点之后,想当然的,我们打印的任务可以分为获取打印机 DC .根据打印机驱动让用户交互设置打印参数.开始打印.打印的具体过程(分页.绘制等).结束打印.释放 DC .以下通过一段示列代码来说明: // 打印控制函数 void print() { CPrintDialog dlg(FALSE,PD_ALLPA

3D打印技术之切片引擎(1)

切片引擎,是3D打印技术的灵魂,其实质就是将3D模型进行分层,输出矢量集合,是应该归为图形学的一门技术,其对数学算法要求很高,复杂性主要体现在要对3D模型的不同的拓扑结构做出判断并输出与之相符合的矢量集合.就我个人的观点,目前世界上最优秀的切片引擎在这一点上也没有做的很好,所以对于这一门技术,可进步的空间是很大的,未知的空间非常辽阔. 非常有幸的是在我的上一家公司里面,我有机会开发这样的一个模块,我负责由3D模型生成矢量集合,另一位同事把我生成的矢量集合再生成为Gcode,据我所知,目前国内还没