zoukankan      html  css  js  c++  java
  • 戏说 .NET GDI+系列学习教程(三、Graphics类的应用_打印收银小票)

            #region 打印
    
            /// <summary>
            /// 打印字符串内容
            /// </summary>
            /// <returns></returns>
            public string GetPrintStr()
            {
                StringBuilder sb = new StringBuilder();
                int intLenMax = 16;
                if (!isScan)
                {
                    intLenMax = 28;
                }
                sb.Append("名称:" + CommonFunction.AutomaticLine(printGoods.goodsName.Trim(), 1, intLenMax));
                sb.Append("价格:" + printGoods.retailPrice + "");
                return sb.ToString();
            }
    
            /// <summary>
            /// 打印条形码图片
            /// 在生成条形码时,大小是不可以任意放大的,那么我们如果想任意改变条形码大小
            /// 思路:
            /// 1.把条形码生成为图片
            /// 2.改变条形码图片的大小就可以了
            /// </summary>
            /// <returns></returns>
            public System.Drawing.Image GetPrintImage()
            {
                BarcodeLib.Barcode b = new BarcodeLib.Barcode();
                //设置条形码宽度和高度
                int W = Convert.ToInt32(250);
                int H = Convert.ToInt32(80);
                //对齐方式:默认居中
                b.Alignment = BarcodeLib.AlignmentPositions.CENTER;
                //条码格式
                BarcodeLib.TYPE type = BarcodeLib.TYPE.CODE128;
                //显示生成条形码的内容
                b.IncludeLabel = true;
    
                b.RotateFlipType = RotateFlipType.RotateNoneFlipNone;
                //生成条形码内容的位置
                b.LabelPosition = BarcodeLib.LabelPositions.BOTTOMCENTER;
    
                System.Drawing.Font font = new System.Drawing.Font("verdana", 8f);//字体设置
                b.LabelFont = font;
    
                //b.Encode(条形码格式,要生成条形码的内容,条形码颜色,条形码背景色,宽度,高度)
                System.Drawing.Image image = b.Encode(type, printGoods.goodsShopId, System.Drawing.Color.Black, System.Drawing.Color.White, W, H);
                return image;
            }
    
            private void PrintStat()
            {
                PrintDocument pd = new PrintDocument();
                //设置去除打印提示
                PrintController printController = new StandardPrintController();
                pd.PrintController = printController;
    
                //设置默认打印机
                if (pd.PrinterSettings.PrinterName != PrinterName.BarCode)
                    Printer.ChangeDefaultPrinter(PrinterName.BarCode);
                //设置边距
                Margins margin = new Margins(0, 3, 20, 10);
                pd.DefaultPageSettings.Margins = margin;
    
                //纸张设置默认
                PaperSize pageSize = new PaperSize("First custom size", getYc(104), 150);
                pd.DefaultPageSettings.PaperSize = pageSize;
    
                //打印事件设置           
                pd.PrintPage += new PrintPageEventHandler(this.pd_PrintPage);
    
                try
                {
                    pd.Print();
                }
                catch (Exception ex)
                {
                    InformaticaDialog information = new InformaticaDialog("打印失败", ex.Message);
                    information.Owner = this;
                    information.ShowDialog();
                }
            }
    
            private int getYc(double cm)
            {
                return (int)(cm / 25.4) * 203;
            }
    
            private void pd_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
            {
                SetInvoiceData(e.Graphics);
            }
    
            private void SetInvoiceData(Graphics g)
            {
                SolidBrush GrayBrush = new SolidBrush(System.Drawing.Color.Black);
                Font InvoiceFont = new Font("Arial", 8, System.Drawing.FontStyle.Regular);
                g.DrawString(GetPrintStr(), InvoiceFont, GrayBrush, 100, 10);
                //这个主要目的是要放到条形
                g.DrawImage(GetPrintImage(), 10, 60, 400, 80);
                g.Dispose();
            } 
            #endregion
    打印
            #region 打印字符串自动换行
    
            /// <summary>    
            /// 处理字符串自动换行问题。最短为intLenMin,最长为intLenMax。
            /// </summary>    
            /// <param name="strOldText">原字符串</param>    
            /// <param name="intLenMin">最短字节长度</param>    
            /// <param name="intLenMax">最长字节长度</param>    
            /// <returns>string</returns>    
            /// <remarks></remarks>    
            public static string AutomaticLine(string strOldText, int intLenMin, int intLenMax)
            {
                int intLength = 0;
                string strResult = "";
    
                //获取原字符串的字节长度    
                intLength = System.Text.Encoding.GetEncoding("gb2312").GetByteCount(strOldText);
    
                if (intLength > intLenMax)
                {
                    //总字节数> 最长截取的最长字节数,    
                    //则截取最长字节数, 然后对剩余字符串再处理
    
                    //获取字符串的UCS2码    
                    byte[] bytes = System.Text.Encoding.Unicode.GetBytes(strOldText);
                    //获取字符的实际截取位置    
                    int intCutPos = RealCutPos(bytes, intLenMax);
                    //采用递归调用    
                    strResult = System.Text.Encoding.Unicode.GetString(bytes, 0, intCutPos * 2) + "
    " + AutomaticLine(strOldText.Substring(intCutPos), intLenMin, intLenMax);
                }
                else if (intLength > intLenMin)
                {
                    //如果 最长字节数 >总字节数 > 最短字节数,则 换行,并补齐空格到最短字节数位置    
                    strResult = strOldText + "
    ";// +"".PadRight(intLenMin);
                }
                else
                {
                    //如果 总字节数 < 最短字节数,则直接补齐空格到最短字节数的位置    
                    strResult = strOldText;// +"".PadRight(intLenMin - intLength);
                }
                return strResult;
            }
    
            /// <summary>    
            /// 返回字符的实际截取位置    
            /// </summary>    
            /// <param name="bytes">UCS2码</param>    
            /// <param name="intLength">要截取的字节长度</param>    
            /// <returns></returns>    
            /// <remarks></remarks>    
            private static int RealCutPos(byte[] bytes, int intLength)
            {
                //获取UCS2编码    
                int intCountB = 0;
                // 统计当前的字节数     
                int intCutPos = 0;
                //记录要截取字节的位置      
    
                while ((intCutPos < bytes.GetLength(0) && intCountB < intLength))
                {
                    // 偶数位置,如0、2、4等,为UCS2编码中两个字节的第一个字节    
                    if (intCutPos % 2 == 0)
                    {
                        // 在UCS2第一个字节时,字节数加1    
                        intCountB += 1;
                    }
                    else
                    {
                        // 当UCS2编码的第二个字节大于0时,该UCS2字符为汉字,一个汉字算两个字节    
                        if (bytes[intCutPos] > 0)
                        {
                            intCountB += 1;
                        }
                    }
                    intCutPos += 1;
                }
    
                // 如果intCutPos为奇数时,处理成偶数      
                if (intCutPos % 2 == 1)
                {
                    // 该UCS2字符是汉字时,去掉这个截一半的汉字    
                    if (bytes[intCutPos] > 0)
                    {
                        intCutPos = intCutPos - 1;
                    }
                    else
                    {
                        // 该UCS2字符是字母或数字,则保留该字符    
                        intCutPos = intCutPos + 1;
                    }
                }
    
                return intCutPos / 2;
            }
            #endregion
    打印字符串自动换行

    注意:在生成条形码时,大小是不可以任意放大的,那么我们如果想任意改变条形码大小
    思路:
    1.把条形码生成为图片
    2.改变条形码图片的大小就可以了

  • 相关阅读:
    想你,却不能告诉你
    【缅怀妈妈系列诗歌】之十七:叩别妈妈
    80后的大旗正矗立在中华大地上迎风飘扬
    【缅怀妈妈系列诗歌】之九:月祭母亲
    【缅怀妈妈系列诗歌】之十一:妈妈,我们回家
    工欲善其事,必先利其器——图文并茂详解VisualStudio使用技巧二 (转)
    工欲善其事,必先利其器——图文并茂详解VisualStudio使用技巧一 (转)
    老婆,我会好好爱你的
    【缅怀妈妈系列诗歌】之十:妈妈,孩儿答应您
    【缅怀妈妈系列诗歌】之八:妈妈,我不会忘记
  • 原文地址:https://www.cnblogs.com/WarBlog/p/11190228.html
Copyright © 2011-2022 走看看