我的 BeginPrint、PrintPage 和 Click 事件有以下代碼。觸發點擊事件,列印所有頁面。我想在按鈕事件上添加一個列印范圍,列印范圍:
開始列印:
private void printDocument1_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e)
{
curRow = 0;
curCopy = 0;
if (printrange)
{
((PrintDocument)sender).PrinterSettings.PrintRange = PrintRange.SomePages;
((PrintDocument)sender).PrinterSettings.FromPage = 1;
((PrintDocument)sender).PrinterSettings.ToPage = 1;
printrange = false;
}
}
PrintPage :我在這個方法中生成二維碼、邊框和文本。通常我有超過 2 頁的二維碼。問題是它列印所有頁面
private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
{
var curY = e.MarginBounds.Y;
var curX = e.MarginBounds.X 30;// 10
Pen pen = new Pen(System.Drawing.ColorTranslator.FromHtml("#FFBD2D"), 1);
using (var fontNormal = new Font("Arial", 10))
using (var sf = new StringFormat())
{
sf.Alignment = sf.LineAlignment = StringAlignment.Center;
int itemHeight = (int)fontNormal.GetHeight(e.Graphics);
for (int row = curRow; row < dt.Rows.Count; row )
{
DataRow dr = dt.Rows[row];
if (!string.IsNullOrEmpty(dr.Field<string>(1)) &&
int.TryParse(dr.Field<string>(4)?.ToString(), out int copies))
{
for (int i = curCopy; i < copies; i )
{
var imgRect = new Rectangle(curX, curY, 156, 156);//e.MarginBounds.X
var labelRect = new Rectangle(
imgRect.X 180 20,//eltol
imgRect.Bottom-162,
itemHeight,
imgRect.Width);
using (var qrImage = GenerateQRCODE(dr[1].ToString()))
{
e.Graphics.DrawImage(RotateImage(qrImage, -90), imgRect);
}
SizeF labelSize = e.Graphics.MeasureString(dr[1].ToString(), fontNormal);
Bitmap stringmap = new Bitmap((int)labelSize.Height 1, (int)labelSize.Width 1);
Graphics gbitmap = Graphics.FromImage(stringmap);
gbitmap.TranslateTransform(0, labelSize.Width);
gbitmap.RotateTransform(-90);
gbitmap.DrawString(dr[1].ToString(), fontNormal, Brushes.Black, new PointF(0, 0), new StringFormat());
e.Graphics.DrawImage(stringmap, labelRect);
gbitmap.Dispose();
stringmap.Dispose();
e.Graphics.DrawLine(pen, curX, curY, curX, curY 156);//57 |<
e.Graphics.DrawLine(pen, curX, curY 156 , curX 156 220, curY 156);// _
e.Graphics.DrawLine(pen, curX 156 220, curY 156, curX 156 220, curY);// >|
e.Graphics.DrawLine(pen, curX, curY, curX 156 220, curY);// -
curX = imgRect.Right 230; //horizontal gap
if (curX imgRect.Width > e.MarginBounds.Right)
{
curX = e.MarginBounds.X 30;
curY = labelRect.Bottom 30;//55vertical gap
}
if (curY imgRect.Height >= e.MarginBounds.Bottom)
{
curCopy = i 1;
e.HasMorePages = true;
return;
}
}
}
curRow = row 1;
curCopy = 0;
}
}
refreshprintbtn.Enabled = true;
printdialogbtn.Enabled = true;
}
在這個點擊事件中,我呼叫了 print() 方法:
bool printrange = false;
private void printrangebtn_Click(object sender, EventArgs e)
{
printrange = true;
printDocument1.BeginPrint = printDocument1_BeginPrint;
printDocument1.PrintPage = printDocument1_PrintPage;
printDocument1.Print();
}
謝謝
uj5u.com熱心網友回復:
您忘記在事件中實作該PrintRange部分。PrintPage僅設定PrintRange、FromPage和ToPage屬性并不意味著列印機知道應該從哪一頁開始以及哪一頁應該是最后一頁。這些屬性的存在是為了通過列印對話框或某些 setter 方法獲取用戶輸入,您需要將它們用作實作中的因素。
例如,PrintRange.SomePages以防萬一,使用類欄位來確定要列印的目標頁面。僅當值在.Fromand.To范圍內時才增加欄位并列印。
//
System.Drawing;
using System.Drawing.Printing;
// ...
private int curRow, curCopy, curPage;
public YourForm()
{
InitializeComponent();
printDocument1.BeginPrint = printDocument1_BeginPrint;
printDocument1.PrintPage = printDocument1_PrintPage;
}
private void printrangebtn_Click(object sender, EventArgs e)
{
printDocument1.PrinterSettings.PrintRange = PrintRange.SomePages;
printDocument1.PrinterSettings.FromPage = 1;
printDocument1.PrinterSettings.ToPage = 2;
printDocument1.Print();
}
private void printDocument1_BeginPrint(object sender, PrintEventArgs e)
{
curRow = 0;
curCopy = 0;
curPage = 0;
// ...
}
private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
{
var curY = e.MarginBounds.Y;
var curX = e.MarginBounds.X 30;// 10
var doc = sender as PrintDocument;
using (var pen = new Pen(ColorTranslator.FromHtml("#FFBD2D")))
using (var fontNormal = new Font("Arial", 10))
using (var sf = new StringFormat())
{
sf.Alignment = sf.LineAlignment = StringAlignment.Center;
int itemHeight = (int)fontNormal.GetHeight(e.Graphics);
for (int row = curRow; row < dt.Rows.Count; row )
{
curPage ;
var doPrint = doc.PrinterSettings.PrintRange != PrintRange.SomePages ||
(curPage >= doc.PrinterSettings.FromPage && curPage <= doc.PrinterSettings.ToPage);
DataRow dr = dt.Rows[row];
if (!string.IsNullOrEmpty(dr.Field<string>(1)) &&
int.TryParse(dr.Field<string>(4)?.ToString(), out int copies))
{
for (int i = curCopy; i < copies; i )
{
var imgRect = new Rectangle(curX, curY, 156, 156);//e.MarginBounds.X
var labelRect = new Rectangle(
imgRect.X 180 20,//eltol
imgRect.Bottom - 162,
itemHeight,
imgRect.Width);
// If not, don't print and continue the calculations...
if (doPrint)
{
using (var qrImage = GenerateQRCODE(dr[1].ToString()))
e.Graphics.DrawImage(RotateImage(qrImage, -90), imgRect);
SizeF labelSize = e.Graphics.MeasureString(dr[1].ToString(), fontNormal);
Bitmap stringmap = new Bitmap((int)labelSize.Height 1, (int)labelSize.Width 1);
Graphics gbitmap = Graphics.FromImage(stringmap);
gbitmap.TranslateTransform(0, labelSize.Width);
gbitmap.RotateTransform(-90);
gbitmap.DrawString(dr[1].ToString(), fontNormal, Brushes.Black, new PointF(0, 0), new StringFormat());
e.Graphics.DrawImage(stringmap, labelRect);
gbitmap.Dispose();
stringmap.Dispose();
e.Graphics.DrawLine(pen, curX, curY, curX, curY 156);//57 |<
e.Graphics.DrawLine(pen, curX, curY 156, curX 156 220, curY 156);// _
e.Graphics.DrawLine(pen, curX 156 220, curY 156, curX 156 220, curY);// >|
e.Graphics.DrawLine(pen, curX, curY, curX 156 220, curY);// -
}
curX = imgRect.Right 230; //horizontal gap
if (curX imgRect.Width > e.MarginBounds.Right)
{
curX = e.MarginBounds.X 30;
curY = labelRect.Bottom 30;//55vertical gap
}
if (curY imgRect.Height >= e.MarginBounds.Bottom)
{
if (!doPrint) break;
curCopy = i 1;
e.HasMorePages = true;
return;
}
}
}
if (!doPrint)
{
curX = e.MarginBounds.X;
curY = e.MarginBounds.Y;
}
curRow = row 1;
curCopy = 0;
}
}
refreshprintbtn.Enabled = true;
printdialogbtn.Enabled = true;
}
旁注
- 您不應該在
PrintDocument每次單擊按鈕時為事件添加處理程式,除非您首先在EndPrint示例中洗掉當前處理程式。只需添加一次,如表單的 ctor 或Load事件所示。 System.Drawing.Pen是一次性物品,因此您也需要處理它。使用陳述句創建它using或傳遞一個實體using (pen) ...或顯式呼叫該.Dispose();方法。IDisposable對任何實作介面的物件執行相同的操作。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/496193.html
