2010-11-22 27 views
0

我下面的代碼應該顯示每英寸N行。相反,我得到了每英寸多N行。線之間的距離稍小。另外,改變屏幕分辨率也會改變線條之間的距離。有誰知道如何處理?如何繪製每英寸N行?


using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Media; 

namespace MyApp 
{ 
    class MyControl : Control 
    { 
     private readonly ContainerVisual container = new ContainerVisual(); 
     private readonly DrawingVisual drawing = new DrawingVisual(); 

     private void RenderDrawing() 
     { 
      var s = PresentationSource.FromVisual(this); 
      var dpiX = 96 * s.CompositionTarget.TransformToDevice.M11; 
      var dpiY = 96 * s.CompositionTarget.TransformToDevice.M22; 

      double N = 1; 

      using (var c = drawing.RenderOpen()) 
      { 
       var p = new Pen(new SolidColorBrush(Colors.Black), 1); 

       for (int i = 0; i < 10; i++) 
       { 
        var x = i * dpiX/N; 
        c.DrawLine(p, new Point(x, 0), new Point(x, 100)); 
       } 
      } 
     } 

     protected override Size ArrangeOverride(Size s) 
     { 
      RenderDrawing(); 
      return s; 
     } 

     protected override Visual GetVisualChild(int index) 
     { 
      return container; 
     } 

     protected override Size MeasureOverride(Size s) 
     { 
      return new Size(); 
     } 

     protected override int VisualChildrenCount 
     { 
      get { return 1; } 
     } 

     public MyControl() 
     { 
      container.Children.Add(drawing); 
      AddVisualChild(container); 
     } 
    } 
} 
+0

我假設這只是一些示例代碼,但它似乎總是要繪製10行。不是每英寸有N行。我可能會錯過一些東西,但我很確定從0到9的for循環將繪製10行。此外,你應該把筆放在使用語句中(使用var p = new Pen ...),否則你最終會泄漏GDI句柄。 – pstrjds 2010-11-22 19:44:18

+0

是的,它是示例代碼。是的,它畫了十條線。它應該繪製這十條線,使它們相隔1/N英寸。 – akonsu 2010-11-22 19:46:19

+0

好吧,我可能會編輯這個問題來解釋一下,我讀它是因爲你需要每英寸N行而不是10行,它們之間的距離爲1/N。事實上,再次讀你的問題我有點困惑,你說差距會隨着分辨率的變化而改變,但如果你只需要10行,並且基於當前分辨率的距離,那就是你想要發生的事情,然後距離隨分辨率變化而變化。 – pstrjds 2010-11-22 19:48:43

回答

0

不知道這是否會完成您正在尋找的內容,但如果問題與四捨五入有關,它應該有所幫助。正如我在評論中所說的,您的代碼看起來基本正確,我認爲這是dpi計算的一個圓滑問題。由於您希望基於96 dpi進行渲染,因此請根據96dpi計算座標,然後將這些點轉換爲您的設備。爲了清晰起見,我更多地寫了這些內容,可以使用單個點陣列,只記得i是開始點,i+1是終點,然後您只需進行一次調用即可轉換點。

private void RenderDrawing() 
    { 
     var s = PresentationSource.FromVisual(this); 
     var dpiX = 96; 

     int numberOfLines = 10; 
     double N = 1; 
     double spacing = dpiX/N; 

     var startPoints = new Point[numberOfLines](); 
     var endPoints = new Point[numberOfLines](); 
     for (int i = 0; i < numberOfLines; i++) 
     { 
      var x = i * spacing; 
      startPoints[i] = new Point(x, 0); 
      endPoints[i] = new Point(x, 100);     
     } 
     s.CompositionTarget.TransformToDevice.Transform(startPoints); 
     s.CompositionTarget.TransformToDevice.Transform(endPoints); 

     using (var c = drawing.RenderOpen()) 
     { 
      using (var p = new Pen(new SolidColorBrush(Colors.Black), 1)) 
      { 
       for(int i=0; i < numberOfLines; i++) 
       { 
        c.DrawLine(p, startPoints[i], endPoints[i]); 
       } 
      } 
     } 
    } 
相關問題