Làm th? nào đ? g?i d? li?u thô cho m?t máy in b?ng cách s? d?ng Visual C#.NET

D?ch tiêu đ? D?ch tiêu đ?
ID c?a bài: 322091 - Xem s?n ph?m mà bài này áp d?ng vào.
Bung t?t c? | Thu g?n t?t c?

? Trang này

TÓM T?T

Bài vi?t t?ng bư?c này cho th?y làm th? nào đ? s? d?ng ch?c năng đ?m Win32 t? m?t chương tr?nh mà b?n t?o ra b?ng cách s? d?ng Visual C#.NET.

Thông tin Bổ sung

Đ? g?i d? li?u thô cho m?t máy in t? Microsoft.NET Framework, chương tr?nh c?a b?n ph?i làm vi?c v?i ch?c năng đ?m Win32. Thông qua các.NET Framework, b?n có th? in b?ng cách s? d?ng PrintDocument, PrintController, và liên quan đ?n các l?p h?c. Tuy nhiên, v?i các.NET Framework, b?n không th? g?i d? li?u máy in-s?n sàng preformatted cho máy in.

B?n có th? g?i d? li?u thô cho m?t máy in ph?i làm như sau:
  • G?i thoát.
  • T?i v?, và sau đó s? d?ng phông ch? m?m.
  • Spool preprinted t?p tin.
Đ? g?i các lo?i và các lo?i d? li?u thô cho m?t máy in, m? c?a b?n ph?i làm vi?c v?i Win32 Spooler giao di?n l?p tr?nh ?ng d?ng (API). Các m? sau đây cho th?y làm th? nào đ? đ?c n?i dung c?a m?t t?p tin preformatted vào b? nh?, và sau đó g?i các byte cho máy in b?ng cách s? d?ng WritePrinter.

LƯU ?: B?n không th? s? d?ng cách ti?p c?n này trong vi?c in tương t? như m?t b?n đ?a PrintDocument vi?c in. B?n ph?i s? d?ng m?t trong hai t?nh.NET Framework đ? in ho?c g?i byte vi?c in c?a riêng b?n.

