2009-08-27 26 views
11

Tôi cần vẽ một đường dài một inch trên bất kỳ thiết bị nào được cung cấp một tham chiếu Graphics cho nó. Tôi cần nó dài một inch bất kể những gì Transform được đặt thành. Giả sử rằng hệ số chia tỷ lệ của phép biến đổi được đưa ra bởi scale theo cả hướng ngang và dọc.GDI +: Làm cách nào để vẽ một đường dài một inch trên bất kỳ thiết bị nào được vẽ trên?

Một số mã C++/CLI:

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

Bây giờ đó là không khó chút nào! Bây giờ tất cả những gì chúng ta cần làm là tính toán oneInchEquivalent.

g->DpiX cho tôi khoảng cách trông giống như một inch trên màn hình chứ không phải trên máy in. Dường như trên máy in, vẽ một đường gồm 100 đơn vị với g->PageUnit được đặt thành GraphicsUnit :: Hiển thị sẽ cho tôi một dòng dài một inch. Nhưng, tôi thực sự cần điều này để làm việc bất kể cài đặt PageUnit. Thực tế, việc thay đổi PageUnit sẽ thay đổi chiều rộng của bút !!

Chỉnh sửa: Tôi đã tạm chấp nhận câu trả lời duy nhất ở đây vì nó khá gần với những gì tôi đang tìm kiếm.

+0

Tôi đã cập nhật câu trả lời của mình ngay bây giờ với mẫu in –

Trả lời

12

Câu trả lời đã trở thành khá lâu sau khi một vài chỉnh sửa, vì vậy đây là kết quả cuối cùng:

Thiết lập PageUnit tài sản của đối tượng Graphics-GraphicsUnit.Pixel và tận hưởng nhân tọa độ với các giá trị DpiX và DpiY sẽ làm cho kết quả mong đợi trên cả thiết bị hiển thị và máy in.

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; 
} 

Bạn có thể có nó vẽ trên Form (hoặc một số kiểm soát):

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

... hoặc gửi đầu ra vào một máy in:

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(); 
} 

này không, tuy nhiên , dựa vào cài đặt PageUnit.

+0

Bạn có thể thử CutePDF cho trình mô phỏng máy in. Bạn có thể thấy sự khác biệt ở đó. –

+0

Tôi vừa mới nhận ra mình có một máy in đứng ở đây; cố gắng in trên đó; xuất hiện chính xác một inch. Sẽ cập nhật bằng mã. –

+0

Cảm ơn Fredrik, nhưng tôi cần phải làm điều này bằng cách sử dụng Toán một mình, mà không thay đổi cài đặt PageUnit. Thay đổi PageUnit sẽ ảnh hưởng đến chiều rộng của bút. Xem phần cuối cùng của câu hỏi của tôi. –

Các vấn đề liên quan