Слайд 1Изучаем язык программирования
VB.NET
СОСТАВИЛ НИКИШЕВ В.К.
Слайд 2Платформа NET
NET и изменение парадигмы
NET изменит подход к проектированию приложений
так же сильно, как появление классов в VB некогда повлияло на проектирование приложений VB5 и 6.
И переход на .NET вызовет определенные неудобства — как и переход от «бесклассовых» версий VB к поддержке классов! [ В поставку VB .NET входит утилита преобразования программ, но не стоит возлагать на нее чрезмерные надежды. Ни одна серьезная программа не преобразуется автоматически — возможно, ее будет проще написать с нуля.
Рассмотрим некоторые факторы, которые следует учитывать при переходе с VB6 на VB .NET.
Слайд 3Visual Basic: прошлое и настоящее
Visual Basic для Windows появился около
10 лет назад. Дебют состоялся 20 марта 1991 года на выставке «Windows World», хотя своими корнями он уходит к программе Ruby, написанной Аланом Купером (Alan Cooper) в 1988 году.
Бесспорно, появление Visual Basic произвело настоящую сенсацию. Стив Гиб-сон (Steve Gibson) в журнале «InfoWorld» назвал Visual Basic «потрясающим новым чудом», которое «радикально изменит подход к программированию для Microsoft Windows». Чарльз Петцольд (Charles Petzold), автор знаменитой книги, посвященной программированию для Windows на языке С, написал в «New York Times»: «Visual Basic представляет настоящую угрозу для благополучия тех, кто зарабатывает себе на жизнь, разъясняя программистам сложности программирования для Windows» (вряд ли к комментарию Петцольда стоит относиться серьезно, поскольку с того знаменательного дня были проданы миллионы книг, посвященных VB). Еще решительнее высказался Стюарт Элсоп (Stewart Alsop): он назвал Visual Basic «идеальной средой программирования для 90-х годов».
Слайд 4VB6 или VB.NET
Но 90-е годы уже прошли, поэтому никого не удивит
тот факт, что Visual Basic .NET отличается от обычного Visual Basic так же сильно, как Visual Basic версии 1 отличается от своего предшественника QuickBasic. Хотя из прежнего опыта использования Visual Basic можно вынести много полезного, переход на платформу [ Microsoft серьезно относится к этому слову. В частности, Windows тоже именуется платформой. ].NET и Visual Basic .NET (сокращенно VB .NET) сопровождается такими же основательными изменениями, как и переход с QuickBasic для DOVisual Basic:
Слайд 5Версии Visual Basic
Первые две версии Visual Basic для Windows хорошо
подходили для создания прототипов программ и демонстрационных приложений — но этим все и ограничивалось. В обеих версиях отличная среда программирования сочеталась с относительной простотой языка. Сам язык обладал относительно бедными возможностями. С появлением VB3 и новых средств работы с базами данных, требовавших изучения новой модели программирования, первая реакция нередко была обескураживающей: «Зачем они испортили VB?!» Сейчас становится понятно, что включение поддержки баз данных в VB3 было необходимо, чтобы Visual Basic из «игрушечного языка» превратился в серьезный инструмент программирования. В VB4 появились базовые возможности для создания объектов, а следовательно — базовые средства объектно-ориентированного программирования. В VB5 и VB6 объектно-ориентированные аспекты языка были расширены, появились новые возможности создания элементов и использования интерфейсов. Однако сам язык постепенно утрачивал целостность, поскольку объектно-ориентированные средства строились на базовом фундаменте, в котором их поддержка не предусматривалась. Например, правильность создания объектов в Visual Basic не гарантировалась — программисту приходилось применять особые синтаксические конструкции вместо конструкторов, используемых практически во всех объектно-ориентированных языках (конструкторы рассматриваются в главе 4). В итоге разработчики VB пришли к выводу, что поддержка VB на платформе .NET потребует новых изменений — например, использование .NET Framework требует полноценной объектной
Слайд 6Основные трудности освоения
Вероятно, при знакомстве с изменениями VB основные трудности возникнут
не в связи с новшествами в среде IDE или появлением новых ключевых слов, а из-за необходимости радикального пересмотра парадигмы программирования на VB. В частности, чтобы в полной мере использовать преимущества VB5 и VB6, с объектно-базированного подхода, обладавшего весьма ограниченными возможностями создания новых объектов, приходилось переходить на объектно-ориентированный подход, в инструментарии которого, например, важное место занимают интерфейсы. К сожалению, большинство программистов VB, выросших на этом продукте, ранее никогда не использовали принципы объектно-ориентированного программирования. Когда в VB впервые появились классы, многие программисты VB понятия не имели, что это такое и зачем они нужны.
Слайд 7Особенности VB.NET
Но даже эти ограниченные возможности, появившиеся в VB5 и VB6,
при правильном применении упрощали работу над большими проектами. Например, они позволяли создавать компоненты многократного использования (такие, как элементы управления), а на более прозаическом уровне — просто приводить код в порядок, упрощая его сопровождение. В некоторых случаях удавалось исключить оператор Select Case, нередко порождавший большие проблемы с сопровождением. Речь идет о конструкциях, более или менее похожих на следующие: [ В поставку VB .NET входит утилита преобразования программ, но не стоит возлагать на нее чрезмерные надежды. Ни одна серьезная программа не преобразуется автоматически — возможно, ее будет проще написать с нуля. ]
Слайд 8
VB как объектно-ориентированный язык
Объектно-ориентированные средства VB5 и VB6 были, мягко
говоря, ограниченными. В частности, эти версии VB не позволяли автоматически инициализировать данные класса при создании экземпляра. В результате объект создавался в неопределенном состоянии, что повышало вероятность ошибок и заставляло программиста принимать дополнительные меры предосторожности при работе с объектами. Для решения этой проблемы в VB .NET появились параметризованные конструкторы (см. главу 4).
Другим недостатком было отсутствие полноценного наследования [ Наследование — штука полезная, но оно не является панацеей для написания объектно-ориентированных программ, как считают некоторые. Бесспорно, это важное, но не самое важное усовершенствование в VB .NET. ]). Наследованием называется особая форма многократного использования кода, при которой программист определяет новые объекты на базе существующих объектов. Наследование очень хорошо подходит для таких задач, как создание нового текстового поля с расширенными возможностями на основании стандартного текстового поля. В VB версий 5 и 6 наследование не поддерживалось, поэтому для построения улучшенного текстового поля приходилось прибегать к услугам неудобной и ненадежной программы-мастера (wizard).
Рассмотрим другой пример, в котором было бы уместно наследование, — создание классов для работы со специализированными коллекциями. Чтобы создать коллекцию, специализировавшуюся на хранении строковых данных, в VB5 и 6 в класс включалось закрытое поле:
Private mCollection As Collection
Слайд 9Трудности перехода на VB .NET
Возникает заманчивая картина: вы запускаете программу
преобразования, немного дорабатываете полученный результат, и программа VB автоматически адаптируется для VB .NET!
Поверьте, этот путь ведет в тупик. Чтобы в полной мере использовать преимущества VB .NET, необходимо основательно разобраться в объектно-ориентированном программировании и принципах работы .NET Framework. Вам не придется запоминать тысячи методов, входящих в .NET Framework, но для сознательного чтения документации или использования средств IntelliSense, встроенных в IDE, нужно знать, как работает .NET. Без хорошего понимания этого материала вы попросту не сможете работать в IDE с дизайнерами форм Windows и Web.
Чтобы представить масштаб изменений, достаточно рассмотреть простейший пример — форму, на которой находится кнопка. В прежних версиях VB весь код, связанный с кнопкой (и выполнявшийся при ее нажатии), находился в процедуре события Click.
Сразу предупреждаю: при размещении кнопки на форме VB .NET среда программирования генерирует значительно больший объем кода. В этой книге мы постараемся показать, почему в
Слайд 10Сравнение С# с VB .NET
Картина была бы неполной, если бы
мы не упомянули о С#. Большая часть .NET Framework написана на С#, поэтому некоторые полагают, что именно С# является настоящим языком .NET. Хотя С# чуть мощнее VB .NET, 99% программистов никогда не будут пользоваться его дополнительными возможностями.
Тому, кто никогда не программировал на C/C++, язык С# может показаться непонятным и более сложным, чем VB .NET. Кроме того, VB .NET имеет ряд несомненных преимуществ перед С#. Ниже перечислены пять из них, которые нам кажутся самыми важными:
Присутствие многих знакомых функций VB/VBScript (таких, как Mid, Sin(x) вместо Math.Sin(x) или FormatNumber) вместо сложных и порой менее удобных функций .NET Framework.
Наглядность. В VB .NET многие понятия записываются простым естественным языком. Например, вместо конструкции С# «:» в VB .NET используются слова Inherits или Implements. В С# используются мудреные слова abstract, sealed и virtual, а в VB .NET — Must Inherit, Nonlnheritable, Overridable, Overrides, Shadows. Несомненно, второй набор выглядит понятнее, даже если не знать, что означают эти термины.
Компиляция кода происходит в фоновом режиме, поэтому вы получаете немедленный отклик от компилятора (что гораздо лучше простого лексического анализа кода, как в С#).
В VB .NET не учитывается регистр символов, а интеллектуальный редактор автоматически изменяет регистр в соответствии с объявлениями. С#, как и все языки семейства С, чувствителен к регистру символов. Людей, привыкших работать в VB, это сильно раздражает. Мы подошли к последней, самой главной причине:
VB .NET сохранил общее сходство с Visual Basic 6, самым популярным языком программирования в мире!
Слайд 11Что осталось, а что новое?
Если вам доводилось работать с предыдущими версиями
VB, интегрированная среда разработки (IDE) .NET — Visual Studio .NET — покажется отдаленно знакомой. Многое сохранилось с прежних времен — сама концепция ускоренной разработки приложений (RAD, Rapid Application Development); элементы, размещаемые на форме; запуск программы клавишей F5 и т. д.; но многое изменилось, притом в основном в лучшую сторону. Например, ужасный редактор меню, сохранившийся со времен VB1, был заменен системой редактирования меню «на месте», пользоваться которой — одно удовольствие (см. главу 8).
Кроме того, VB .NET, в отличие от прежних версий VB, не ограничивается приложениями, ориентированными на графический интерфейс, и позволяет строить приложения других типов. Например, к вашим услугам web-приложения, серверные приложения и даже консольные приложения, работающие в окне, похожем на окно DOS-сеанса. Все «визуальные» языки Microsoft наконец-то обрели единую среду разработки. Времена, когда в VC++, VJ++, Visual InterDev и Visual Basic использовались разные IDE, безвозвратно прошли (кстати говоря, пакет Visual InterDev был интегрирован в VS .NET). Другая приятная особенность новой среды — широкие возможности настройки. Теперь среду VS .NET можно настроить так, чтобы она была похожа на IDE от VB6 или любую другую IDE по вашему выбору.
Слайд 12
Разработка приложения при помощи мастеров и шаблонов
Для увеличения эффективности разработки
приложений инструментальная среда Visual Basic б предлагает большой набор специальных средств, помогающих быстрее создать как само приложение, так и его элементы: формы, диалоговые окна, отчеты, базы данных и многое другое, то есть практически все, что связано с разрабатываемым приложением и средой, в которой оно будет работать. Такие средства принято называть мастерами (Wizards).
Мастер в интерактивном режиме по шагам выполняет процесс создания и сборки элементов приложения, в проект. При работе мастера необходимо только отвечать на вопросы посредством выбора предлагаемых на каждом шаге вариантов и нажимать на кнопку Next (Следующий шаг) для перехода к следующему шагу. В соответствии с выбором создаются все необходимые элементы приложения и предварительный исходный код для них. Результатом работы мастера является макет приложения, готовый к обсуждению с заказчиком и к дальнейшей доработке до коммерческого варианта. Работу мастера можно сравнить с работой конвейера по сборке проекта приложения из предлагаемых на каждом его шаге элементов выходного продукта, будь то приложение, база данных или просто отчет по ней.
Мастер работает по шагам до окончательной сборки конечного продукта. Однако, если для разрабатываемого приложения не требуются все шаблоны форм или другие элементы приложения, предлагаемые мастером, можно на любом шаге кнопкой Finish (Готово) завершить работу мастера или пропустить указанный шаг и перейти к следующему нажатием кнопки Next. При этом будут созданы только выбранные на пройденных шагах элементы приложения. Например, если вам от мастера приложений требуется только MDI — окно и форма документа, то можно нажать кнопку Finish уже на втором шаге мастера приложений.
Мастера Visual Basic 6 решают обширный круг задач, реализуемых в виде приложений или проектов. Практически любое приложение из любой предметной области можно предварительно создать при помощи мастеров и далее дорабатывать самостоятельно с использованием инструментария среды Visual Basic 6.
В среде проектирования Visual Basic 6 имеются мастера, представленные в табл. 2.1.
Слайд 13Таблица 2.1. Список мастеров для создания приложений
МастерНазначение
Application WizardМастер приложений
Data Form WizardМастер
форм для баз данных
Data Object WizardМастер объектов баз данных
Package and Deployment WizardМастер упаковки и распространенияActiveX
Ctrl Interface WizardМастер элементов управления ActiveXActiveX Doc Migration WizardМастер миграции документов ActiveXProperty Page WizardМастер страницы свойствToolbar WizardМастер панели управленияSetup WizardМастер установки приложенийClass Builder UtilityКонструктор классовVB Wizard ManagerКонструктор мастеров
�
Слайд 14. Диалоговое окно Add-In Manager
Слайд 15Типы данных
В Visual Basic вы можете применять следующие типы данных:
числовой (integer,
Long, Single, Double, Currency);
строковый (String);
типа дата (Date);
байтовый (Byte);
логический (Boolean);
произвольный (variant);
объектный (object).
Слайд 16Область действия переменных
При выполнении программы принципиальное значение имеет область действия выбранных
переменных. Попытка использования переменных, которые не действуют в данном месте программы, приводит к ошибке программирования или же к неоднозначности результатов. В Visual Basic можно применять глобальные и локальные переменные. Глобальные переменные доступны из любой части программы. Для локальных переменных можно задавать область действия в рамках всего модуля или отдельной процедуры.
Присваивая имена переменным с учетом области ее действия, придерживайтесь следующего формата:
Область действия переменнойПрефиксПримерГлобальнаяggdtmFinishЛокальная внутри модуляmmsngLengthЛокальная внутри процедурынет префиксаstrLastname
Слайд 17. Объявление переменных, локальных на уровне модуля
Для создания переменной, которую вы
хотите определить в качестве глобальной, в раздел General Declarations главного модуля приложения поместите оператор public. Например:
Public gdtmFinish As Date
Для объявления переменной, локальной внутри модуля или формы, используйте оператор private или Dim в разделе General Declarations модуля или формы (рис. 5.2). В этом случае объявленная переменная будет доступна для всех входящих в форму или модуль процедур, но в то же время недоступной в процедурах других модулей и форм.
Рис. 5.2. Объявление переменных, локальных на уровне модуля
Переменные, локальные на уровне процедуры, создаются операторами Dim или static внутри процедуры. Например:
Sub CalcTotal
Dim bSuccess As Boolean
. . .
End Sub
�
Слайд 18Фиксированные массивы
В Visual Basic существуют массивы фиксированного размера и динамические массивы.
Массив фиксированного размера имеет неизменный размер, заданный при его объявлении. Динамические массивы могут изменять размер в процессе выполнения.
�Объявление массива фиксированного размера
Объявление массива фиксированного размера зависит от области его видимости и осуществляется следующим образом:
глобальный массив объявляется с помощью оператора public в секции Declaration модуля:
массив уровня модуля — с помощью оператора private в секции Declaration модуля;
локальный массив — с помощью оператора private процедуры.
При объявлении массива после его имени в круглых скобках указывается верхняя граница массива. По умолчанию нижней границей массива является 0. Например, в приведенном ниже коде, который вводится в секцию Declaration модуля, задается массив из 21 элемента. Индекс элементов массива изменяется от 0 до 20:
Dim intCountPar (20) As Integer
Для создания глобального массива такого же размера необходимо использовать следующий код:
Public intCountPar (20) As Integer Можно явно задать нижнюю границу массива, используя ключевое слово то:
Dim intCountPar (1 To 20) As Integer
В этом случае задается массив из 20 элементов. Индекс элементов массива изменяется от 1 до 20.
Visual Basic позволяет использовать многомерные массивы. Например, в следующем коде объявляется двумерный массив размерностью 21х21:
Dim intCountPar (20, 20) As Integer
При использовании многомерных массивов, как и в случае одномерных, можно явно задавать нижнюю границу:
Dim intCountPar (1 To 20, 1 То 20) As Integer Dim intCountPar (20, 1 То 20) As Integer
В верхней строке кода явно заданы верхняя и нижняя граница обеих размерностей. В нижней строке задана верхняя и нижняя граница только для второй размерности.
Слайд 19
Объявление динамического массива
В случае, когда размер массива заранее неизвестен. Visual Basic
позволяет использовать динамические массивы, размеры которых можно изменять во время выполнения. Применение динамических массивов позволяет эффективно управлять памятью, выделяя память под большой массив лишь на то время, когда этот массив используется, а затем освобождая ее.
Создание динамического массива осуществляется следующим образом:
1. Объявляется массив с помощью ключевых слов, используемых при создании массива фиксированного размера. Список размерностей массива остается пустым. При объявлении глобального массива необходимо выбрать ключевое слово Public, при объявлении массива на уровне модуля — Dim, при объявлении массива в процедуре — Dim или static. Например,
Dim intCountPar О As Integer
2. С помощью выполняемого оператора ReDim указывается размерность массива в виде числа или выражения. Синтаксис оператора ReDim аналогичен синтаксису оператора объявления массива фиксированного размера. Например, размерность массива может быть задана любым из следующих способов:
ReDim intCountPar (х)
ReDim intCountPar (20)
ReDim intCountPar (1 То 20)
При выполнении оператора ReDim данные, размещенные в массиве ранее, теряются. Это удобно в том случае, если данные вам больше не нужны и вы хотите переопределить размерность массива и подготовить его для размещения новых данных. Если вы хотите изменить размер массива, не потеряв при этом данных, то необходимо воспользоваться оператором ReDim с ключевым словом Preserve. Например, приведенный ниже программный код увеличивает размер массива на единицу без потери хранящихся в массиве данных:
ReDim Preserve intCountPar (X + 1)
Слайд 20Математические операторы
+Сложение
-Вычитание
*Умножение
/Деление
\Целочисленное деление
modОстаток от деления нацело
/\Возведение в степень
Слайд 21ФункцияНазначение
AsСВозвращает ASCII-код символа
ChrПреобразовывает ASCII-код в символInStr, InStrRevОсуществляют поиск одной строки в
другой
LCaseИзменяет регистр букв исходной строки на нижний
LeftВозвращает указанное количество символов с начала строки
LenВозвращает количество символов в строке
LTrim, RTrim, TrimУдаляют пробелы, расположенные соответственно в начале, в конце и с обеих сторон символьной строки
MidВозвращает заданное количество символов из произвольного места строки
RightВозвращает указанное количество символов с конца строки
Str, CStrПреобразовывают числовое выражение в строку
StrReverseИзменяет порядок следования символов в строке на обратный
StrConvИзменяет регистр букв символьной строки
ValПреобразовывают строку в числовое выражение
UCaseИзменяет регистр букв исходной строки на верхний
Слайд 22Однодокументный интерфейс
— это тип интерфейса, в котором предоставляется возможность работы только
с одним документом в одном окне. Примером может служить редактор Microsoft WordPad. Для работы с несколькими документами в таком интерфейсе необходимо многократно запускать приложение. Для каждого типа данных и документов требуется своя форма и, соответственно, свое приложение с интерфейсом типа SDI. В принципе, это тоже один из возможных вариантов, но он подходит только для работы с небольшим количеством форм документов. При загрузке большого количества SDI-приложений начинает переполняться оперативная память компьютера и приложения работают очень медленно. Каждый раз при запуске SDI-приложения в память загружаются одни и те же данные (меню, панель и элементы управления), выполняющие одинаковые действия, что приводит к неэффективной и медленной работе запускаемых приложений.
Однако полностью отказываться от интерфейса типа SDI не стоит, поскольку он вполне годится для работы с одним или двумя документами (например, для копирования из одного документа в другой). Есть и положительные стороны приложений такого типа интерфейса — они занимают меньше места на диске и в оперативной памяти, да и на их разработку уходит гораздо меньше времени, что также немаловажно.
Интерфейс типа MDI дает возможность работать в одном приложении с любым количеством открытых оконSDI-интерфейс
Интерфейс типа SDI показан на рис. 7.1. Он состоит из следующих элементов:
главного меню;
панели инструментов с элементами управления;
окна приложения для размещения элементов управления данными (в таком случае это окно с заголовком "Документ WordPad");
элементов управления для работы с данными. На рис. 7.1 это одно большое поле для работы с текстом;
строки состояния.
Слайд 24�MDI-интерфейс
Главная особенность MDI заключается в том, что для этого типа интерфейса
можно многократно открывать форму одного вида документа для нескольких разных по содержанию документов. Примером интерфейса типа MDI может служить программа Microsoft Word (рис. 7.2).
Для интерфейса такого типа
характерно наличие одного главного окна (MDI-окно),
которое обычно именуется родительским окном
(на рис. 7.2 это окно с заголовком Microsoft Word),
и необходимого для работы количества
подчиненных (вложенных) окон,
называемых дочерними (на рис. 7.2 это окна с заголовками Документ1,
Слайд 27Программа
public Class Form2
Private Sub Button3_Click(ByVal sender As System.Object, ByVal
e As System.EventArgs) Handles Button3.Click
Me.Hide()
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
TextBox1.Text = ""
TextBox2.Text = ""
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim x, res As Double
x = Val(TextBox1.Text)
res = (Math.Sin(Math.Pow(x - 2, 0.2)) + Math.Exp(2 - x)) * (4 - x) / (2 * Math.Pow(Math.Cos(x - 2), 2))
TextBox2.Text = Str(res)
End Sub
End Class
Слайд 30Программа
Public Class Form2
Dim s(20) As Integer
Dim i,
n As Integer
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
n = Val(TextBox1.Text)
TextBox2.Text = " "
Randomize()
For i = 1 To n
s(i) = Int(Rnd(1) * 41 - 20)
TextBox2.Text = TextBox2.Text + " " + Str(s(i))
Next i
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
n = Val(TextBox1.Text)
TextBox3.Text = " "
For i = 1 To n
If (s(i) Mod 2 <> 0) Then
TextBox3.Text = TextBox3.Text + " " + Str(s(i))
End If
Next
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Close()
End Sub
Слайд 31Графика: GDI+
Графическое программирование в .NET Framework полностью отличается от всего,
что было реализовано в прежних версиях VB. Знакомые графические команды (частично позаимствованные еще из QuickBasic) исчезли. Из числа принципиальных изменений также следует обратить внимание на отсутствие свойства AutoRedraw или его аналогов. В прежних версиях VB свойство AutoRedraw, равное True, избавляло программиста от необходимости программировать процедуру события Pal nt для того, чтобы обеспечить восстановление графического изображения в элементе.
Программирование графики в VB .NET основано на концепции графического контекста — отдаленного родственника контекстов устройств Windows GDI. Любопытная подробность: новая система называется GDI+, хотя с GDI она имеет очень мало общего
Слайд 32Графика: GDI+
У программистов с опытом работы в GDI переход на
GDI+ часто вызывает шок, поскольку графический вывод в .NET происходит без сохранения состояния. Иначе говоря, каждая графическая команда должна содержать полную информацию о выполняемой операции. Скажем, если вы использовали черную кисть в первой строке программы и хотите снова воспользоваться ею во второй строке, необходимо указать графической системе, что операция должна выполняться черной кистью. GDI+ «не помнит» об операциях, выполнявшихся ранее.
Классы GDI+ находятся в пространствах имен System.Drawing, System.Drawing. Drawing2D, System. Drawing. Imagi ng и System. Drawing. Text [ Каждое из этих пространств имен заслуживает отдельной книги, и здесь мы ограничимся лишь кратким упоминанием. ]. Эти пространства имен входят в сборку System.Drawing, ссылка на которую создается автоматически при выборе типа приложения Windows Application в диалоговом окне New Project.
Слайд 33Графика: GDI+
Большая часть графического вывода в GDI+ осуществляется переопределением процедуры
[ Это не событие, хотя в конечном счете перерисовка и приводит к |ызову события OnPaint базового класса Form. ]OnPaint формы или элемента. Процедура OnPaint играет столь же важную роль, как и в прежних версиях VB: она обеспечивает восстановление изображения при временном скрытии или свертывании формы. Сигнатура этой важной процедуры выглядит следующим образом: Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
Вывод осуществляется на графической поверхности GDI+, представленной экземпляром класса Graphics. Процедура OnPaint класса Form инкапсулирует такую поверхность в виде значения свойства e.Graphics.
Хотя любая форма или элемент (в том числе и PictureBox) с поддержкой вывода позволяет получить доступ к своему графическому содержимому при помощи вызова ControlName.CreateGraphics, будьте очень внимательны, если это происходит за пределами процедуры Paint. Между выводом в графическом контексте, полученным вызовом e.Graphics в процедуре OnPaint и написанием кода, использующего CreateGraphics, существуют тонкие различия. Мы столкнулись с этой проблемой при создании программы вывода всех шрифтов
Слайд 34Графика: GDI+
GDI+ ( Graphic Device Interface) - это система классов
(60) для работы с растровыми изображениями, двумерной графикой и вывода текста. Основные классы: Pen (перо), Brush( кисть), Graphics( графика), Font( шрифт), Bitmap, Image.
Растровое изображение использует элемент управления
PictureBox
Векторное изображение использует класс Graphics и создает объекты
- поверхность рисования
Dim g As Graphics = CreateGraphics()
Перо PEN
Dim MyPen As New Pen ( Color.Black.5)
Слайд 35Графика: GDI+
Кисть
Dim myBrush As New SolidBrush(Color.Red)
g.FillRectangle(myBrush1, -25, -15, 50, 30)
–
Dim MyRect As New Rectangle (-25, -15, 50, 30)
Линия
MyG.DrawLine(mMy Pen.10.10.100.1000)
Текс
MyG.DrawString(“Привет”.MyFont.Brushes.Blue.60.1600
Слайд 38Программа
Public Class Form2
Private Sub Form2_Paint(ByVal sender As System.Object, ByVal
e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
Dim g As Graphics = e.Graphics
Dim myBrush As New SolidBrush(Color.Red)
Dim myBrush1 As New SolidBrush(Color.Beige)
g.PageUnit = GraphicsUnit.Millimeter
g.TranslateTransform(50, 50)
Dim points As Point() = {New Point(-30, 15), New Point(0, 40), New Point(30, 15), New Point(30, -15), New Point(0, -40), New Point(-30, -15), New Point(-30, 15)}
g.FillPolygon(myBrush, points)
g.FillRectangle(myBrush1, -25, -15, 50, 30)
End Sub
Слайд 40Программа
Public Class Form2
Private Sub Button2_Click(ByVal sender As System.Object, ByVal
e As System.EventArgs) Handles Button2.Click
Me.Hide()
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim g As Graphics = CreateGraphics()
Dim x1, y1, x2, y2 As Integer
g.FillRectangle(Brushes.BurlyWood, 10, 10, 100, 100)
g.FillEllipse(Brushes.Coral, 120, 10, 100, 100)
x1 = Val(TextBox1.Text)
y1 = Val(TextBox2.Text)
x2 = Val(TextBox3.Text)
y2 = Val(TextBox4.Text)
g.DrawLine(Pens.Crimson, x1, y1, x2, y2)
End Sub
Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged
End Sub
End Class
Слайд 42Программа вычисления площади фигуры методом Монте-Карло
Private Sub Button2_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles Button2.Click
Dim myg As Graphics = CreateGraphics()
Dim x, y, t, k As Integer
Dim i, n As Integer
Dim s As Double
Dim r As Random = New Random
' очистка формы
myg.Clear(Color.LightGray) myg.DrawRectangle(Pens.Blue, 10, 10, 450, 300)
myg.DrawLine(Pens.Blue, 20, 155, 450, 155)
myg.DrawLine(Pens.Blue, 240, 20, 240, 300)
myg.DrawEllipse(Pens.Black, 120, 35, 240, 240)
myg.DrawEllipse(Pens.Black, 170, 85, 140, 140)
n = TextBox1.Text
Randomize()
k = 0
For i = 1 To 100
' генерируем случайные координаты точек
t = r.Next
x = t - (t \ 450) * 450 + 10
t = r.Next
y = t - (t \ 300) * 300 + 10
Слайд 43Продолжение
' если точка попадает в заданную область, то
' рисуем ее красным цветом и увеличиваем счетчик точек, попавших в эту область
' иначе рисуем ее синим цветом
If ((x - 240) * (x - 240) + (y - 155) * (y - 155) < 120 * 120) And _
((x - 240) * (x - 240) + (y - 155) * (y - 155) > 70 * 70) Then
myg.FillEllipse(Brushes.Red, x - 2, y - 2, 4, 4)
k = k + 1
Else
myg.FillEllipse(Brushes.Blue, x - 1, y - 2, 2, 2)
End If
Next
' вычисляем площадь и выводим ее в label
s = (k / n) * 450 * 300
Label1.Text = "Площадь фигуры: " + s.ToString
End Sub
End Class