如何使当前画线在画面上显示?

时间:2012-03-18 11:05:39

标签: c# wpf

好的,下面是我的长代码,主要是直接来自MSDN网站..

如果您使用此代码,您可以在多个位置左键单击窗口,然后右键单击并绘制一条线,连接您左键单击的每个点。您可以根据需要多次重复此操作。

我想知道如何使用drawingVisual在您点击并在窗口上/上移动鼠标时主动显示该行..

我实际上知道如何做到这一点,但没有使用drawingVisual ..请参阅我之前在Line drawing with instant response to mouse movement?的问题中的代码

我想知道唯一的方法是将这两种方法一起添加吗?或者是否有更好的方法,只使用DrawingVisual或其他?

我不是专家,在我去的时候学习,很抱歉,如果我要求很多......

由于

public class MyVisualHost : FrameworkElement
{
    // Create a collection of child visual objects.
    private DrawingVisual drawingVisual;
    private DrawingContext drawingContext;
    private VisualCollection _children;

    Point pt1, pt2;
    Pen pen;

    bool dc_status;

    public MyVisualHost()
    {
        dc_status = false;
        pen = new Pen(Brushes.Black, 3);

        _children = new VisualCollection(this);
        _children.Add(CreateDrawingVisualRectangle(new Point(0,0), new Size(500,500)));

        // Add the event handler for MouseLeftButtonUp.
        this.MouseLeftButtonDown += new MouseButtonEventHandler(MyVisualHost_MouseLeftButtonDown);
        this.MouseMove += new MouseEventHandler(MyVisualHost_MouseMove);
        this.MouseLeftButtonUp += new MouseButtonEventHandler(MyVisualHost_MouseLeftButtonUp);
        this.MouseRightButtonUp += new MouseButtonEventHandler(MyVisualHost_MouseRightButtonUp);
    }

    // Create a DrawingVisual that contains a rectangle.
    private DrawingVisual CreateDrawingVisualRectangle(Point pt, Size sz)
    {
        drawingVisual = new DrawingVisual();
        drawingContext = drawingVisual.RenderOpen();
        Rect rect = new Rect(pt, sz);
        drawingContext.DrawRectangle(Brushes.LightBlue, (Pen)null, rect);
        drawingContext.Close();

        return drawingVisual;
    }

    // Provide a required override for the VisualChildrenCount property.
    protected override int VisualChildrenCount
    {
        get { return _children.Count; }
    }

    // Provide a required override for the GetVisualChild method.
    protected override Visual GetVisualChild(int index)
    {
        if (index < 0 || index >= _children.Count)
        {
            throw new ArgumentOutOfRangeException();
        }
        return _children[index];
    }

    // Create a DrawingVisual that contains a line.
    private DrawingVisual CreateDrawingVisualLine(Point pt1, Point pt2)
    {
        drawingVisual = new DrawingVisual();
        drawingContext = drawingVisual.RenderOpen();
        drawingContext.DrawLine(pen, pt1, pt2);
        drawingContext.Close();
        return drawingVisual;
    }

    void MyVisualHost_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        if (!dc_status)
        {
            dc_status = true;

            pt1 = e.GetPosition((UIElement)sender);

            drawingVisual = new DrawingVisual();
            drawingContext = drawingVisual.RenderOpen();
        }
    }

    void MyVisualHost_MouseMove(object sender, MouseEventArgs e)
    {
        pt2 = e.GetPosition((UIElement)sender);
    }

    void MyVisualHost_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        if (dc_status)
        {
            drawingContext.DrawLine(pen, pt1, pt2);
        }
        pt1 = e.GetPosition((UIElement)sender);
    }

    // Capture the mouse event and hit test the coordinate point value against
    // the child visual objects.
    void MyVisualHost_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
    {
        if (dc_status)
        {
            drawingContext.Close();
            _children.Add(drawingVisual);
            dc_status = false;
        }

        // Retreive the coordinates of the mouse button event.
        Point pt = e.GetPosition((UIElement)sender);

        // Initiate the hit test by setting up a hit test result callback method.
        VisualTreeHelper.HitTest(this, null, new HitTestResultCallback(myCallback), new PointHitTestParameters(pt));
    }

    // If a child visual object is hit, toggle its opacity to visually indicate a hit.
    public HitTestResultBehavior myCallback(HitTestResult result)
    {
        if (result.VisualHit.GetType() == typeof(DrawingVisual))
        {
            if (((DrawingVisual)result.VisualHit).Opacity == 1.0)
            {
                ((DrawingVisual)result.VisualHit).Opacity = 0.2;
            }
            else
            {
                ((DrawingVisual)result.VisualHit).Opacity = 1.0;
            }
        }

        // Stop the hit test enumeration of objects in the visual tree.
        return HitTestResultBehavior.Stop;
    }
}

0 个答案:

没有答案