Печать справа налево в c # - PullRequest
18 голосов
/ 25 мая 2011

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

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

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

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

Хотя это верно при установке (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);
}

Как переместить исходный объект графического объекта в правую верхнюю часть вместо левой верхней, а при увеличении координации по Х продвигать точку печати влево, а не вправо.

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

Ответы [ 2 ]

30 голосов
/ 23 июля 2012

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

StringFormat format = new StringFormat(StringFormatFlags.DirectionRightToLeft);
e.Graphics.DrawString("سلام",
                this.Font,
                new SolidBrush(Color.Red),
                r1,
                format);
1 голос
/ 25 мая 2011

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

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);
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...