WPF 中Canvas图形绘制之坐标系转换(三)

一、缩放和平移

二、DrawingContext绘图

Canvas的坐标系统 坐标原点默认是左上角,Y轴正向朝下,不太符合习惯,通过设置变换矩阵进行调整。

Reset()函数中添加以下代码

public void Reset()
{
    Zoomfactor = 1.1f;
    TransformGroup tg = this.RenderTransform as TransformGroup;
    if(tg == null)
    {
        tg = new TransformGroup();
        this.RenderTransform = tg;
    }
    tg.Children.Clear();
    tg.Children.Add(new ScaleTransform(-1, 1));
    tg.Children.Add(new SkewTransform());
    tg.Children.Add(new RotateTransform(180));
    tg.Children.Add(new TranslateTransform(0, this.ActualHeight));

    foreach (UIElement child in this.Children)
    {
        child.RenderTransform = Transform.Identity;
        iDrawingVisualSignal iDrawing = child as iDrawingVisualSignal;
        Canvas.SetTop(child, iDrawing.ptBase.X);
        Canvas.SetLeft(child, iDrawing.ptBase.Y);
    }
}

坐标系变换后,绘制的文本是倒着的

 因此,需要在绘制文本前,设置DrawingContext的变换矩阵,修改后的OnRender函数如下

protected override void OnRender(DrawingContext drawingContext)
{
    base.OnRender(drawingContext);

    Pen pen1 = new Pen(bSelected || bHit ? Brushes.White : Brushes.Red, bSelected || bHit ? 4f : 1f);
    pen1.Freeze();  //冻结画笔,这样能加快绘图速度

    drawingContext.DrawLine(pen1, new Point(0, 0), ptConnect);
    drawingContext.DrawLine(pen1, new Point(0, 0), new Point(ptConnect.X, 50));

    FormattedText text = new FormattedText("S1", CultureInfo.CurrentCulture, FlowDirection.LeftToRight, new Typeface("Tahoma"), 16 * 1, Brushes.White, 1);
    double de = text.Width / 2.0;
    double dew = text.Height + 4;
    // 设置变换矩阵
    ScaleTransform scale= new ScaleTransform(1,-1);
    drawingContext.PushTransform(scale);

    Point ptT = new Point(ptConnect.X / 2 - de, -dew);
    drawingContext.DrawText(text, ptT);

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值