Программирование >>  Программирование с использованием ajax 

1 ... 346 347 348 [ 349 ] 350 351 352 ... 396


hello front Vbiwl ck

Рис. 33.15. Прорисовка текста с исполъзовани£м изображения

Вызов метода DrawString () аналогичен предыдущим случаям использования этого метода. В качестве аргументов он принимает текст, шрифт, созданную текстурную кисть и ограничивающий прямоугольник:

д.DrawString( Hello from Beginning Visual C# , trFont, tBrush, ClientRectangle);

Двойная буферизация

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

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

Практическое эаняпДГ

Двойная буферизация

Чтобы создать более производительное приложение, выполните следующие действия.

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

protected override void OnPaint(PaintEventArgs e) {

Graphics g = e.Graphics; Random r = new Random () ;

g.FillRectangle(Brushes.White, ClientRectangle);

for (int X = 0; X < ClientRectangle.Width; x++) {

for (int у = 0; у < ClientRectangle.Height; у += 10) {

Color с = Color.FromArgb(r.Next (255), r.Next(255), r.Next (255));



using (Pen р = new Pen (с, 1)) {

g.DrawLine(р, newPoint(0, 0), new Point(x, y));

2. При выполнении этого кода прорисовка выполняется на наших глазах (конечно, если компьютер не является слишком быстрым). По завершении прорисовки окно выглядит, как показано на рис. 33.16.


Рис. 33.16. Рисование без двойной буферизации

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

protected override void OnPaint(PaintEventArgs e) {

Graphics displayGraphics = e.Graphics;

Random r = new Random () ;

Image i = new Bitmap (ClientRectangle. Width, ClientRectangle. Height) ; Graphics g = Graphics .Fromlmage (i) ;

g.FillRectangle(Brushes.White, ClientRectangle);

for (mt X = 0; X < ClientRectangle .Width; x++) {

for (int у = 0; у < ClientRectangle .Height; у += 10) {

Color с = Color.FromArgb (r.Next (255), r.Next(255), r.Next (255)) ; Pen p = new Pen(c, 1);

g.DrawLine(p, new Point (0, 0), new Point(x, y)); p.Dispose 0;

displayGraphics.Drawlmage(i, ClientRectangle); i.Dispose 0;



Описание полученных результатов

Часть кода, отвечающая за рисование линий, понятна - метод DrawLine () рассматривался ранее в этой главе. Единственный элемент в этой части кода, заслуживающий отдельного упоминания - статический метод FromArgb () структуры Color, который создает структуру Color из трех переданных целочисленных значений, соответствующих красному, зеленому и синему компонентам цвета.

В коде двойной буферизации (шаг 3) следующая строка создает новое изображение, высота и ширина которого равны размерам прямоугольника ClientRectangle:

Image i = new Bitmap(ClientRectangle.Width, ClientRectangle.Height); Затем следующая строка получает объект Graphics из изображения:

Graphics g = Graphics.Fromlmage(i);

Все операции прорисовки аналогичны выполняемым в предыдущем коде, за исключением того, что теперь они выполняются в изображение, а не непосредственно в окно. И, наконец, в самом конце, код выполняет рисование изображения в окне:

displayGraphics.Drawlmage(i, ClientRectangle);

Поскольку вначале линии рисуются в невидимое изображение, приходится подождать некоторое время, прежде чем что-либо появится на экране.

Расширенные возможности GDI+

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

Отсечение

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

На рис. 33.17 показано окно, содержащее гистограмму, которое частично заслонено другим окном.

После закрытия калькулятора и прорисовки границы окна операционной системой Windows окно гистограммы выглядит, как показано на рис. 33.18.

На этом этапе метод OnPaint () должен быть вызван применительно к окну гистограммы, причем прямоугольник отсечения должен быть установлен в соответствии с областью, открывающейся в результате закрытия окна и показанной на рис. 33.18 черным цветом. Теперь гистограмма должна была бы выполнить прорисовку тех участков своего окна, которые ранее располагались под перекрывающим его окном. Столбцы Cars и Trains перерисовки не требуют, и фактически, даже если бы метод OnPaint () попытался выполнить рисование в других областях окна, кроме открытой, он не смог бы этого сделать. Любые выполненные им операции рисования игнорировались бы.



1 ... 346 347 348 [ 349 ] 350 351 352 ... 396

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