Dot-Net
GDI+:如何在任何設備上繪製一條一英寸長的線?
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.Pixelprivate 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.