2016-08-18 4 views
1

У меня есть код, который записывает текст в определенную область.Переверните текст по вертикали с помощью Drawstring

graphics.DrawString(text, goodFont, Brushes.Black, textarea, stringFormat); 

Есть некоторые случаи, когда я хотел бы, чтобы перевернуть текст на горизонтальной, так что она идет от:

enter image description here

Для

enter image description here

Я попытался для измерения ширины строки и обратного преобразования:

float w = graphics.MeasureString(text, goodFont).Width; 
graphics.DrawString(text, goodFont, Brushes.Black, -w, 0, stringFormat); 

но тогда моя проблема заключается в том, что текст выходит за пределы поля, в который я хочу нарисовать его (textarea).

Я хотел бы перевернуть текст по горизонтали, сохраняя при этом мою границу поля. Может ли кто-нибудь указать мне в правильном направлении, как выполнить мою задачу?

Заранее благодарен!

EDIT: Я пытаюсь избежать создания растрового изображения, а затем выполнить преобразование.

ответ

2

Вы можете использовать преобразование графики. Чем проще, я вижу, использовать этот Matrix Constructor (Rectangle, Point[]) так:

Point[] transformPoints = 
{ 
    // upper-left: 
    new Point(textarea.Right - 1, textarea.Top), 
    // upper-right: 
    new Point(textarea.Left + 1, textarea.Top), 
    // lower-left: 
    new Point(textarea.Right - 1, textarea.Bottom), 
}; 
var oldMatrix = graphics.Transform; 
var matrix = new Matrix(textarea, transformPoints); 
try 
{ 
    graphics.Transform = matrix; 
    graphics.DrawString(text, goodFont, Brushes.Black, textarea, stringFormat); 
} 
finally 
{ 
    graphics.Transform = oldMatrix; 
    matrix.Dispose(); 
} 

P.S. Хотя @serhiyb опубликовал аналогичный ответ за несколько секунд до моего, я думаю, что это проще понять - вы определяете преобразование, просто указав прямоугольник источника и как преобразовать его верхние левые, верхние и нижние левые точки.

+0

Это решение дало мне то, что мне нужно. Спасибо. – markdozer

2

Вы можете использовать Transformation Matrix для этого

Что-то вроде:

float w = graphics.MeasureString(text, goodFont).Width; 
graphics.MultiplyTransform(new Matrix(-1, 0, 0, 1, w, 0)); 
/* 
Matrix: 
-1 0 
    0 1 
newX -> -x 
newY -> y 
and dx offset = w (since we need to move image to right because of new negative x) 
*/ 
graphics.DrawString(text, goodFont, Brushes.Black, textarea, stringFormat); 
graphics.ResetTransform(); 

Вам может понадобиться, чтобы играть с параметрами Matrix/области, как я кодирования вслепую, но я надеюсь, что вы получили эту идею.

3

Вы можете использовать Matrix Constructor для преобразования графики и последующего рисования графики с использованием метода DrawString.

Попробуйте это:

private void Form1_Paint(object sender, PaintEventArgs e) 
{ 
    Graphics g = e.Graphics; 
    string text = "This is a Test"; 
    g.DrawString(text, Font, Brushes.Black, 0, 0); 

    g.MultiplyTransform(new Matrix(-1, 0, 0, 1, 68, 50)); 

    g.DrawString(text, Font, Brushes.Black, 0, 0); 
    g.ResetTransform(); 
} 

Выход:

enter image description here