Программирование >>  Вывод графики 

1 ... 3 4 5 [ 6 ] 7 8 9 ... 19


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

protected override void OnPaint( PaintEventArgs e )

Condition() вычисляется как true, когда нужно прервать выполнение if ( Condition() == true)

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

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

Рисование прокручиваемых окон

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

Для этого примера мы расширим пример DrawShapes так, чтобы продемонстрировать прокрутку. Чтобы все стало несколько более реалистично, начнем с создания примера под названием BigShape, в котором нарисуем прямоугольник и эллипс покрупнее. К тому же в процессе работы с этим примером мы увидим, как использовать структуры Point, Size и Rectangle для задания областей рисования. Учитывая все эти изменения, соответствующая часть класса Form1 будет выглядеть так, как показано ниже.

поля-члены

Private readonly Point rectangleTopLeft = new Point(0, 0); private readonly Size rectangleSize = new Size(200,200); private readonly Point ellipseTopLeft = new Point(50, 200); private readonly Size ellipseSize = new Size(200, 150); private readonly Pen bluePen = new Pen(Color.Blue, 3); private readonly Pen redPen = new Pen(Color.Red, 2); protected override void OnPaint( PaintEventArgs e )

base.OnPaint(e); Graphics dc = e.Graphics;

if (e.ClipRectangle.Top < 350 e.ClipRectangle.Left < 250)

Rectangle rectangleArea =

new Rectangle (rectangleTopLeft, rectangleSize); Rectangle ellipseArea =

new Rectangle (ellipseTopLeft, ellipseSize); dc.DrawRectangle(bluePen, rectangleArea); dc.DrawEllipse(redPen, ellipseArea);

Отметим также, что объекты Pen, Size и Point мы объявили членами класса - это более эффективно, нежели создание новых объектов Pen всякий раз, когда нужно что-либо нарисовать, как это делалось до сих пор. Результат запуска этого примера показан на рис. 33.6.



.BiD Shapes [=эа

Проблема проявляется сразу. Наши фигуры не помещаются в пределы области 300x300 пикселей.

Обычно, если документ слишком велик, чтобы его можно было отобразить целиком, приложения добавляют в окно линейки прокрутки, чтобы можно было прокручивать содержимое окна и просматривать его по частям. Это еще одна область применения стандартных элементов управления Windows Forms, благодаря которым мы можем возложить всю работу на базовые классы и исполняющую систему .NET. Если у вас есть форма со вставленными в нее элементами управления, то экземпляр Form обычно знает, где они находятся, и потому может обнаружить ситуацию, когда окно станет настолько маленьким, что понадобятся линейки прокрутки. Экземпляр Form добавит их для вас автоматически, и сможет корректно рисовать нужные части экрана

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

Добавить линейки прокрутки очень просто. Form может сделать это для нас, но не знает, какого размера должно быть изображение, которое мы собираемся рисовать. (Причина их отсутствия в предыдущем примере BigShapes связана с тем, что Windows не знает о том, что они необходимы.) Что нужно указать - это размер прямоугольника, который охватывает область от левого верхнего угла документа (или, что равнозначно - левого верхнего угла клиентской области перед прокруткой) до такой нижней правой точки, чтобы в нее уместился весь документ (рисунок). В настоящей главе эту область будем называть областью документа. Как показано на рис. 33.7, в данном примере область документа будет иметь размер (250,350) пикселей.

Р-ис. 33.6. Результат выполнения примера с крупнкми фигурами


(250, 350)

Рис. 33.7. Определение размера области документа



Сообщить форме размер документа очень легко. Для этого используется соответствующее свойство Form.AutoScrollMinSize. Таким образом, можно добавить следующий код либо к методу InitializeComponent(), либо к конструктору Form:

private void InitializeComponent()

this.components = new System.ComponentModel.Container(); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.Text = Form1 ;

this.BackColor = System.Drawing.Color.White;

this.AutoScrollMinSize = new Size(250, 350);

Это свойство можно также установить в окне свойств Visual Studio 2008. Обратите внимание на то, что для того чтобы получить доступ к классу Size, нужно добавить следующий оператор using:

using System.Drawing;

Установить минимальный размер окна при запуске приложения и оставить его таковым - это нормально для данного конкретного примера, поскольку мы всегда знаем, каким будет размер всего экрана приложения. Наш документ никогда не изменяет своего размера в процессе работы этого приложения. Однако если принять во внимание, что приложение может, например, отображать содержимое файлов или что-то еще, для чего размер экрана может изменяться, то это свойство потребуется устанавливать в другие моменты (и в этом случае это нужно будет делать только программно, потому что окно свойств Visual Studio 2008 может помочь установить лишь начальное значение, задаваемое при конструировании формы).

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

Отметим, что теперь форма не только корректно установила линейки прокрутки, но и правильно определила их размер, чтобы продемонстрировать, какая часть документа в данный момент отображается. Можно попытаться изменить размер окна - линейки прокрутки будут реагировать должным образом, и они даже исчезнут, если сделать окно достаточно большим, чтобы документ уместился полностью.

Однако посмотрим, что случится, если мы попытаемся прокрутить содержимое окна с помощью одной из этих линеек (рис. 33.9). Ясно, что что-то идет не так!

Причина в том, что мы не принимаем во внимание позицию линеек прокрутки в коде метода OnPaint(). Очень четко это можно заметить, если минимизировать и снова восстановить окно (рис. 33.10).

S Big Shape? i-lHl*


Р-ис. 33.8. Вначале окно приложения выглядит нормально

Рис. 33.9. Прокрутка содержимого окна



1 ... 3 4 5 [ 6 ] 7 8 9 ... 19

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика