2017-03-08 52 views
0

我正在WinForms項目中工作,並且在打印文本時有查詢。所以我創建了簡單的示例來測試問題。在窗體中,我通過使用Form.Graphics手動繪製兩行之間的字符串,並通過在PrintDocument.PrintPage事件中使用PrintPageEventArgs.Graphics再次完成相同的操作。打印預覽中更改了繪圖位置。請看下面的圖片,它顯示了這個問題(即在Form.Graphics和PrintPageEventArgs.Graphics之間繪製線條是不同的)。請讓我知道,爲什麼繪圖位置改變了?在PrintPageEventArgs.Graphis中更改繪圖位置

public Form1() 
{ 
    InitializeComponent(); 
    this.Paint += Form1_Paint; 
} 

void Document_PrintPage(object sender, PrintPageEventArgs e) 
{ 
    e.Graphics.DrawLine(new Pen(new SolidBrush(Color.Red)), 10, 10, 10, 25); 
    e.Graphics.DrawString("Some Chars are getting Cut in Print Preview", this.Font, new SolidBrush(Color.Red), 10, 10); 
    e.Graphics.DrawLine(new Pen(new SolidBrush(Color.Red)), 228, 10, 228, 25); 
} 

void Form1_Paint(object sender, PaintEventArgs e) 
{ 
    e.Graphics.DrawLine(new Pen(new SolidBrush(Color.Red)), 10, 10, 10, 25); 
    e.Graphics.DrawString("Some Chars are getting Cut in Print Preview", this.Font, new SolidBrush(Color.Red), 10, 10); 
    e.Graphics.DrawLine(new Pen(new SolidBrush(Color.Red)), 228, 10, 228, 25); 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    PrintPreviewDialog ppd = new PrintPreviewDialog(); 
    PrintDocument doc = new PrintDocument(); 
    ppd.Document = doc; 
    ppd.Document.PrintPage += Document_PrintPage; 
    ppd.ShowDialog(); 
} 

enter image description here

樣品:TestSample

在此先感謝。

+0

我的回答有幫助嗎? – TheLethalCoder

+0

嗨,我不能在我的生產級別使用Graphics.MeasureStrings()。因爲一列中的每個文本將具有不同的長度。 – Prithiv

+0

然後測量所有的字符串,並採取最大... – TheLethalCoder

回答

1

職位並不總是相同的,請不要使用幻數。想想如果你改變字體大小會發生什麼?

而是考慮使用Graphics.MeasureString

SizeF stringSize = e.Graphics.MeasureString(theText, this.Font); 
e.Graphics.DrawLine(new Pen(new SolidBrush(Color.Red)), stringSize.Width + 1, 10, stringSize.Width + 1, 25); 

而且這種方法可以使用stringSize.Height獲得字符串的高度,而不是硬編碼25的:

int lineEndY = 10 + stringSize.Height /* + anyBufferConstant*/; 

側面說明:PenSolidBrush實現IDisposable可能最好將它們包裝在using語句中,但對於此特定情況,您也可以使用Pens.Red。你也可以複製代碼,你可以使用一個輔助方法。放在一起這樣的:

private void DoPrintingLogic(Graphics g, string text)  
{ 
    const Point startPos = new Point(10, 10); 

    SizeF stringSize = g.MeasureString(text, this.Font); 

    using (SolidBrush redBrush = new SolidBrush(Colors.Red)) 
    { 
     g.DrawLine(Pens.Red, startPos.X, startPos.Y, startPos.X, startPos.Y + stringSize.Height); 
     g.DrawString(text, this.Font, redBrush, startPos.X, startPos.Y); 
     g.DrawLine(Pens.Red, startPos.X + stringSize.Width, startPos.Y, startPos.X + stringSize.Width, startPos.Y + stringSize.Height); 
    } 
} 

免責聲明:所有的代碼是未經測試。