我下面的代碼應該顯示每英寸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);
}
}
}
我假設這只是一些示例代碼,但它似乎總是要繪製10行。不是每英寸有N行。我可能會錯過一些東西,但我很確定從0到9的for循環將繪製10行。此外,你應該把筆放在使用語句中(使用var p = new Pen ...),否則你最終會泄漏GDI句柄。 – pstrjds 2010-11-22 19:44:18
是的,它是示例代碼。是的,它畫了十條線。它應該繪製這十條線,使它們相隔1/N英寸。 – akonsu 2010-11-22 19:46:19
好吧,我可能會編輯這個問題來解釋一下,我讀它是因爲你需要每英寸N行而不是10行,它們之間的距離爲1/N。事實上,再次讀你的問題我有點困惑,你說差距會隨着分辨率的變化而改變,但如果你只需要10行,並且基於當前分辨率的距離,那就是你想要發生的事情,然後距離隨分辨率變化而變化。 – pstrjds 2010-11-22 19:48:43