Вход/Регистрация
C# для профессионалов. Том II
вернуться

Ватсон Карли

Шрифт:

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

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

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

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

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

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

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

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

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

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

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

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

private void InitializeComponent {

 this.TopMost = true;

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

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

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

protected override void OnPaint(PaintEventArgs e) {

 // Condition оценивается как true, когда требуется прерывание

 if (Condition == true) {

int ii = 0; // <-- ЗАДАТЬ ЗДЕСЬ ТОЧКУ ПРЕРЫВАНИЯ

 }

Это быстрый и простой способ создания условной точки прерывания.

Изображение прокручиваемых окон

Наш ранний пример

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

Расширим пример

DrawShapes
для демонстрации прокрутки. Начнем с создания примера
BigShapes
, в котором сделаем прямоугольник и эллипс немного больше. При этом продемонстрируем, как использовать структуры
Point
,
Size
и
Rectangle
, используя их для определения областей рисования. С такими изменениями соответствующая часть класса
Form1
выглядит следующим образом:

// поля-члены

private Point reсtangleTopLeft = new Point(0, 0);

private Size rectangleSize = new Size(200, 210);

private Point ellipseTopLeft = new Point(50, 200);

private Size ellipseSize = new Size(200, 150);

private Pen bluePen = new Pen(Color.Blue, 3);

private Pen redPen = new Pen(Color.Red, 2);

private void InitializeComponent {

 this.components = new System.ComponentModel.Container;

 this.Size = new System.Drawing.Size(300, 300);

 this.Text = "Scroll Shapes";

 this.BackColor = Color.White;

}

#endregion

protected override void OnPaint(PaintEventArgs e) (

 Graphics dc = e.Graphics;

 if (e.ClipRectaringle.Top < 350 || e.ClipRectangle.Left < 250) {

Rectangle RectangleArea =

new Rectangle(RectangleTopLeft, RectangleSize);

Rectangle EllipseArea =

  • Читать дальше
  • 1
  • ...
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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