netlib.narod.ru< Назад | Оглавление | Далее >

Горизонтальное и вертикальное выравнивание

С классом StringFormat мы впервые столкнулись в главе 3, где он служил для размещения текста в центре клиентской области. Два свойства StringFormat, которые влияют на выравнивание текста, показаны ниже:


Свойства StringFormat (выборочно)



Тип Свойство Доступ Описание

StringAlignment Alignment Чтение/запись Выравнивание по горизонтали
StringAlignment LineAlignment Чтение/запись Выравнивание по вертикали


Эти свойства имеют тип StringAlignment — перечисление, состоящее из трех членов.


Перечисление StringAlignment



Член Значение Описание

Near 0 Обычно слева или вверху
Center 1 Всегда по центру
Far 2 Обычно справа или внизу


Параметры выравнивания работают по-разному в зависимости от того, какой объект вы указываете при вызове метода DrawString: PointF или RectangleF. Сначала рассмотрим версию с RectangleF, Следующая программа использует прямоугольную клиентскую область в девяти вызовах DrawString, каждый из которых использует различную комбинацию свойств Alignment и LineAlignment. Чтобы было интереснее, текст, выводимый DrawString, содержит знак перевода каретки.

StringAlignmentRectangle.cs

  //---------------------------------------------------------
  // StringAlignmentRectangle.cs (C) 2001 by Charles Petzold
  //---------------------------------------------------------
  using System;
  using System.Drawing;
  using System.Windows.Forms;

  class StringAlignmentRectangle: PrintableForm
  {
      public new static void Main()
      {
          Application.Run(new StringAlignmentRectangle());
      }
      public StringAlignmentRectangle()
      {
          Text = "String Alignment (RectangleF in DrawString)";
      }
      protected override void DoPage(Graphics grfx, Color clr, int cx, int cy)
      {
          Brush        brush    = new SolidBrush(clr);
          RectangleF   rectf    = new RectangleF(0, 0, cx, cy);
          string[]     strAlign = { "Near", "Center", "Far" };
          StringFormat strfmt   = new StringFormat();

          for (int iVert = 0; iVert < 3; iVert++)
          for (int iHorz = 0; iHorz < 3; iHorz++)
          {
              strfmt.LineAlignment = (StringAlignment)iVert;
              strfmt.Alignment     = (StringAlignment)iHorz;

              grfx.DrawString(
                   String.Format("LineAlignment = {0}\nAlignment = {1}",
                                 strAlign[iVert], strAlign[iHorz]),
                   Font, brush, rectf, strfmt);
          }
      }
  }

Три возможных значения свойства Alignment соответствуют выравниванию текста по левому краю, по правому или по центру прямоугольника. Три возможных значения LineAlignment указывают, что текст выводится сверху, по центру или внизу прямоугольника:


Рис. 9.14.

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

При вызове метода DrawString следующая программа устанавливает объект PointF в центре клиентской области, но использует только четыре комбинации свойств Alignment и LineAlignment.

StringAlignmentPoint.cs

  //-----------------------------------------------------
  // StringAlignmentPoint.cs (C) 2001 by Charles Petzold
  //-----------------------------------------------------
  using System;
  using System.Drawing;
  using System.Windows.Forms;

  class StringAlignmentPoint: PrintableForm
  {
      public new static void Main()
      {
          Application.Run(new StringAlignmentPoint());
      }
      public StringAlignmentPoint()
      {
          Text = "String Alignment (PointF in DrawString)";
      }
      protected override void DoPage(Graphics grfx, Color clr, int cx, int cy)
      {
          Brush        brush    = new SolidBrush(clr);
          Pen          pen      = new Pen(clr);
          string[]     strAlign = { "Near", "Center", "Far" };
          StringFormat strfmt   = new StringFormat();

          grfx.DrawLine(pen, 0, cy / 2, cx, cy / 2);
          grfx.DrawLine(pen, cx / 2, 0, cx / 2, cy);

          for (int iVert = 0; iVert < 3; iVert += 2)
          for (int iHorz = 0; iHorz < 3; iHorz += 2)
          {
              strfmt.LineAlignment = (StringAlignment)iVert;
              strfmt.Alignment     = (StringAlignment)iHorz;

              grfx.DrawString(
                   String.Format("LineAlignment = {0}\nAlignment = {1}",
                                 strAlign[iVert], strAlign[iHorz]),
                   Font, brush, cx / 2, cy / 2, strfmt);
          }
      }
  }

Обратите внимание на две инструкции for. Переменные iVert и iHorz принимают только значения 0 и 2, и программа использует только четыре комбинации свойств Alignment и LineAlignment, чтобы вывести на монитор такое изображение:


Рис. 9.15.

Объект PointF, передаваемый методу DrawString, определяет центр клиентской области. DrawString размещает две строчки текста относительно этой точки в зависимости от значений свойств Alignment и LineAlignment.

Если заменить первую инструкцию for в этой программе на

  for (int iVert = 1; iVert < 3; iVert += 2)

и перекомпилировать программу, то можно увидеть, как присваивание значения StringAlignment.Center свойству LineAlignment приводит к тому, что вертикальная координата, передаваемая DrawString, определяет положение центра текста. В данном случае это центр двух строчек текста по вертикали:


Рис. 9.16.

Если же вместо этого поменять вторую инструкцию for на

  for (int iHorz = 1; iHorz < 3; iHorz += 2)

две строчки текста займут центральное положение по горизонтали:


Рис. 9.17.

Если изменить оба цикла for мы получим конечный вариант программы. Две строки текста будут отцентрованы по вертикали и горизонтали относительно центра клиентской области.


Рис. 9.18.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz