Печать справа налево в С#

Согласно msdn: http://www.microsoft.com/middleeast/msdn/arabicsupp.aspx

Как GDI + поддерживает арабский?

GDI + поддерживает арабскую обработку текста, включая текст печати с порядком чтения RTL для обоих устройств вывода, экрана и принтера. Метод Graphics.DrawString рисует указанную текстовую строку в указанном местоположении x, y или в прямоугольнике (в соответствии с его перегрузкой) с указанными объектами Brush и Font с использованием атрибутов форматирования указанного объекта StringFormat. Объект StringFormat включает в себя информацию о текстовом макете, такую ​​как порядок чтения текста.

Следовательно, вы можете легко перенести начало графического объекта в Right-Top, а не в Left-Top, чтобы печатать арабский текст в указанном месте на экране плавно, без необходимости явного определения местоположений.

Хотя это верно при настройке (X, Y) координации (0,0), но если я хочу увеличить координацию X для печати в определенной области на бумаге, координация X будет увеличиваться с правой стороны листа не влево, как предполагается, при печати вправо-влево; что означает печать за пределами бумаги. См. Эту демонстрацию:

static void Main(string[] args)
{
    PrintDocument p = new PrintDocument();
    p.PrintPage += new PrintPageEventHandler(PrintPage);
    p.Print();
}

static void PrintPage(object sender, PrintPageEventArgs e)
{
    string drawString = "إختبار الرسم";
    SolidBrush drawBrush = new SolidBrush(Color.Black);
    Font drawFont = new System.Drawing.Font("Arail", 16);
    RectangleF recAtZero = new RectangleF(0, 0, e.PageBounds.Width, e.PageBounds.Height);
    StringFormat drawFormat = new StringFormat();

    drawFormat.FormatFlags = StringFormatFlags.DirectionRightToLeft;

    e.Graphics.DrawString(drawString, drawFont, drawBrush, recAtZero, drawFormat);
    RectangleF recAtGreaterThantZero = new RectangleF(300, 0, e.PageBounds.Width, e.PageBounds.Height);
    e.Graphics.DrawString(drawString, drawFont, drawBrush, recAtGreaterThantZero, drawFormat);
}

Как переместить начало графического объекта в правую верхнюю часть вместо Left-Top, а при увеличении координаты X - переместить точку печати влево не вправо.

PS: То, что я делаю сейчас, устанавливает координацию X на отрицательную, чтобы заставить ее двигаться влево. Simple digagram

Ответы

Ответ 1

Используйте StringFormatFlags.DirectionRightToLeft, например:

StringFormat format = new StringFormat(StringFormatFlags.DirectionRightToLeft);
e.Graphics.DrawString("سلام",
                this.Font,
                new SolidBrush(Color.Red),
                r1,
                format);

Ответ 2

Вы можете сделать очень простое преобразование координат:

public static class CoordinateConverter
{
    public static RectangleF Convert(RectangleF source, RectangleF drawArea)
    {
        // I assume drawArea.X to be 0
        return new RectangleF(
            drawArea.Width - source.X - source.Width,
            source.Y,
            source.Width,
            source.Height);
    }

    public static RectangleF ConvertBack(Rectangle source, RectangleF drawArea)
    {
       return new RectangleF(
           source.X + source.Width - drawArea.Width,
           source.Y,
           source.Width,
           source.Height);
    }
}

Теперь каждый раз, когда вы хотите, чтобы что-то texty было нарисовано, вы можете использовать этот конвертер для изменения координат. Конечно, вы также можете отредактировать прямоугольник, чтобы вы не создавали новых. Но принцип остается прежним. Надеюсь, я правильно понял ваш вопрос.