2009-08-27 24 views
11

我需要在給定Graphics引用的任何設備上繪製一英寸長的線。無論Transform設置爲什麼,我都需要它長1英寸。我們假設變換的縮放因子在水平和垂直兩個方向上由scale給出。GDI +:如何在任何設備上繪製長度爲1英寸的線?

一些C++/CLI代碼:

g->DrawLine(Pens::Black, 50.0f, 50.0f, 50.0f + oneInchEquivalent/scale, 50.0f); 

現在是一點都不難!現在我們需要做的就是計算oneInchEquivalent

g->DpiX給我的距離看起來像一英寸在屏幕上,但不是在打印機上。看起來在打印機上,繪製一行100個單元的g->PageUnit設置爲GraphicsUnit :: Display會給我一條長1英寸的線。但是,無論PageUnit設置如何,我都需要這個工作。實際上,改變PageUnit會改變筆的寬度!

編輯:我暫時接受了這裏唯一的答案,因爲它非常接近我所尋找的。

+0

我現在用打印樣本更新了我的答案 – 2009-08-27 13:16:11

回答

12

答案成了一對夫婦的編輯之後相當長,所以這裏是最後的結果是:

Graphics對象的PageUnit屬性設置爲GraphicsUnit.Pixel並採取與DPIX和DpiY值乘以座標將呈現在顯示器和打印機設備上的預期結果。

private static void DrawInchLine(Graphics g, Color color, Point start, Point end) 
{ 
    GraphicsUnit originalUnit = g.PageUnit; 
    g.PageUnit = GraphicsUnit.Pixel; 
    using (Pen pen = new Pen(color, 1)) 
    { 
     g.DrawLine(pen, 
      start.X * g.DpiX, 
      start.Y * g.DpiY, 
      end.X * g.DpiX, 
      end.Y * g.DpiY); 
    } 
    g.PageUnit = originalUnit; 
} 

你可以把它畫一個表格(或控制)於:

using (Graphics g = this.CreateGraphics()) 
{ 
    Point start = new Point(1, 1); 
    Point end = new Point(2, 1); 
    DrawInchLine(g, Color.Black, start, end); 
} 

...或輸出發送到打印機:

PrintDialog dialog = new PrintDialog(); 
if (dialog.ShowDialog() == DialogResult.OK) 
{ 
    PrintDocument pd = new PrintDocument(); 
    pd.PrinterSettings = dialog.PrinterSettings; 
    pd.PrintPage += (psender, pe) => 
    { 
     Point start = new Point(1, 1); 
     Point end = new Point(2, 1); 
     DrawInchLine(pe.Graphics, Color.Black, start, end); 
     pe.HasMorePages = false; 
    }; 

    pd.Print(); 
} 

這確實然而, ,依靠設置PageUnit

+0

您可以嘗試CutePDF打印機模擬器。你可以看到那裏的差異。 – 2009-08-27 12:59:16

+0

我剛剛意識到我有一臺打印機站在這裏;試圖在其上打印;剛剛出來一英寸。將用代碼更新。 – 2009-08-27 13:04:25

+0

感謝Fredrik,但我需要單獨使用Math來完成此操作,而無需更改PageUnit設置。更改PageUnit將影響筆的寬度。看到我問題的最後部分。 – 2009-08-27 13:29:10

相關問題