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

Центрирование «Hello World»

Где там умник с галерки, который спрашивал о центрировании текста в клиентской области программы? Мы прошли долгий путь и теперь готовы это сделать. Требуется ли в этой программе присваивать значение true свойству ResizeRedraw? Да, безусловно, потому что центр клиентской области зависит от ее общего размера.

Один из возможных подходов — изменить координаты точки в функции DrawString. Вместо

  grfx.DrawString ("Hello, world!", Font, brush, 0, 0);

следует использовать

  grfx.Drawstring ("Hello, world!", Font, brush,
                   ClientSize.Width / 2, ClientSize.Height / 2);

Это хорошо для начала, но не совсем правильно. Запомните, что координата точки, передаваемая DrawString, указывает позицию верхнего левого угла текстовой строки, так что в центре клиентской области будет находиться левый верхний угол. Текст не будет располагаться в центре клиентской области — он появится в левом верхнем углу правого нижнего квадранта клиентской области.

Можно изменить это поведение по умолчанию, используя перегруженную версию DrawString, содержащую еще один параметр наряду с текстовой строкой, шрифтом, кистью и начальной позицией. Дополнительный параметр — объект типа StringFormat предназначен для более точного указания того, как отображать текст.

Мы подробно рассмотрим StringFormat в главе 9. Пока что сосредоточимся на наиболее часто используемой возможности StringFormat, изменяющей выравнивание текста по умолчанию. Выравнивание текста по умолчанию — правило, утверждающее, что координаты точки, передаваемые DrawString, указывают положение левого верхнего угла отображаемого текста.

Для изменения выравнивания текста по умолчанию сначала создается объект типа StringFormat:

  StringFormat strfmt = new StringFormat();

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


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



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

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


Оба этих свойства имеют тип StringAlignment. Это перечисление, состоящее из трех членов со странными названиями:


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



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

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


Ну, ладно, здесь только два члена перечисления имеют странные имена. Windows Forms может показывать текст справа налево, что вполне нормально в некоторых языках, или вертикально, что также нормально в некоторых языках. Near и Far предназначены для того, чтобы быть нейтральными по отношению к ориентации, и означают «ближайший к началу текста» и «наиболее удаленный от начала текста».

Если известно, что текст имеет горизонтальную ориентацию и показывается слева направо, можно считать, что StringAlignment.Near означает «левый», a StringAlignment.Far — «правый» при использовании со свойством Alignment и что StringAlignment.Near означает «верхний», a StringAlignment.Far — «нижний» при использовании со свойством LineAlignment. Вот программа, где я применил все четыре комбинации этих параметров, чтобы показывать текстовые строки в четырех углах клиентской области.

FourCorners.cs

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

  class FourCorners: Form
  {
      public static void Main()
      {
          Application.Run(new FourCorners());
      }
      public FourCorners()
      {
          Text = "Four Corners Text Alignment";
          BackColor = SystemColors.Window;
          ForeColor = SystemColors.WindowText;
          ResizeRedraw = true;
      }
      protected override void OnPaint(PaintEventArgs pea)
      {
          Graphics     grfx   = pea.Graphics;
          Brush        brush  = new SolidBrush(ForeColor);
          StringFormat strfmt = new StringFormat();

          strfmt.Alignment     = StringAlignment.Near;
          strfmt.LineAlignment = StringAlignment.Near;
          grfx.DrawString("Upper left corner", Font, brush, 0, 0, strfmt);

          strfmt.Alignment     = StringAlignment.Far;
          strfmt.LineAlignment = StringAlignment.Near;
          grfx.DrawString("Upper right corner", Font, brush, 
                          ClientSize.Width, 0, strfmt);

          strfmt.Alignment     = StringAlignment.Near;
          strfmt.LineAlignment = StringAlignment.Far;
          grfx.DrawString("Lower left corner", Font, brush, 
                          0, ClientSize.Height, strfmt);

          strfmt.Alignment     = StringAlignment.Far;
          strfmt.LineAlignment = StringAlignment.Far;
          grfx.DrawString("Lower right corner", Font, brush, 
                          ClientSize.Width, ClientSize.Height, strfmt);
     }
  }

Координаты точек, передаваемые в четырех вызовах DrawString, соответствуют четырем углам клиентской области. Вот как выглядит окно программы:


Рис. 3.2.

Если не использовать StringFormat, то только первый вызов DrawString покажет видимый текст. Текст, отображаемый тремя другими вызовами, окажется целиком за пределами клиентской области.

Если присвоить свойству Alignment объекта StringFormat значение StringAlignment.Center, строка расположится так, что центр по горизонтали будет соответствовать координате x, передаваемой в DrawString. Если присвоить свойству LineAlignment значение StringAlignment.Center, координата y, передаваемая в DrawString, будет указывать точку, в которой расположится центр строки по вертикали.

Вот как используются эти два эффекта для центрирования текста в клиентской области.

HelloCenteredAlignment.cs

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

  class HelloCenteredAlignment: Form
  {
      public static void Main()
      {
          Application.Run(new HelloCenteredAlignment());
      }
      public HelloCenteredAlignment()
      {
          Text = "Hello Centered Using String Alignment";
          BackColor = SystemColors.Window;
          ForeColor = SystemColors.WindowText;
          ResizeRedraw = true;
      }
      protected override void OnPaint(PaintEventArgs pea)
      {
          Graphics     grfx   = pea.Graphics;
          StringFormat strfmt = new StringFormat();

          strfmt.Alignment     = StringAlignment.Center;
          strfmt.LineAlignment = StringAlignment.Center;

          grfx.DrawString("Hello, world!", Font, new SolidBrush(ForeColor), 
                          ClientSize.Width / 2, ClientSize.Height / 2, 
                          strfmt);
      }
  }

А вот как выглядит окно программы:


Рис. 3.3.

Я собираюсь предупредить вас об одной вещи, которая, возможно, звучит глупо, но мой опыт настойчиво требует это сделать. Часто, добавляя определение StringFormat в существующий код, я делаю все необходимое, кроме указания объекта в качестве последнего параметра DrawString. Так как DrawString не требует StringFormat, программа компилируется без ошибок, но наличие StringFormat не влияет на ее работу. На самом деле нужно добавить объект StringFormat в вызов DrawString, чтобы все работало правильно!


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

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