WinForms: рисование пути в нужном месте - PullRequest
0 голосов
/ 24 июня 2018

Это продолжение вопроса, который я задал здесь: WinForms: измерение текста без заполнения .Вопрос в том, что, учитывая этот код ...

    protected override void OnPaint(PaintEventArgs e) {
        e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
        DrawIt(e.Graphics);
    }

    private void DrawIt(Graphics graphics) {
        var text = "123";
        var font = new Font("Arial", 72);
        // Build a path containing the text in the desired font, and get its bounds.
        GraphicsPath path = new GraphicsPath();
        path.AddString(text, font.FontFamily, (int)font.Style, font.Size, new Point(0, 0), StringFormat.GenericDefault);
        var bounds = path.GetBounds();
        // Find center of the form.
        var cx = this.ClientRectangle.Left + this.ClientRectangle.Width / 2;
        var cy = this.ClientRectangle.Top + this.ClientRectangle.Height / 2;
        // Move it where I want it.
        var xlate = new Matrix();
        xlate.Translate(cx - bounds.Width / 2, cy - bounds.Height / 2);
        path.Transform(xlate);
        // Draw the path (and a bounding rectangle).
        graphics.DrawPath(Pens.Black, path);
        bounds = path.GetBounds();
        graphics.DrawRectangle(Pens.Blue, bounds.Left, bounds.Top, bounds.Width, bounds.Height);
        // This rectangle doesn't use the positioning from Translate but does use the same size.
        graphics.DrawRectangle(Pens.Red, cx - bounds.Width / 2, cy - bounds.Height / 2, bounds.Width, bounds.Height);
    }

... почему прямоугольники не перекрываются?

enter image description here

* 1012Ясно, что когда я перевожу путь, я не перевожу те же единицы, что и позже, рисуя их, но я не знаю, как это исправить.Есть идеи?

1 Ответ

0 голосов
/ 24 июня 2018

У вас неверное предположение о Bounds пути.Поскольку вы добавили строку к пути, начиная с точки (0,0), вы предполагаете, что расположение границ пути равно (0,0).Это не правильно.

На следующем рисунке показано отношение между источником, к которому вы добавили строку, (0,0) и границами пути, синий прямоугольник:

enter image description here

Чтобы исправить это, после добавления строки и получения ее границ, сохраните расположение границ:

var p = bounds.Location;

И затем после применения преобразований нарисуйте прямоугольник следующим образом:

graphics.DrawRectangle(Pens.Red, 
     p.X + cx - bounds.Width / 2, p.Y + cy - bounds.Height / 2, 
     bounds.Width, bounds.Height);
...