Собственные производные классы элементов управления 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Собственные производные классы элементов управления



Переопределение методов OnXXX

Усовершенствуем поведение приложения «Крестики-нолики», так, чтобы приложение определяло выигрыш одного из игроков. Для этого придется анализировать содержимое кнопки. Когда содержимое кнопки определяется ее свойством Text, это сделать просто. Например, тот факт, что на главной диагонали игрового поля располагаются «крестики», записывается следующим образом:

btnCells[0,0].Text==”X”&&btnCells[1,1].Text==”X”&&btnCells[2,2].Text==”X”

Однако, если на кнопке будет размещаться изображение «крестиков» и «ноликов» (объект класса Image), то простое сравнение уже не допустимо.

Для решения задачи можно использовать свойство Tag. Это свойство наследуется всеми элементами управления от класса Control и может содержать любое значение, производного от класса Object типа. В нашем случае в свойство Tag можно помещать логическую величину: true – если кнопка содержит «крестик» и false – «нолик». Тогда проверка «крестиков» на главной диагонали будет выглядеть так:

(bool)(btnCells[0,0].Tag)&&(bool)(btnCells[1,1].Tag)&&(bool)(btnCells[2,2].Tag)

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

Но что делать, если представления этой дополнительной информации одного элемента данных недостаточно. В этом случае логично создать производный класс, в котором определить все дополнительные переменные. В нашем случае это может быть класс XOCell:

public class XOCell: Button

{   private XOState state;

public XOCell():base() {state=XOState.Empty;}

public XOState State

{ get { return state; } set { state = value; } }

}

Здесь используется перечислимый тип XOState, поскольку для описания состояния клетки нужны три значения:

public enum XOState {X,O,Empty};

Замените всюду в тексте программы использование класса Button на класс XOCell. Кроме того, нужно определить метод, проверяющий победу одного из игроков:

private void Win(XOState s)

{ string t=(s==XOState.X?"крестики":"нолики");

int i;

//проверяем горизонтали

for(i=0;i<3;i++)

if ((btnCells[i, 0].State == s) &&

   (btnCells[i, 1].State == s) &&

   (btnCells[i, 2].State == s))

{ MessageBox.Show("Победили " + t + "!");

 clearAllCells(); return;

}

//проверяем вертикали

...

//главная диагональ

...

//побочная диагональ

...

}

 

Интерфейсы и коллекции

Делегаты

 

Другие элементы управления

Label – поле вывода текста (метка)

TextBox – поле ввода и редактирования текста

Button – командная кнопка

CheckBox – переключатель не исключающего выбора

RadioButton – переключатель исключающего выбора

ListBox – список выбора

ComboBox – комбинированный список выбора

MainMenu – главное меню окна

ContextMenu – контекстное меню

 

MessageBox

           Show

Label

           Refresh

           Paint

           PaintEventArgs

Button

           xEnabled

           SetBounds

TextBox

           Text

           Handled

           Focus

           TextChanged

           KeyPress

KeyPress

KeyPressedEventArgs

           KeyChar

ComboBox

           DropDownStyle

           SelectedIndex

SelectedIndexChanged

CheckBox

           CheckedChanged

           Checked

Form

           Load

           Close

 

FolderBrowserDialog

PictureBox

DirectoryInfo

FileInfo

 

Timer

NumericUpDown

 

Класс Control

Все классы элементов управления и класс Form являются производными от класса Control. Поэтому они имеют доступ к обширной унаследованной функциональности этого класса. Класс System.Windows.Forms.Control задает общее поведение, ожидаемое от любого GUI-типа. Базовые члены Control позволяют указать размер и позицию элемента управления, выполнить захват событий клавиатуры и мыши, получить и установить фокус ввода, задать и изменить видимость членов и т.д. В табл. 19.4 определяются некоторые (но, конечно же, не все) свойства, сгруппированные по функциональности.

Таблица 19.4. Базовые свойства типа Control (большинство свойств обеспечивают доступ как по чтению, так и по записи)

