Dot-Net

GDI+:如何在任何設備上繪製一條一英寸長的線?

  • August 27, 2009

Graphics我需要在任何引用它的設備上畫一條一英寸長的線。無論設置什麼,我都需要它長一英寸Transform。讓我們假設變換的比例因子是scale在水平和垂直方向上給出的。

一些 C++/CLI 程式碼:

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

現在這根本不難!現在我們需要做的就是計算oneInchEquivalent

g->DpiX給了我一個在螢幕上看起來像一英寸但在列印機上沒有的距離。似乎在列印機上,繪製一條 100 個單位並g->PageUnit設置為 GraphicsUnit::Display 的線會給我一條一英寸長的線。但是,無論設置如何,我都真的需要它來工作PageUnit。事實上,改變PageUnit會改變筆的寬度!!

**編輯:**我暫時接受了這裡唯一的答案,因為它非常接近我正在尋找的答案。

經過幾次編輯,答案變得相當長,所以這是最終結果:

將對象的PageUnit屬性設置為並將座標與 DpiX 和 DpiY 值相乘,將在顯示器和列印機設備上呈現預期的結果。Graphics``GraphicsUnit.Pixel

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.

引用自:https://stackoverflow.com/questions/1340810