T?o m?t d? án có in d? li?u Preformatted

  1. B?t đ?u Visual Studio.NET. Trên các Tệp tr?nh đơn, nh?p vào M?i, sau đó b?m Dự án. Dư?i Các lo?i d? án, b?m vào các Visual C# các d? án thư m?c. Trên các Khuôn mẫu danh sách, b?m vào ?ng d?ng Windows, sau đó b?m Ok. Theo m?c đ?nh, Form1 đư?c t?o ra.
  2. Trên các Xem tr?nh đơn, nh?p vào H?p công c? hi?n th? h?p công c?, và sau đó thêm m?t nút đ? Form1. Nút này đư?c đ?t tên Button1.
  3. Thêm khác nút đ? Form1. Nút này đư?c đ?t tên Button2.
  4. B?m đúp Button1. C?a s? m? cho các h?nh th?c xu?t hi?n.
  5. Thay th? các Button1_Click chương tr?nh con v?i đo?n m? sau:
    private void button1_Click(object sender, System.EventArgs e)
    {
        // Allow the user to select a file.
        OpenFileDialog ofd = new OpenFileDialog();
        if( DialogResult.OK == ofd.ShowDialog(this) )
        {
            // Allow the user to select a printer.
            PrintDialog pd  = new PrintDialog();
            pd.PrinterSettings = new PrinterSettings();
            if( DialogResult.OK == pd.ShowDialog(this) )
            {
                // Print the file to the printer.
                RawPrinterHelper.SendFileToPrinter(pd.PrinterSettings.PrinterName, ofd.FileName);
            }
        }
    }
    					
  6. Thay th? các Button2_Click chương tr?nh con v?i đo?n m? sau:
    private void button2_Click(object sender, System.EventArgs e)
    {
        string s = "Hello"; // device-dependent string, need a FormFeed?
        
        // Allow the user to select a printer.
        PrintDialog pd  = new PrintDialog();
        pd.PrinterSettings = new PrinterSettings();
        if( DialogResult.OK == pd.ShowDialog(this) )
        {
            // Send a printer-specific to the printer.
            RawPrinterHelper.SendStringToPrinter(pd.PrinterSettings.PrinterName, s);
        }
    }
    					
  7. Chèn đo?n m? sau ? đ?u t?p tin:
    using System;
    using System.Drawing;
    using System.Drawing.Printing;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    					
  8. Thêm m? sau bên trong không gian tên ?ng d?ng chính, nhưng bên ngoài nào đ?nh ngh?a l?p:
    public class RawPrinterHelper
    {
        // Structure and API declarions:
        [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
        public class DOCINFOA
        {
            [MarshalAs(UnmanagedType.LPStr)] public string pDocName;
            [MarshalAs(UnmanagedType.LPStr)] public string pOutputFile;
            [MarshalAs(UnmanagedType.LPStr)] public string pDataType;
        }
        [DllImport("winspool.Drv", EntryPoint="OpenPrinterA", SetLastError=true, CharSet=CharSet.Ansi, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]
        public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter, out IntPtr hPrinter, IntPtr pd);
    
        [DllImport("winspool.Drv", EntryPoint="ClosePrinter", SetLastError=true, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]
        public static extern bool ClosePrinter(IntPtr hPrinter);
    
        [DllImport("winspool.Drv", EntryPoint="StartDocPrinterA", SetLastError=true, CharSet=CharSet.Ansi, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]
        public static extern bool StartDocPrinter( IntPtr hPrinter, Int32 level,  [In, MarshalAs(UnmanagedType.LPStruct)] DOCINFOA di);
    
        [DllImport("winspool.Drv", EntryPoint="EndDocPrinter", SetLastError=true, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]
        public static extern bool EndDocPrinter(IntPtr hPrinter);
    
        [DllImport("winspool.Drv", EntryPoint="StartPagePrinter", SetLastError=true, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]
        public static extern bool StartPagePrinter(IntPtr hPrinter);
    
        [DllImport("winspool.Drv", EntryPoint="EndPagePrinter", SetLastError=true, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]
        public static extern bool EndPagePrinter(IntPtr hPrinter);
    
        [DllImport("winspool.Drv", EntryPoint="WritePrinter", SetLastError=true, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]
        public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, Int32 dwCount, out Int32 dwWritten );
    
        // SendBytesToPrinter()
        // When the function is given a printer name and an unmanaged array
        // of bytes, the function sends those bytes to the print queue.
        // Returns true on success, false on failure.
        public static bool SendBytesToPrinter( string szPrinterName, IntPtr pBytes, Int32 dwCount)
        {
            Int32    dwError = 0, dwWritten = 0;
            IntPtr    hPrinter = new IntPtr(0);
            DOCINFOA    di = new DOCINFOA();
            bool    bSuccess = false; // Assume failure unless you specifically succeed.
    
            di.pDocName = "My C#.NET RAW Document";
            di.pDataType = "RAW";
    
            // Open the printer.
            if( OpenPrinter( szPrinterName.Normalize(), out hPrinter, IntPtr.Zero ) )
            {
                // Start a document.
                if( StartDocPrinter(hPrinter, 1, di) )
                {
                    // Start a page.
                    if( StartPagePrinter(hPrinter) )
                    {
                        // Write your bytes.
                        bSuccess = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten);
                        EndPagePrinter(hPrinter);
                    }
                    EndDocPrinter(hPrinter);
                }
                ClosePrinter(hPrinter);
            }
            // If you did not succeed, GetLastError may give more information
            // about why not.
            if( bSuccess == false )
            {
                    dwError = Marshal.GetLastWin32Error();
            }
            return bSuccess;
        }
    
        public static bool SendFileToPrinter( string szPrinterName, string szFileName )
        {
            // Open the file.
            FileStream fs = new FileStream(szFileName, FileMode.Open);
            // Create a BinaryReader on the file.
            BinaryReader br = new BinaryReader(fs);
            // Dim an array of bytes big enough to hold the file's contents.
            Byte []bytes = new Byte[fs.Length];
            bool bSuccess = false;
            // Your unmanaged pointer.
            IntPtr pUnmanagedBytes = new IntPtr(0);
            int nLength;
    
            nLength = Convert.ToInt32(fs.Length);
            // Read the contents of the file into the array.
            bytes = br.ReadBytes( nLength );
            // Allocate some unmanaged memory for those bytes.
            pUnmanagedBytes = Marshal.AllocCoTaskMem(nLength);
            // Copy the managed byte array into the unmanaged array.
            Marshal.Copy(bytes, 0, pUnmanagedBytes, nLength);
            // Send the unmanaged bytes to the printer.
            bSuccess = SendBytesToPrinter(szPrinterName, pUnmanagedBytes, nLength);
            // Free the unmanaged memory that you allocated earlier.
            Marshal.FreeCoTaskMem(pUnmanagedBytes);
            return bSuccess;
        }
        public static bool SendStringToPrinter( string szPrinterName, string szString )
        {
            IntPtr pBytes;
            Int32 dwCount;
            // How many characters are in the string?
            dwCount = szString.Length;
            // Assume that the printer is expecting ANSI text, and then convert
            // the string to ANSI text.
            pBytes = Marshal.StringToCoTaskMemAnsi(szString);
            // Send the converted ANSI string to the printer.
            SendBytesToPrinter(szPrinterName, pBytes, dwCount);
            Marshal.FreeCoTaskMem(pBytes);
            return true;
        }
    }
    					
  9. Nh?n F5 đ? xây d?ng, và sau đó ch?y chương tr?nh.
  10. Nh?p vào Button1 đ? t?i và in n?i dung c?a t?p tin.
  11. Nh?p vào Button2 đ? in m?t chu?i. (B?n có th? ph?i tháo trang b?ng tay b?i v? các chu?i đư?c g?i mà không có các formfeed l?nh.)

THAM KH?O

Đ? bi?t thêm chi ti?t, nh?p vào s? bài vi?t sau đ? xem các bài vi?t trong cơ s? ki?n th?c Microsoft:
138594Làm th? nào đ? g?i d? li?u thô cho m?t máy in b?ng cách s? d?ng Win32 API

Thu?c tính

ID c?a bài: 322091 - L?n xem xét sau cùng: 27 Tháng Tám 2011 - Xem xét l?i: 2.0
Áp d?ng
  • Microsoft Windows XP Professional
T? khóa: 
kbdswgdi2003swept kbhowtomaster kbmt KB322091 KbMtvi
Máy d?ch
QUAN TRỌNG: Bài vi?t này đư?c d?ch b?ng ph?n m?m d?ch máy c?a Microsoft ch? không ph?i do con ngư?i d?ch. Microsoft cung c?p các bài vi?t do con ngư?i d?ch và c? các bài vi?t do máy d?ch đ? b?n có th? truy c?p vào t?t c? các bài vi?t trong Cơ s? Ki?n th?c c?a chúng tôi b?ng ngôn ng? c?a b?n. Tuy nhiên, bài vi?t do máy d?ch không ph?i lúc nào c?ng hoàn h?o. Lo?i bài vi?t này có th? ch?a các sai sót v? t? v?ng, cú pháp ho?c ng? pháp, gi?ng như m?t ngư?i nư?c ngoài có th? m?c sai sót khi nói ngôn ng? c?a b?n. Microsoft không ch?u trách nhi?m v? b?t k? s? thi?u chính xác, sai sót ho?c thi?t h?i nào do vi?c d?ch sai n?i dung ho?c do ho?t đ?ng s? d?ng c?a khách hàng gây ra. Microsoft c?ng thư?ng xuyên c?p nh?t ph?n m?m d?ch máy này.
Nh?p chu?t vào đây đ? xem b?n ti?ng Anh c?a bài vi?t này:322091

Cung cấp Phản hồi

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com