Чтение онлайн

на главную - закладки

Жанры

C# для профессионалов. Том II

Ватсон Карли

Шрифт:

 Console.WriteLine("Size = " + RectangleSize);

}

Этот код, выполняемый как простое консольное приложение, создает следующий вывод:

Отметим, что этот вывод показывает также, как метод

ToString
объектов
Point
и
Size
был переопределен для вывода значения в формате {X, Y}.

Аналогично можно вычесть

Size
из
Point
, чтобы задать
Point
, или складывать два размера
Size
, задавая другой размер
Size
. Однако невозможно сложить точку
Point
с другой точкой
Point
.
Компания Microsoft определила, что такое действие не имеет концептуального смысла, поэтому было решено не создавать никакою перезагружаемого оператора + который бы позволял это сделать.

Можно также явно преобразовать

Point
в
Size
и наоборот:

Point TopLeft = new Point(10, 10);

Size S1 = (Size)TopLeft;

Point P1 = (Point)S1;

При этом преобразовании значению

S1.Width
присваивается значение
TopLeft.X
, а
S1.Height
TopLeft.Y
. Следовательно,
S1
содержит (10, 10).
P1
будет содержать те же значения, что и
TopLeft
.

Rectangle и RectangleF

Эти структуры предcтавляют прямоугольную область (обычно на экране). Так же, как и в случае с

Point
и
Size
, мы рассмотрим только структуру
Rectangle
.
RectangleF
по сути идентична, за исключением того, что свойства, представляющие размеры, используют
float
, в то время как в
Rectangle
использует 
int
.

Rectangle
можно рассматривать как точку в верхнем левом углу прямоугольника и
Size
, которая представляет его размер. Один из его конструкторов действительно получает
Point
и
Size
в качестве параметров, Можно увидеть это переписывая предыдущий код рисования прямоугольника

Graphics dc = е Graphics;

Pen BluePen = new Pen(Color Blue, 3);

Point TopLeft = new Point(0, 0);

Size HowBig = new Size(50, 50);

Rectangle RectangleArea = new Rectangle(TopLeft, HowBig);

dc.DrawRectangle(BluePen, RectangleArea);

Этот код также использует альтернативное переопределение

Graphics.DrawRectangle
, который получает
Pen
и структуру
Rectangle
в качестве своих параметров.

Можно также создать

Rectangle
, используя значения в таком порядке как отдельные числа: верхняя левая горизонтальная координата, верхняя левая вертикальная координата, отдельно ширина и высота:

Rectangle RectangleArea = new Rectangle(0, 0, 50, 50)

Rectangle
имеет достаточно много свойств чтения-записи для задания или извлечения его размеров в различных комбинациях:

Свойство Описание
int Left
х-координата левого края
int Right
х-координата правого края
int Top
у-координата верхнего края
int Bottom
у-координата нижнего края
int X
То же самое что и Left
int Y
То же самое, что и Top
int Width
Ширина прямоугольника
int Height
Высота прямоугольника
Point Location
Верхний левый угол
Size Size
Размер прямоугольника

Отметим,

что эти свойства не все независимы,— например задание
Width
будет влиять на значение
Right
.

Region 

Мы упомянем здесь о существовании класса

System.Drawing.Region
, однако не будем рассматривать его подробно в этой книге.
Region
представляет область на экране, которая имеет некоторую сложную форму. Например, затененная область на рисунке может быть представлена
Region
:

Процесс инициализации экземпляра

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

Замечание об отладке

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

Paint
. В результате может оказаться, что задание точки прерывания в методе
OnPaint
заставляет приложение просто воспроизводить себя непрерывно, и поэтому оно не может делать ничего другого.

Типичный сценарий будет таков: необходимо определить, почему приложение что-то выводит неправильно, поэтому в

OnPaint
задается точка прерывания. Как ожидается, приложение доходит до точки прерывания и вызывает отладчик, в результате появляется окно среды разработки MDI.

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

Paint
. Это означает, конечно, что точка прерывания тут же сработает снова. Но обычно требуется, чтобы точка прерывания сработала позже, когда приложение нарисует что-то интересное, возможно, после выбора некоторых пунктов меню для чтения из файла или другого способа изменения изображения. Похоже на тупик. Либо не нужно вообще создавать точку прерывания в
OnPaint
, либо приложение никогда не сможет выйти за точку, где выводится его начальное окно.

Однако существуют способы обхода этой проблемы.

Если имеется достаточно большой экран, то простейшим способом является сохранение окна среды разработчика открытым, но так, чтобы оно не закрывало окно приложения. К сожалению, в большинстве случаев это не очень практичное решение, так как окно среды разработки будет слишком маленьким. Альтернативное решение, которое использует тот же самый принцип, состоит в том, что приложение должно объявить себя самым верхним приложением во время отладки. Это делается заданием свойства

TopMost
класса
Form
, что можно легко осуществить в методе
InitializeComponent
:

private void InitializeComponent {

 this.TopMost = true;

Это означает, что приложение никогда не будет закрыто другими окнами (только другими самыми верхними окнами). Оно всегда остается поверх других окон, даже когда другое приложение получает фокус. Так ведет себя менеджер задач.

Даже при использовании этой техники необходимо быть внимательным, так как никогда нет полной уверенности в том, что Windows не решит по какой-либо причине инициировать событие

Paint
. Если действительно в
OnPaint
требуется выявить некоторую проблему, возникающую при некоторых специальных условиях (например, приложение выполняет рисование после выбора определенного пункта в меню и что-то происходит в этом месте неправильно), то лучше всего поместить пустой код в
OnPaint
, который проверит некоторое условие, справедливое только в определенных обстоятельствах. А затем помещаем точку прерывания внутрь блока
if
следующим образом:

Поделиться:
Популярные книги

Провалившийся в прошлое

Абердин Александр М.
1. Прогрессор каменного века
Приключения:
исторические приключения
7.42
рейтинг книги
Провалившийся в прошлое

Хроники сыска (сборник)

Свечин Николай
3. Сыщик Его Величества
Детективы:
исторические детективы
8.85
рейтинг книги
Хроники сыска (сборник)

Не грози Дубровскому! Том II

Панарин Антон
2. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Не грози Дубровскому! Том II

Инвестиго, из медика в маги 2

Рэд Илья
2. Инвестиго
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Инвестиго, из медика в маги 2

Отмороженный

Гарцевич Евгений Александрович
1. Отмороженный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Отмороженный

Хозяйка лавандовой долины

Скор Элен
2. Хозяйка своей судьбы
Любовные романы:
любовно-фантастические романы
6.25
рейтинг книги
Хозяйка лавандовой долины

Барон ненавидит правила

Ренгач Евгений
8. Закон сильного
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Барон ненавидит правила

Кодекс Крови. Книга V

Борзых М.
5. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга V

Звездная Кровь. Изгой II

Елисеев Алексей Станиславович
2. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
технофэнтези
рпг
5.00
рейтинг книги
Звездная Кровь. Изгой II

Держать удар

Иванов Дмитрий
11. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Держать удар

Блуждающие огни 4

Панченко Андрей Алексеевич
4. Блуждающие огни
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Блуждающие огни 4

Надуй щеки!

Вишневский Сергей Викторович
1. Чеболь за партой
Фантастика:
попаданцы
дорама
5.00
рейтинг книги
Надуй щеки!

Делегат

Астахов Евгений Евгеньевич
6. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Делегат

Клан

Русич Антон
2. Долгий путь домой
Фантастика:
боевая фантастика
космическая фантастика
5.60
рейтинг книги
Клан