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:
Tôi đã cố gắng để thiết lập PageSettings hai cách:
- PageSettings.Width = 10 ; PageSettings.Height = 14.
- PageSettings.Width = 14; PageSettings.Height = 10.
Và in khu vực trông như thế này:
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.
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. –
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. –