Свойства Описание
BackColor Цвет фона. Можно указать название или же привя­заться к цветовой схеме операционной системы. Привязка к цветовой схеме задается путем указания элемента интерфейса (например, Control)
ForeColor Цвет, используемый по умолчанию компонентами, находящимися на поверхности формы, для отобра­жения текста, а также в качестве основного цвета. Изменение свойства приводит к автоматическому изменению соответствующего свойства всех компо­нентов формы (при условии, что значение свойства компонента не было задано (изменено) вручную)
BackgroundImage Фоновое изображение. Если изображение меньше размера формы, фоновое изображение будет сформировано путем дублирования его по вертика­ли и горизонтали
Font Шрифт, используемый по умолчанию компонентами, находящимися на поверхности формы. Изменение свойства приводит к автоматическому изменению соответствующего свойства всех компонентов формы (при условии, что значение свойства компонента не было задано (изменено) вручную)
Cursor Вид указателя мыши при позиционировании указателя на кнопке
Top, Left, Bottom, Right,, Height, Width Указывают текущие размеры элемента управления
Bounds Расположение и размеры элемента управления. Используется объект класса Rectangle. Button btn = new Button(); btn.Bounds = new Rectangle(10,10,75,25);
ClientRectangle (только чтение) Прямоугольник, определяющий внутреннюю (клиентскую) область элемента управления Form frm = new Form(); Rectangle r = frm.ClientRectangle;  
Enabled, Focused, Visible Каждое из этих свойств возвращает значение типа Boolean, указывающее соответствующую характеристику состояния элемента управления
ModifierKeys Статическое свойство, содержащее информацию о текущем состоянии модифицирующих клавиш (<Shift>, <Ctrl> и <Alt>) и возвращающее эту информацию в виде типа Keys
MouseButtons Статическое свойство, содержащее информацию о текущем состоянии кнопок мыши (левой, правой, и средней) и возвра­щающее эту информацию в виде типа MouseButtons
TabIndex, TabStop Используются для указания порядка переходов по клавише табуляции для элемента управления
Opacity Определяет степень прозрачности элемента управления в дробных единицах (0.0 соответствует абсолютной прозрачно­сти, а 1.0— абсолютной непрозрачности)
Text Указывает текстовые данные, ассоциируемые с элементом управления
Controls Позволяет получить доступ к строго типизованной коллекции (ControlsCollection), содержащей все дочерние элемен­ты управления, существующие в рамках данного элемента управления

Кроме того, класс Control определяет ряд событий, позволяющих реагировать на изменение состояния мыши, клавиатуры, действия выделения и перетаскива­ния объектов (а также на многие другие действия). В табл. 19.5 предлагается список некоторых (но далеко не всех) событий, сгруппированных по функциональности.

Таблица 19.5. События типа Control

События Описание
Click, Doubleclick, MouseEnter, MouseLeave, MouseDown, MouseUp, MouseMove, MouseHover, MouseWheel, События, позволяющие учитывать состояние мыши
KeyPress, KeyUp, События, позволяющие учитывать состояние клавиатуры
KeyDown,DragDrop, DragEnter, DragLeave, DragOver События, используемые для контроля действий, связанных с перетаскиванием объектов
Paint События, позволяющие взаимодействовать с GDI+

Наконец, базовый класс Control определяет целый ряд методов, позволяющих взаимодействовать с любым типом, производным от Control. При ближайшем рассмотрении методов Control вы обнаружите, что многие из них имеют префикс On, за которым следует имя соответствующего события (OnMouseMove, OnKeyUp, OnPaint и т.д.). Каждый из этих снабженных префиксом виртуальных методов представляет собой обработчик соответствующего события, заданный по умолчанию. Переопределив такой виртуальный член, вы получаете возможность выпол­нить необходимую предварительную (или заключительную) обработку данных, пе­ред вызовом (или после вызова) родительской реализации обработчика события.

public class MainWindow: Form

{ protected override void OnMouseDown(MouseEventArgs e)

  {

// Добавленный программный код для события MouseDown.

// Вызов родительской реализации.

base.OnMouseDown(e);

  }

}

Это может оказаться полезным, например, при создании пользовательских элементов управления, которые получаются из стандартных (см. главу 21), но чаще всего вы будете использовать обработку событий в рамках стандартного синтаксиса событий С# (именно это предлагается средствами проектирования Visual Studio 2005 по умолчанию). В этом случае среда разработки вызовет пользовательский обработчик события после завершения работы родительской реализации.

public class MainWindow: Form

{ public MainWindow ()

{ MouseDown+=new MouseEventHandler(MainWindow_MouseDown); }

void MainWindow_MouseDown(object sender, MouseEventArgs e)

  {

  // Добавленный программный код для события MouseDown.

}

}

Кроме методов вида OnХХХ(), есть несколько других методов, о которые вам следует знать.

  • Hide(). Скрывает элемент управления, устанавливая для его свойства Visible значение false (ложь).
  • Show(). Делает элемент управления видимым, устанавливая для его свойства Visible значение true (истина).
  • Invalidate(). Заставляет элемент управления обновить свое изображение, посылая событие Paint.

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



Поделиться:


Последнее изменение этой страницы: 2021-12-15; просмотров: 39; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.16.137.108 (0.014 с.)