Печать справа налево в С#
Согласно 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 было нарисовано, вы можете использовать этот конвертер для изменения координат. Конечно, вы также можете отредактировать прямоугольник, чтобы вы не создавали новых. Но принцип остается прежним. Надеюсь, я правильно понял ваш вопрос.