Многочисленные упорядоченные преобразования / масштабные преобразования в GDI + - PullRequest
0 голосов
/ 13 января 2010

У меня есть несколько графических объектов, которые я строю в графическом контексте в приложении Windows Forms. Существует некоторое взаимодействие с элементом пользовательского интерфейса, в котором отображаются пути, что позволяет пользователю выполнять панорамирование, масштабирование и задание источника для точки масштабирования. Вопрос, который у меня возник, заключается в следующем: можно ли настроить последовательность операций преобразования для графического объекта следующим образом?

[1] Применить преобразование перевода (для смещения путей к исходной точке для преобразования масштаба) [2] Применить масштабное преобразование [3] Применить преобразование перевода (чтобы переместить путь обратно в правильное местоположение)

Кажется, я могу заказать только отдельные типы операций преобразования (перевод, масштабирование и т. Д.), Поэтому два преобразования не будут применены в правильной точке (с любой стороны операции масштабирования). Есть ли способ сделать это? В качестве альтернативы, можно ли задать начало координат для преобразования масштаба?

Я возился с вложенными графическими контейнерами, но, похоже, они не помогли.

Спасибо

Max

Ответы [ 2 ]

2 голосов
/ 13 января 2010

альтернативный текст http://lh6.ggpht.com/_1TPOP7DzY1E/S02rsQo3HgI/AAAAAAAAC60/l0rayOPKuoo/s800/Capture5.png

Код:

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    Bitmap bmp = new Bitmap(300, 300);
    Graphics g = Graphics.FromImage(bmp);
    System.Drawing.Drawing2D.Matrix matrix = new System.Drawing.Drawing2D.Matrix();

    g.DrawString("this is a string", SystemFonts.DefaultFont,
        Brushes.Black, new Point(50, 50));

    matrix.Rotate(30); // or use RotateAt(...) specifying your rotation point
    g.Transform = matrix;
    g.DrawString("this is a 30 rotated string", SystemFonts.DefaultFont, 
        Brushes.Black, new Point(50, 50));

    matrix.Reset();
    matrix.Translate(50, 50);
    g.Transform = matrix;
    g.DrawString("this is a 50; 50 translated string", SystemFonts.DefaultFont, 
        Brushes.Black, new Point(50, 50));
    pictureBox1.Image = bmp;
}

Вы можете использовать матрицу для преобразования объектов GraphicPath или Graphics.

1 голос
/ 13 января 2010

да. вы можете. использовать объект Matrix.

http://en.csharp -online.net / GDIplus_Graphics_Transformation% E2% 80% 94Matrix_Class_and_Transformation

...