Пятница, 26.04.2024, 05:35
Приветствую Вас Гость | RSS

Лекции

Меню сайта
Форма входа
Категории раздела
ТАУ (Теория автоматического управления) [31]
лекции по ТАУ
Экология [151]
учебник
Бухгалтерский учет и налогообложение в строительстве [56]
Дементьев А.Ю. - Практическое пособие
Психология [104]
Пип
информатика [80]
с# Карли Ватсон
современные стулья [0]
новинки
Поиск

Главная » 2010 » Февраль » 11 » Двойная буферизация
00:39
Двойная буферизация
Двойная буферизация
Мы уже коротко касались проблем, которые возникают
в тех случаях, когда процедура рисования требует слишком
много времени и пользователю приходится очень долго ожи-
дать, пока рисунок будет выведен на экран полностью. Как мы уже объясняли, ре-
шение этой проблемы заключается в создании образа, который затем — после
завершения всех графических операций над ним — целиком выводится в окно.
Практикум: пример без использования двойной буферизации
Использованная в данном примере программа onPainto рисует большое коли-
чество линий цветом, выбираемым случайным образом. Когда вы запускаете эту
программу, то можете увидеть саму процедуру рисования (если, конечно, у вас не
слишком быстродействующий компьютер):
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 p = new Pen(c, 1) ) -
.:{••
g . D r a w L i n e ( p , new P o i n t ( 0 , 0 ) , new P o i n t ( x , y ) ) ;
Введение в GDI+ 449
Запустив программу и дождавшись окончания процедуры
рисования, вы увидите в окне подобное представленному на
рисунке слева.
Практикум: пример с использованием
двойной буферизации
Если воспользоваться следующей версией процедуры
OnPaint (), то весь рисунок будет выведен мгновенно после
• одно- или двухсекундной задержки:
protected override void OnPaint(PaintEventArgs e)
{
Graphics display-Graphics = 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 (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)) ;
Pen p = new Pen (с, 1) ;
g.DrawLine(p, new Point (0# 0) , new Point (x, y)) ;
p.DisposeO ;
displayGraphics.DrawImage(i, ClientRectangle);
i.Dispose();
Как это работает
В следующей строке мы создаем новый образ, обладающий той же высотой
И Шириной, ЧТО И ClientRectangle:
Image i = new Bitmap(ClientRectangle.Width, ClientRectangle.Height);
Далее, мы получаем объект Graphics из образа с помощью следующей строки:
Graphics g = Graphics.Fromlmage(i);
Все графические операции, которые выполняются,— те же самые, что и в пре-
дыдущем примере, единственное отличие заключается в том, что теперь их резуль-
тат заносится в образ, а не выводится непосредственно в окне.
Наконец, перед завершением функции мы выводим образ в окне:
displayGraphics.Drawlmage(i, ClientRectangle);
Поскольку все линии сначала заносятся в образ, который является невидимым,
то прежде, чем мы сможем что-либо увидеть на экране, должно пройти некоторое
время.
450 Глава 16
Дополнительные возможности GDI+
Мы только слегка затронули многие возможности, предоставляемые GDI+. На
самом деле, его возможности намного шире — настолько, что их невозможно ох-
ватить в одной главе. Однако, прежде чем завершить эту главу, мы познакомимся
с некоторыми из дополнительных возможностей.
Вырезание отдельных частей рисунков
Существуют три области, для которых возможность работать с частями рисун-
ков оказывается важной.
Во-первых, при вызове события OnPaint о ему кроме объекта Graphics переда-
ется вырезанный прямоугольник. При использовании простых процедур рисования
можно не обращать особого внимания на этот вырезанный прямоугольник, однако
если используется сложная процедура, требу-
ющая большого количества времени, то время
рисования может быть уменьшено за счет про-
верки вырезанного прямоугольника перед вы-
полнением соответствующих операций. Нам
известен ограничивающий прямоугольник лю-
бого графического изображения или фигуры,
которые мы рисуем. Если этот прямоугольник
не пересекается с вырезанным, то можно не~
выполнять данную графическую операцию.
На рисунке справа представлен экран, где
окно с диаграммой частично закрывается дру-
гим окном с калькулятором.
После того как калькулятор будет закрыт, а операционная сис-
тема Windows восстановит границу оставшегося окна, окно с диа-
граммой примет вид, показанный на рисунке слева.
В этот момент будет вызвано событие OnPainto для окна с диа-
граммой, при этом в качестве вырезанного прямоугольника ему
передается область, которую занимало закрытое к этому моменту
окно (на рисунке закрашена черным цветом). Теперь необходимо
заново нарисовать только эту часть окна с диаграммой; более того,
если метод OnPainto и попытается осуществить графический вы-
вод в какой-либо участок рисунка, отличный от того, который был
заслонен другим окном, он не сумеет этого сделать. Любые графи-
ческие операции, выполняемые им, будут игнорироваться. У окна
с диаграммой имеется информация об ограничивающем прямоугольнике той части
диаграммы, которая относится к автомобилям, и соответственно есть возможность
определить, пересекается ли этот прямоугольник с той частью окна, которая была
заслонена другим окном. Убедившись в том, что эти две области не пересекаются,
программа рисования не будет выполнять повторное рисование той части экрана,
которая имеет отношение к автомобилям.
Иногда, когда в процессе рисования возникает необходимость нарисовать толь-
ко часть какой-либо фигуры или изображения, зачастую оказывается проще нари-
совать всю фигуру целиком, а затем вырезать ту часть, которую мы хотим увидеть.
Если есть некий образ, то может возникнуть необходимость вывести на экран
лишь некоторую его часть. Вместо того чтобы создавать новый образ, который
Введение в GDI+ ^ . 451
будет представлять собой требуемую часть исходного образа, можно просто опре-
делить вырезаемый прямоугольник, а затем нарисовать этот образ таким образом,
чтобы только интересующая нас часть этого рисунка была видна в вырезанной
области. Этот способ следует использовать при создании бегущей строки. После-
довательно изменяя место, в котором выводится текст, и одновременно задавая
вырезаемый прямоугольник, можно получить эффект движущегося в горизонталь-
ном направлении текста.
Наконец, существует способ, который позволяет создавать "окно просмотра"
рисунка, имеющего большие размеры. Пользователю предоставляется возмож-
ность перемещать это окно по всему рисунку с помощью мыши или используя ли-
нейки прокрутки. Окно просмотра может также перемещаться программным путем
в зависимости от каких-либо других действий, выполняемых пользователем.
В этом случае задание вырезаемого прямоугольника и вывод в него только того,
что он позволяет увидеть, является хорошим приемом.
Дополнительную информацию вы можете почерпнуть в свойстве clip класса
Graphics.
Вывод на печать
GDI+ включает в себя полную поддержку вывода на печать, содержащуюся
В классах, которые наХОДЯТСЯ В пространстве имен System.Drawing.Printing. Ha-
писание программ, предназначенных для вывода графической информации на прин-
тер, аналогично написанию программ, предназначенных для вывода графической
информации на экран. Для этого используются те же самые объекты — Graphics,
Point, Size, Rectangle, Pen, Brush, Image И Т. Д.; ХОТЯ механизм ИХ использования
несколько отличается. Вместо того чтобы реагировать на событие onPainto, мы
создаем обработчик событий (который мы можем назвать произвольным образом)
и регистрируем его как обработчик событий для вывода страницы:
PrintDocument pd - new PrintDocument {) ;
// Предполагается использования принтера по умолчанию
pd.PrintPage += new PrintPageEventHandler(this. pd_JPrintPage);
Зарегистрировав Обработчик, ВЫЗЫВем метод Print О Класса PrintDocument:
pd. Print () ;
Класс PrintDocument будет осуществлять повторяющиеся вызовы этого обра-
ботчика событий. В тот момент, когда вызывается наступление события, требуе-
мая страница выводится на принтер. Механизм вывода на принтер на самом деле
несколько более сложен, но эта схема позволяет получить общее представление
о том, каким образом это происходит.
Необходимо принимать во внимание и некоторые другие моменты. У принтера
разрешение в пикселях отличается от разрешения экрана, и при выводе графиче-
ской информации на принтер нужно это учитывать. Некоторые принтеры поддер-
живают цветную печать, а некоторые — нет. Существует возможность создавать
гибкий код, который принимает во внимание все эти моменты и ведет себя доста-
точно интеллектуально в любых ситуациях.
Предварительный просмотр
Существует возможность создавать окно предварительного просмотра, в кото-
ром будет демонстрироваться, каким образом выглядит страница, предназначенная
для вывода на печать. Для предварительного просмотра используется тот же самый
452 Глава 16
иЩргЫ preview
Rage
*Х:'* ;
обработчик событий, который был написан для
вывода на печать. Пользователь, открыв окно
предварительного просмотра, получает возмож-
ность постраничного просмотра всего документа.
Кроме того, есть еще возможность увеличивать
и уменьшать масштаб любой части просматривае-
мой страницы для более подробного ее рассмотре-
ния. Изображение экрана, на который выведено
окно предварительного просмотра, приводится на
рисунке слева.
Повторим еще раз, что это всего лишь краткий
обзор темы, которая рассматривалась в главе 15.
Пространство имен System.Drawlng.Drawing2D
Классы, входящие в состав этого пространства имен, позволяют использовать
усложненные функциональные возможности для вывода двумерной и векторной
графики. Эти классы могут быть использованы для создания сложных приложе-
ний, предназначенных для обработки и вывода изображений.
Векторная графика представляет собой способ, при котором программисту во-
обще не приходится указывать конкретные пиксели. Вместо этого он задает мно-
жественные "векторы", среди которых, например, такие операции, как "проведи
линию от одной точки до другой", "нарисуй прямоугольник в указанных координа-
тах" и т. д. После это у разработчика программы имеется возможность выполнять
масштабирование, вращение и другие преобразования. После осуществления всех
необходимых преобразований их результат сразу представляется в соответствую-
щем окне.
В состав пространства имен входят усложненные кисти. Кроме таких кистей,
как LinearGradientBrush И PathGradientBrush, существует еще КИСТЬ HatchBrush,
позволяющая использовать штриховку для рисования и фона, и основного рисунка.
В это же пространство имен входит класс Matrix, в котором описаны геометри-
ческие преобразования. С помощью этого класса можно видоизменять графиче-
ские преобразования. Например, с помощью класса Matrix можно вывести овал
в косой проекции.
В состав этого пространства имен входит также и класс GraphicsPath, предо-
ставляющий возможность сначала определить сложный путь, а затем нарисовать
его целиком за один присест.
Пространство имен System.Drawing.lmaging
Классы, включенные в это пространство имен, обеспечивают поддержку более
сложных возможностей при работе с образами. Две основные группы функцио-
нальных возможностей пространства имен — это классы для работы с метафайла-
ми и классы кодирования/декодирования.
В метафайле описывается последовательность осуществляемых графических
операций, которую можно сохранить и позднее отыграть назад. Классы Encoder
и Decoder позволяют расширять GDI + , с тем чтобы иметь возможность поддер-
живать любой произвольный графический формат. Подробнее ознакомиться с ним
можно, обратившись к вхождению System.Drawing.lmaging в .NET Framework
Reference (руководство по .NET Framework).
Введение в GDI+ 453
Итоги
В этой главе были рассмотрены некоторые из классов, входящих в состав про-
странства имен system.Drawing. Мы познакомились с тем, каким образом в класс
Graphics инкапсулируется поверхность рисования. Мы рассмотрели также меха-
низм рисования, при использовании которого событие OnPainto вызывается каж-
дый раз, когда рисунок, находящийся в окне, должен быть изменен.
Мы изучили выбор цвета и различные системы координат. Мы познакомились
также СО Структурами Point, Size И Rectangle, КОТОрые ИСПОЛЬЗуЮТСЯ ДЛЯ ОПреде-
ления местоположения и размеров поверхности рисования. После этого мы разо-
брали некоторые примеры, посвященные рисованию линий, фигур, текста
и образов.
Перечень тем, рассмотренных в настоящей главе:
• Класс Graphics !
• Структура color
• Рисование линий с помощью класса Реп
• Рисование фигур с помощью класса Brush
• Рисование текста с помощью класса Event
• Рисование образов с помощью класса Bitmap
• Создание образов (двойная буферизация)
Мы узнали, что очень важно вызывать метод Dispose о по окончании работы
с определенными классами. Это справедливо для следующих классов:
• Graphics
• Pen
• Brush
• Font
• Image
Наконец, мы представили обзор дополнительных графических возможностей,
которыми обладает .NET Framework, а также узнали, к каким разделам докумен-
тации .NET Framework Reference (руководство по .NET Framework) следует об-
ращаться для получения более детальной информации относительно названных
возможностей.
1











Категория: информатика | Просмотров: 1374 | Добавил: basic | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Календарь
«  Февраль 2010  »
ПнВтСрЧтПтСбВс
1234567
891011121314
15161718192021
22232425262728
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

krutoto.ucoz.ru
Бесплатный конструктор сайтов - uCoz