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

Текст в прямоугольнике

Мы уже видели две версии метода DrawString. Всего их шесть:


Методы DrawString класса Graphics



void DrawString(string str, Font font, Brush brush, PointF ptf)
void DrawString(string str, Font font, Brush brush, float x, float y)
void DrawString(string str, Font font, Brush brush, RectangleF rectf)
void DrawString(string str, Font font, Brush brush, PointF ptf, StringFormat sf)
void DrawString(string str, Font font, Brush brush, float x, float y, StringFormat sf)
void DrawString(string str, Font font, Brush brush, RectangleF rectf. StringFormat sf)


Можно видеть, что первые три параметра всегда одинаковы. Различия лишь в том, указываются ли координаты при помощи структуры PointF, двух значений float или RectangleF и имеется ли параметр типа StringFormat.

Использовать структуру PointF или значения float — дело вкуса. Эти два метода выполняют одинаковые функции. Применяйте тот, который считаете удобнее.

Однако версия с RectangleF немного отличается от этих двух методов. Метод DrawString ограничивает текст прямоугольником, и дополнительный параметр StringFormat определяет, как текст располагается внутри прямоугольника. Например, если ClientRectangle передастся функции DrawString и свойства Alignment и LineAlignment StringFormat имеют значения StringAlignment.Center, текст размещается по центру клиентской области, как продемонстрировано в следующей программе.

HelloCenteredRectangle.cs

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

  class HelloCenteredRectangle: Form
  {
      public static void Main() 
      {
          Application.Run(new HelloCenteredRectangle()); 
      }
      public HelloCenteredRectangle()
      {
          Text = "Hello Centered Using Rectangle";
          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), 
                          ClientRectangle, strfmt);
      }
  }

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

Есть только один путь это выяснить. Заменим короткую строку которую мы использовали, на что-нибудь более солидное — в качестве подходящего примера мне пришел в голову первый абзац книги Марка Твена «Приключения Гекльберри Финна» — и посмотрим, что получится.

HuckleberryFinn.cs

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

  class HuckleberryFinn: Form
  {
      public static void Main() 
      {
          Application.Run(new HuckleberryFinn()); 
      }
      public HuckleberryFinn()
      {
          Text = "\"The Adventures of Huckleberry Finn\"";
          BackColor = SystemColors.Window;
          ForeColor = SystemColors.WindowText;
          ResizeRedraw = true;
      }
      protected override void OnPaint(PaintEventArgs pea)
      {
          pea.Graphics.DrawString(     
               "You don't know about me, without you " +
               "have read a book by the name of \"The " +
               "Adventures of Tom Sawyer,\" but that " +
               "ain't no matter. That book was made by " +
               "Mr. Mark Twain, and he told the truth, " +
               "mainly. There was things which he " +
               "stretched, but mainly he told the truth. " +
               "That is nothing. I never seen anybody " +
               "but lied, one time or another, without " +
               "it was Aunt Polly, or the widow, or " +
               "maybe Mary. Aunt Polly\x2014Tom's Aunt " +
               "Polly, she is\x2014and Mary, and the Widow " +
               "Douglas, is all told about in that book" +
               "\x2014which is mostly a true book; with " +
               "some stretchers, as I said before.", 
               Font, new SolidBrush(ForeColor), ClientRectangle);
      }
  }

Обратите внимание на символы «\x2014» в строке. Это код символа Unicode длинное тире (em dash), которое часто используется для разделения фраз в предложении. Некоторые писатели, пожалуй, им злоупотребляют. При вызове DrawString в этой программе не нужен параметр StringFormat, так как нас интересует обычное отображение текста.

И действительно, DrawString неплохо справляется с форматированием текста, заполняющего клиентскую область:


Рис. 3.4.

Что не делает метод DrawString, так это не создает пару полос прокрутки, если размер клиентской области недостаточен (хотя мы вправе ожидать этого от программы).

Ничего страшного. Вы узнаете, как создавать полосы прокрутки, в следующей главе.


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

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