2012-11-09 21 views
9

Ngày tốt lành!Văn bản xoay RichTextBox để in

Tôi cần in thẻ ngắn từ RichTextBox. Kích thước thẻ là 10x14 cm.

Bởi vì các tính năng máy in của khách hàng chúng tôi có thể đưa thẻ vào một máy in duy nhất theo cách này:

example image

Tôi đã cố gắng để thiết lập PageSettings hai cách:

  1. PageSettings.Width = 10 ; PageSettings.Height = 14.
  2. PageSettings.Width = 14; PageSettings.Height = 10.

Và in khu vực trông như thế này:

enter image description here

Dưới đây là các mã như thế nào in được phát hành:

btnRotate.CheckedChanged += (s, e) => InitPaperSize(); 

private void InitPaperSize() 
    { 
     string name = btnRotate.Checked ? "ShortCard (rotate)" : "ShortCard"; 
     int width = Centimeters(btnRotate.Checked ? 14 : 10); 
     int height = Centimeters(btnRotate.Checked ? 10 : 14); 

     System.Drawing.Printing.PaperSize ps = new System.Drawing.Printing.PaperSize(name, width, height); 
     printDocument.DefaultPageSettings.PaperSize = ps; 
    } 

private int Centimeters(int centimeters) 
    { 
     return (int)((centimeters * 100)/2.54); 
    } 

public int PrintRotate(bool rotate, PrintPageEventArgs e, int charFrom, int charTo) 
    { 
     //Calculate the area to render and print 
     RECT rectToPrint; 
     rectToPrint.Top = (int)(e.MarginBounds.Top * anInch); 
     rectToPrint.Bottom = (int)(e.MarginBounds.Bottom * anInch); 
     rectToPrint.Left = (int)(e.MarginBounds.Left * anInch); 
     rectToPrint.Right = (int)(e.MarginBounds.Right * anInch); 

     //Calculate the size of the page 
     RECT rectPage; 
     rectPage.Top = (int)(e.PageBounds.Top * anInch); 
     rectPage.Bottom = (int)(e.PageBounds.Bottom * anInch); 
     rectPage.Left = (int)(e.PageBounds.Left * anInch); 
     rectPage.Right = (int)(e.PageBounds.Right * anInch); 

     IntPtr hdc = e.Graphics.GetHdc(); 

     FORMATRANGE fmtRange; 
     fmtRange.chrg.cpMax = charTo;    //Indicate character from to character to 
     fmtRange.chrg.cpMin = charFrom; 
     fmtRange.hdc = hdc;     //Use the same DC for measuring and rendering 
     fmtRange.hdcTarget = hdc;    //Point at printer hDC 
     fmtRange.rc = rectToPrint;    //Indicate the area on page to print 
     fmtRange.rcPage = rectPage;   //Indicate size of page 

     SetGraphicsMode(fmtRange.hdc, GM_ADVANCED); 

     XFORM par = new XFORM(); 

     par = new XFORM(); 
     par.eM11 = 1; 
     par.eM12 = 0; 
     par.eM21 = 0; 
     par.eM22 = 1; 
     par.eDx = -e.PageSettings.Margins.Left/100 * e.PageSettings.PrinterResolution.X;//делим на 100 так как границы указываются в сотых долях дюйма 
     par.eDy = -e.PageSettings.Margins.Top/100 * e.PageSettings.PrinterResolution.Y; 

     ModifyWorldTransform(fmtRange.hdc, ref par, MWT_LEFTMULTIPLY); 

     IntPtr res = IntPtr.Zero; 

     IntPtr wparam = IntPtr.Zero; 
     wparam = new IntPtr(1); 

     //Get the pointer to the FORMATRANGE structure in memory 
     IntPtr lparam = IntPtr.Zero; 
     lparam = Marshal.AllocCoTaskMem(Marshal.SizeOf(fmtRange)); 
     Marshal.StructureToPtr(fmtRange, lparam, false); 

     //Send the rendered data for printing 
     res = SendMessage(Handle, EM_FORMATRANGE, wparam, lparam); 

     //Free the block of memory allocated 
     Marshal.FreeCoTaskMem(lparam); 

     //Release the device context handle obtained by a previous call 
     e.Graphics.ReleaseHdc(hdc); 

     //Return last + 1 character printer 
     return res.ToInt32(); 
    } 

Vấn đề duy nhất là chúng tôi chỉ có thể đặt thẻ trong máy in theo chiều ngang.

+3

Máy in hỗ trợ in ở chế độ ngang và dọc, thuộc tính PageSettings.Landscape. Một allheckofalot dễ dàng hơn so với quay đầu ra cho mình. –

+0

Tôi cũng đã thử cách này. Nhưng cảnh quan cho phép chỉ xoay nội dung in nhưng không thể in được. Vị trí của giấy trong máy in không thay đổi. –

Trả lời

0

Tôi đã gặp sự cố tương tự với các máy in chuyên dụng. Các trình điều khiển có thể chỉ bỏ qua một số cài đặt của bạn mà bạn đã đặt.

giải pháp của tôi là tạo hình ảnh từ văn bản và chỉ sử dụng cài đặt máy in mặc định thay vì cố gắng làm cho phù hợp với một số trình điều khiển máy in lạ.

Here is how you convert your text to image

1

Như ai đó nói trước đây, bạn chỉ cần thiết lập thuộc tính PageSettings.Landscape. Bạn cũng có thể vẽ trực tiếp bằng cách sử dụng ngữ cảnh đồ họa của PrintPageEventArgs.Graphics. Sau đó, bạn có thể vẽ bất kỳ phần tử xoay hoặc văn bản được xoay nào. This gives a good example. Sau đó, bạn không cần phải làm việc với con trỏ (IntPtr) hoặc bối cảnh thiết bị (GetHDC).

+0

Đây là cách tôi sẽ đi về nó: lấy nội dung của RichTextBox và "vẽ" nó trong một 'PrintDocument', cách nó cần thiết. http://msdn.microsoft.com/fr-fr/library/system.drawing.printing.printdocument(v=vs.80).aspx –