zoukankan      html  css  js  c++  java
  • C# Lpt 并口热敏小票打印机打印位图

    class LptControl
        {
            private string LptStr = "lpt1";
            public LptControl(string l_LPT_Str)
            {
               
                LptStr = l_LPT_Str;
            }
            [StructLayout(LayoutKind.Sequential)]
            private struct OVERLAPPED
            {
                int Internal;
                int InternalHigh;
                int Offset;
                int OffSetHigh;
                int hEvent;
            }
        
         
            //调用DLL.
            [DllImport("kernel32.dll")]
            private static extern int CreateFile(string lpFileName, uint dwDesiredAccess, int dwShareMode, int lpSecurityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, int hTemplateFile);
            [DllImport("kernel32.dll")]
            private static extern bool WriteFile(int hFile, byte[] lpBuffer, int nNumberOfBytesToWrite, ref int lpNumberOfBytesWritten, ref OVERLAPPED lpOverlapped);
            [DllImport("kernel32.dll")]
            private static extern bool CloseHandle(int hObject);
            private int iHandle;
            
            
            /// <summary>
            /// 打开端口
            /// </summary>
            /// <returns></returns>
            public bool Open()
            {
                iHandle = CreateFile(LptStr, 0x40000000, 0, 0, 3, 0, 0);
                // iHandle = CreateFile(LptStr, GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
    
                if (iHandle != -1)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
    
            /// <summary>
            /// 打印字符串,通过调用该方法可以打印需要的字符串
            /// </summary>
            /// <param name="Mystring"></param>
            /// <returns></returns>
            public bool Write(String Mystring)
            {
                 //如果端口为打开,则提示,打开,则打印
                if (iHandle != -1)
                {
                    OVERLAPPED x = new OVERLAPPED();
                    int i = 0;
                    //byte[] mybyte = System.Text.Encoding.Default.GetBytes(Mystring);
                    byte[] mybyte = Encoding.GetEncoding("GB2312").GetBytes(Mystring);
                    bool b = WriteFile(iHandle, mybyte, mybyte.Length, ref i, ref x);
                    return b;
                }
                else
                {
                    throw new Exception("不能连接到打印机!");
                }
            }
            /// <summary>
            /// 打印命令,通过参数,可以打印小票打印机的一些命令,比如换行,行间距,打印位图等。
            /// </summary>
            /// <param name="mybyte"></param>
            /// <returns></returns>
            public bool Write(byte[] mybyte)
            {
                //如果端口为打开,则提示,打开,则打印
                if (iHandle != -1)
                {
                    OVERLAPPED x = new OVERLAPPED();
                    int i = 0;
                    return WriteFile(iHandle, mybyte, mybyte.Length, ref i, ref x);
                }
                else
                {
                    throw new Exception("不能连接到打印机!");
                }
            }
    
            /// <summary>
            /// 关闭端口
            /// </summary>
            /// <returns></returns>
            public bool Close()
            {
                return CloseHandle(iHandle);
            }
    
    }
     /// <summary>
            /// 打印图片方法
            /// </summary>
            public void PrintOne()
            {
                //获取图片
                Bitmap bmp = new Bitmap(pictureBox1.Image);
    
                //设置字符行间距为n点行
                //byte[] data = new byte[] { 0x1B, 0x33, 0x00 };
                string send = "" + (char)(27) + (char)(51) + (char)(0);
                byte[] data = new byte[send.Length];
                for (int i = 0; i < send.Length; i++)
                {
                    data[i] = (byte)send[i];
                }
                lc.Write(data);
    
                data[0] = (byte)'x00';
                data[1] = (byte)'x00';
                data[2] = (byte)'x00';    // Clear to Zero.
    
                Color pixelColor;
    
    
                //ESC * m nL nH d1…dk   选择位图模式
                // ESC * m nL nH
                byte[] escBmp = new byte[] { 0x1B, 0x2A, 0x00, 0x00, 0x00 };
    
                escBmp[2] = (byte)'x21';
    
                //nL, nH
                escBmp[3] = (byte)(bmp.Width % 256);
                escBmp[4] = (byte)(bmp.Width / 256);
    
                //循环图片像素打印图片
                //循环高
                for (int i = 0; i < (bmp.Height / 24 + 1); i++)
                {
                    //设置模式为位图模式
                    lc.Write(escBmp);
                    //循环宽
                    for (int j = 0; j < bmp.Width; j++)
                    {
                        for (int k = 0; k < 24; k++)
                        {
                            if (((i * 24) + k) < bmp.Height)  // if within the BMP size
                            {
                                pixelColor = bmp.GetPixel(j, (i * 24) + k);
                                if (pixelColor.R == 0)
                                {
                                    data[k / 8] += (byte)(128 >> (k % 8));
    
                                }
                            }
                        }
                        //一次写入一个data,24个像素
                        lc.Write(data);
    
                        data[0] = (byte)'x00';
                        data[1] = (byte)'x00';
                        data[2] = (byte)'x00';    // Clear to Zero.
                    }
    
                    //换行,打印第二行
                    byte[] data2 = { 0xA };
                    lc.Write(data2);
                } // data
                lc.Write("
    
    ");
            }
  • 相关阅读:
    转:PCIe基础知识
    转:HDMI介绍与流程
    Java EJB JBoss
    冒泡排序
    多线程
    快排
    Talk is cheap,show me the code
    oracle union
    Oracle 【to_number】【instr】
    DB 【ACID】
  • 原文地址:https://www.cnblogs.com/rinack/p/4838193.html
Copyright © 2011-2022 走看看