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

Элемент управления Label

Иногда спрашивают, можно ли смешивать графику и элементы управления на одной и той же форме? Можно — программа CheckBoxDemo подтверждает это. Заметьте, что в ней метод CheckBoxOnCheckedChanged содержит единственную инструкцию:

  Invalidate(false);

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

Хотя можно смешивать элементы управления и графику на одной форме, обычно для вывода текста и другой графики используют дополнительные элементы управления. В главе 4 я показал, как выводить текст на элементе Panel. Элемент Label специально создан для вывода текста. Родословная Label небогата:


Рис. 12.13.

Вот еще одна версия CheckBoxDemo, создающая для вывода того же текста элемент Label. Вместо того, чтобы делать недействительной форму и выводить текст в методе OnPaint, в этой версии в методе CheckBoxOnCheckedChanged создается новый шрифт и устанавливается в качестве свойства Font элемента управления Label.

CheckBoxWithLabel.cs

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

  class CheckBoxWithLabel: Form
  {
      Label label;

      public static void Main()
      {
          Application.Run(new CheckBoxWithLabel());
      }
      public CheckBoxWithLabel()
      {
          Text = "CheckBox Demo with Label";

          int      cyText   = Font.Height;
          int      cxText   = cyText / 2;
          string[] astrText = {"Bold", "Italic", "Underline", "Strikeout"};

          label = new Label();
          label.Parent   = this;
          label.Text     = Text + ": Sample Text";
          label.AutoSize = true;

          for (int i = 0; i < 4; i++)
          {
              CheckBox chkbox = new CheckBox();
              chkbox.Parent = this;
              chkbox.Text = astrText[i];
              chkbox.Location = new Point(2 * cxText, 
                                          (4 + 3 * i) * cyText / 2);
              chkbox.Size = new Size(12 * cxText, cyText);
              chkbox.CheckedChanged += 
                             new EventHandler(CheckBoxOnCheckedChanged);
          }
      }
      void CheckBoxOnCheckedChanged(object obj, EventArgs ea)
      {
          FontStyle   fs   = 0;
          FontStyle[] afs  = { FontStyle.Bold,      FontStyle.Italic, 
                               FontStyle.Underline, FontStyle.Strikeout };

          for (int i = 0; i < 4; i++)
              if (((CheckBox) Controls[i + 1]).Checked)
                  fs |= afs[i];

          label.Font = new Font(label.Font, fs);
      }
  }

Если длина текста больше ширины элемента управления, элемент Label будет разбивать текст на несколько строчек. Однако при этом полосы прокрутки не появляются. Label так же может выводить только одну строку текста — в этом помогут свойства:


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



Тип Свойство Доступ

int PreferredWidth Чтение
int PreferredHeight Чтение
bool AutoSize Чтение/запись


Первые два свойства соответствуют данным, возвращаемым MeasureString, округленным до ближайшего большего целого. Третье (по умолчанию равное false) позволяет сделать размер элемента управления Label равным PreferredWidth в ширину и PreferredHeight в высоту.

Для вывода изображений элемент Label поддерживает те же четыре свойства, что и ButtonBase: Image, ImageList, ImageIndex и ImageAlign. Свойство AutoSize не изменяет размер элемента управления в зависимости от размера изображения.

Два дополнительных свойства влияют на внешний вид элемента управления Label:


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



Тип Свойство Доступ

BorderStyle BorderStyle Чтение/запись
bool UseMnemonic Чтение/запись


Свойство BorderStyle определяет вид рамки вокруг надписи, ему следует присвоить одно из значений перечисления BorderStyle:


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



Член Значение

None 0
FixedSingle 1
Fixed3D 2


Значение по умолчанию BorderStyle.None.

Свойство UseMnemonic (его значение по умолчанию true), определяет будут ли в тексте элемента управления Label амперсанды заменяться на подчеркивание следующей за амперсандом буквы. В связи с этим возникает вопрос: раз элемент управления Label предназначен для вывода текста и изображений, зачем ему мнемоники? Как вы увидите далее, нужно это, чтобы перемещаться по элементам управления вроде полос прокрутки, регуляторов и текстовых окон без фиксированного текста.


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

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