Сегодня пришлось написать много кода с постоянными переключениями RotateTransform/TranslateTransform, жизнь малиной не казалась пока не написал простенький хелпер. Вдруг еще кому-нибудь поможет.
раньше для вывода текста под углом приходилось писать монструозные конструкции типа такой (и ни в коем случае не забывать восстанавать предыдущий трансформ) —
// вывести текст вертикально снизу вверх в точке (40, 100)
g.RotateTransform(270);
g.TranslateTransform(-100, 40); // тут я постоянно путался :)
g.DrawString(caption, Font, Brushes.Black, 0, 0);
g.TranslateTransform(100, -40); // ResetTransform(), если не важно предыдущее состояние
g.RotateTransform(-270);
А теперь я пользуюсь новым порошком "Тайд"
using (new VerticalTextTransform(g, 40, 100))
g.DrawString(caption, Font, Brushes.Black, 0, 0);
Вот и сам хелпер.
public class SmartTransform : IDisposable
{
Graphics graphics;
float angle, dx, dy;
public SmartTransform(Graphics g, float angle, float dx, float dy)
{
this.angle = angle;
this.dx = dx;
this.dy = dy;
this.graphics = g;
graphics.RotateTransform(angle);
graphics.TranslateTransform(dx, dy);
}
public void Dispose()
{
graphics.TranslateTransform(-dx, -dy);
graphics.RotateTransform(-angle);
}
}
public class VerticalTextTransform : SmartTransform
{
public VerticalTextTransform(Graphics g, float x, float y) : base(g, 270, -y, x)
{
}
}