Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Структурные особенности Visual Basic.docx
Скачиваний:
44
Добавлен:
17.11.2019
Размер:
2.86 Mб
Скачать

95.Пример отображения базовых геометрических фигур, использующих api-функции.

Отобразить базовые геометрические фигуры, используя API-функции Windows. PrivateSubCommand1_Click()DimOldBrushAsLong, BrushAsLong, PenAsLong,OldPenAsLong, i AsInteger, mLPAsLOGPENDimW AsPOINTAPI, lppAsPOINTAPIBrush= CreateSolidBrush(RGB(0, 255, 0))OldBrush= SelectObject(Form1.hdc, Brush)W.x=1Fori = 1 To6'Отображение фигур различными стилями пера 1…6

WithmLP.lopnStyle= i 'Задаем стиль линии.lopnWidth= W.lopnColor= &HFF

EndWith

Pen= CreatePenIndirect(mLP)OldPen= SelectObject(Form1.hdc, Pen)Ifi = 1 ThenCallRectangle(Form1.hdc,20,30,70,80)Ifi = 2 ThenCallEllipse(Form1.hdc,100,30,150,80)Ifi = 3 ThenCall_Pie(Form1.hdc,180,30,230,80,180,30,230,30)Ifi = 4 ThenCall_Chord(Form1.hdc, 260, 30, 310, 80,260,30,310,50)Ifi = 5 ThenCall_RoundRect(Form1.hdc,20,120,70,170,25,25)if i = 6 ThenCallSelectObject(Form1.hdc, OldPen)W.x= 3mLP.lopnWidth= WPen= CreatePenIndirect(mLP)

OldPen= SelectObject(Form1.hdc, Pen)CallArc(Form1.hdc,200,100,320,200,350,250, 200,400)CallMoveToEx(Form1.hdc, 400, 250, lpp)CallLineTo(Form1.hdc, 260, 150)CallLineTo(Form1.hdc, 190, 250)CallFloodFill(Form1.hdc, 250, 120, &HFF)EndIfCallSelectObject(Form1.hdc, OldPen)NextCallSelectObject(Form1.hdc, OldBrush)EndSubPrivateSubForm_Load()Caption= "Примеротображенияграфическихпримитивов"End Sub

96.Создание и заполнение произвольных областей. Пример.

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

•Сначала создается область.

•Затем выбирается кисть и ею заполняется область.• И, наконец, ненужные области удаляются подобно логическим инструментам с помощью функции DeleteObject. При работе с областями используются следующие API-функции.

♦CombineRgn(ByValhDestRgnAsLong, ByValhSrcRgn1 AsLong, ByValhSrcRgn2 AsLong, ByValnCombineModeAsLong) –объединяет области hSrcRgn1, hSrcRgn2 и помещает результат в уже существующую область hDestRgn. АргументnCombineMode задает режим объединения, который может принимать одно из следующих значений :

RGN_AND –объединенная область содержит части, общие для обеих областей;

RGN_OR –объединенная область содержит обе области hSrcRgn1,hSrcRgn2;

RGN_XOR –объединенная область содержит только те части hSrcRgn1, hSrcRgn2, которые не являются общими для обеих областей;

RGN_COPY – объединенная область содержит лишь область hSrcRgn1, а область hSrcRgn2 игнорируется; RGN_DIFF -в объединенную область помещается лишь та часть hSrcRgn1, которая не принадлежит области hSrcRgn2 (RGN_DIFF= hSrcRgn1 -hSrcRgn2). Размер объединенной области, как и вообще любой области, не может превышать 64 Кбайт. Для повышения эффективности работы функции желательно, чтобыRgn1 была областью простой формы(прямоугольник или эллипс).

♦CreateEllipticRgn(ByValx1 AsLong, ByValy1 AsLong, ByValx2 AsLong, ByValy2 AsLong) – создает

Область в виде эллипса(или окружности), вписанного в прямоугольник x1,y1,x2,y2.

*CreateRectRgn(ByValx1 AsLong, ByValy1 AsLong, ByValx2 AsLong, ByValy2 AsLong) –создает прямоугольную область.

*CreateRoundRectRgn(ByValx1 AsLong, ByValy1 AsLong, ByValx2 AsLong, ByValy2 AsLong, ByValx3 AsLong, ByValy3 AsLong) –создает прямоугольную область с закругленными углами.

*CreatePolygonRgn(lpPointAsPOINTAPI,ByValnCountAsLong, ByValnPolyFillModeAsLong) –создает регион в виде многоугольника.*EqualRgn(ByValhSrcRgn1 AsLong, ByValhSrcRgn2AsLong) —проверяет эквивалентность двух областей.

FillRgn(ByValhdcAsLong, ByValhRgnAsLong, ByValhBrushAsLong) —заполняет(но не обводит) область кистью.

♦FrameRgn(ByValhdcAsLong, ByValhRgnAsLong, ByValhBrushAsLong, ByValnWidthAsLong, ByValnHeightAsLong) —обводит(не заполняет) область кистью.

nWidht, nHeigth-ширина и высота кисти. По умолчанию цвет кисти берется из BackColor.

♦InvertRgn(ByValhdcAsLong, ByValhRgnAsLong)—инвертирует цвет пиксель внутри области hRgn.

OffsetRgn(ByValhRgnAsLong, ByValx AsLong, ByValy AsLong) –смещает видимое изображение на x,y логических единиц по горизонтали и вертикали. Положительные значения соответствуют наращиванию координат.

PaintRgn(ByValhdcAsLong, ByValhRgnAsLong) –заполняет область целиком текущей кистью.

SetWindowRgn(ByValhWndAsLong, ByValhRgnAsLong, ByValbRedrawAsBoolean) –прикрепляет регион к окну.

97.Работа с растровыми изображениями. Курсоры.

Растровыми изображениями в Windows являются курсоры, иконки и BitMap-растры. Если они размещены в файле проекта с расширением RES, то их называют ресурсами приложения. Следует отметить, что все API-функции, начинающиеся со слов Load, обращаются к файлу ресурса или используют предопределенные инструменты, а все API-функции, начинающиеся со слов Create, создают графические образы в сегменте данных программы и тем самым ограничивают память, отводимую программе. Ресурсы же загружаются в память только при необходимости, а все остальное время находятся на диске. Их всегда необходимо удалять из памяти функцией DeleteObject.

Курсоры

Курсоры-это специальные растровые изображения, связанные с местоположением указателя мыши. Размер курсора зависит от разрешающей способности экрана и обычно составляет 32х32 пикселя. Изображение курсора хранится в виде двух масок(называемых AND и XOR), позволяющих сделать курсор«прозрачным». Курсоры обычно хранятся в файлах с расширением CUR или совместно с другими ресурсами в файле с расширением RES. Базовый курсор, который будет использоваться для окон данного класса, задается при создании класса функцией: LoadCursor(ByValhInstanceAsLong, ByVallpCursorNameAsLong) AsLong,

гдеhInstance- это экземпляр программы класса окна. При использовании базовых курсоров этот параметр должен быть равен 0.

lpCursorName-это идентификатор курсора из файла ресурса.

Обычно курсор типа IDC_WAIT (песочные часы) используется для указания на операцию, которая требует времени выполнения;

IDC_IBEAM –для операций редактирования текста; IDC_SIZEALL –при редактировании графических изображений.

Например, WC.hCursor= LoadCursor(0, IDC_NO)' илиIDC_CROSS С помощью свойства MousePointer объекта Screen можно устанавливать в рабочей области окна новый курсор.

Если возникает необходимость использовать внешний курсор, хранящийся в файле с расширением CUR, то можно воспользоваться функцией LoadCursorFromFile.

Курсоры, хранимые в ресурсах, и базовые курсоры удалять из памяти не нужно. Курсоры могут быть или одноцветными, или цветными, статическими или «живыми»(анимационными). Тип курсора, используемого в отдельной компьютерной системе, зависит от системного дисплея. Старые дисплеи типа VGA не поддерживают цветные или «живые» указатели.

98.Работа с растровыми изображениями. Иконки.

Иконки используются для отображения окна в закрытом состоянии представляют собой не большое графическое изображение. При заполнении структуры WNDCLASSEX полю hIcon присваивается иконка размером 32x32 пикселя, а полю hIconSm-иконка 16x16 пикселей. Как и курсоры, иконки содержат две маски, что позволяет регулировать их прозрачность. Они могут храниться в файлах с расширением ICO либо в файлах с расширением RES. Иконка, которая должна использоваться во всех окнах класса, загружается одной из функций: LoadIcon, ExtractIcon, LoadResPicture. Синтаксис первых двух функций следующий .LoadIcon(ByValhInstanceAsLong, ByVallpIconNameAsLong) AsLong,

ExtractIcon(ByValhInstAsLong, ByVallpszExeFileNameAsString, ByValnIconIndexAsLong) AsLong,гдеlpIconName-именованный или числовой идентификатор базовой иконки;

hInst—этот аргумент может быть только App.hInstance;

lpszExeFileName-имя файла, из которого извлекаются иконки: исполнимый файл(exe), библиотека(dll) или отдельный ico-файл;

nIconIndex—номер извлекаемой иконки, или-1 для получения числа иконок в файле.

Если иконка базовая, то первый параметр у функции LoadIcon должен быть равен нулю. В среде Windows определены следующие базовые иконки: IDI_APPLICATION=0,IDI_EXCLAMATION= 1,IDI_QUESTION = 2, IDI_ASTERISK=3, IDI_HAND=4.

Кстати, функция ExtractIcon может загружать не только иконки, но и курсоры (для Windows они равнозначны).В программе можно создать собственную иконку функцией CreateIcon, а после е использования удалить функцией DeleteObject.

Для отображения в рабочей области окна иконки или курсора используется одна из следующих функций: DrawIcon(ByValhdcAsLong, ByValxLeftAsLong, ByValyTopAsLong, ByValhIconAsLong) AsLong,DrawIconEx(ByValhdcAsLong,ByValxLeftAsLong, ByValyTopAsLong, ByValhIconAsLong, ByValcxWidthAsLong, ByValcyHeightAsLong, ByValistepIfAniCurAsLong, ByValhbrFlickerFreeDrawAsLong, ByValdiFlagsAsLong) AsLong,гдеhDC—дескриптор контекста устройства, на котором будет выведена иконка. Если вывод иконки осуществляется на форму, то свойство AutoRedraw=True, а после вывода иконки нужно перерисовать объект методом Refresh; xLeft, yTop-координаты, в которые будет выведена иконка;

hIcon-дескриптор прорисовываемой иконки; cxWidth, cyHeight-размеры прорисовываемой иконки; istepIfAniCur-этот параметр указывает на номер кадра, если Вы загрузили анимированный курсор; hbrFlickerFreeDraw-дескриптор кисти для перерисовки значка. По документации, если этот параметр не опущен, то он должен снизить мерцание при прорисовке; diFlags—флаги прорисовки, которые могут иметь следующие значения: DI_NORMAL = 3 –прорисовка иконки полностью;

DI_IMAGE = 2 –прорисовка XOR-маски(изображение на черном фоне);DI_MASK = 1 –прорисовка AND-маски(черно-белый негатив). Для выделения иконки из exe-файла используется функция: ExtractAssociatedIcon(ByValhInstAsLong, ByVallpIconPathAsString, lpiIconAsLong) AsLong,гдеlpIconPath—путь к exe-файлу с иконками; lpiIcon—номер иконки в файле.

99.Работа с растровыми изображениями. Bitmap-растры.

В среде Windows существует специальный тип ресурсов- растровые изображения(BitMap-растры). Они используются в двух случаях:

•для создания собственных кистей на основе BitMap-растров и заполненияими фона фигур;

•для отображения графических изображений, которые проще создать в графическом редакторе Imagedit.exe, загрузить их в файл ресурса, а затем использовать в проекте, чем рисовать API -функциями. Для создания кисти на основе BitMap-растра существуют два способа. Первый способ основан на получении дескриптора BitMap-растра, загруженного в файл ресурса, использует одну из функций:

LoadResPicture(ByVallpBitmapNameAsLong,vbResBitmap) AsLongилиLoadBitmap(ByValhInstanceAsLong, ByVallpBitmapNameAsLong) AsLong,где lpBitmapName—имя BitMap-растра в файле ресурса, а первый параметр в функции LoadBitmap тот же, что и функции LoadIcon.

Второй способ основан на получении дескриптора, создаваемого в программе BitMap-растра, и использует функцию:CreateBitmap(ByValnWidthAsLong, ByValnHeightAsLong, ByValnPlanesAsLong, ByValnBitCountAsLong,lpBitsAsAny) AsLong

Параметрами этой функции являются ширина и высота BitMap-растра(карты бит), число цветовых плоскостей в карте бит, число бит цвета на элемент отображения дисплея и указатель на массив двоичных чисел BitMap-растра. Дескриптор кисти, создаваемый на основе BitMap-растра (дескриптор которого возвращается одной из трех приведенных выше функций), получают функцией:CreatePatternBrush(ByValhBitmapAsLong)AsLong Далее дескриптор созданной кисти необходимо установить в контекст устройства функцией:SelectObject(ByValhdcAsLong, ByValhObjectAsLong) AsLong После того, как растровое изображение и кисть больше не будут использоваться в программе, их необходимо удалить из памяти функцией

DeleteObject(ByValhObjectAsLong) AsLong Удалять созданные объекты необходимо обязательно, так как память под BitMap-растр выделяется одна и таже вместе с программой, и наложение AND иXOR-масок предыдущего и вновь создаваемого изображений может привести к зависанию компьютера, а заливка фигур будет практически не предсказуема.

С помощью функции StretchBlt изображение можно не только сжимать, растягивать, но даже выворачивать на изнанку, задавая параметры с разными знаками. Чтобы избежать потери растрового изображения при уменьшении размера, рекомендуется использовать функцию SetStretchBltMode(ByValhdcAsLong, ByValnStretchModeAsLong) AsLong, которая устанавливает один из режимов коррекции в nStretchMode:

•WHITEONBLACK=1-cохранить белые пиксели засчет черных;

•BLACKONWHITE=2-cохранить черные пиксели за счет белых;

•COLORONCOLOR=3 –используется для цветных графических изображений. Основное различие между функциями BitBlt, StretchBlt и методом PaintPicture в Visual Basic заключается в том, что метод можно применять только к определенному объекту(Picture, форме, принтеру), а с помощью функций BitBlt и StretchBlt можно выполнять копирование пикселей изображения в пределах рабочего стола. Их можно использовать для создания разнообразных приложений, например, программ копирования экрана, чего не позволяет метод PaintPicture.

Второй способ анимации основан на формировании изображения(образа) в окне на основе Bitmap-растра. Для этого сначала в памяти создается временный контекст функцией CreateCompatibleDc. Далее в него загружается Bitmap-растр из файла ресурса, используя функции LoadBitmapиSelectObject. Затем он копируется из временного контекста в контекст устройства экрана функцией BitBlt или StretchBlt. При этом если Вы выбрали черный цвет фона окна приемника(он имеет нулевую цветовую палитру), то это позволит Вам использовать режим vbSrcInvert в функции BitBlt или StretchBlt при наложении образа из памяти(Scr-источник) на экран(Dest-приемник) по логическому выражению ScrXorDest. Если цвет фона под образом отличен от черного, то следует скопировать его для последующего затирания образа в окне приемника, чтобы

Происходило движение. При этом напомню, что режим vbSrcAnd позволяет копировать из источника все биты, кроме белых, режим vbSrcPaint-копировать только белые биты, а режим vbSrcCopy-полностью копирует биты из источника в приемник.Осуществить перемещение графических образов можно не только из файла ресурса, но из файлов, расположенных на диске. Для этого вместо функции LoadBitmap следует воспользоваться функцией LoadPicture("Имя bmp-файла") объекта stdole.

В третьем способе анимации также, как и при использовании первого способа, графический образ создается в окне API-функциями ядра Windows, однако затем он копируется в память, откуда проецируется в окно через промежуток времени, создавая эффект движения. Чтобы поместить изображение в память, необходимо сначала создать временный контекст функцией CreateCompatibleDC и пустой BitMap-растр, совместимый с экранным контекстом, функцией CreateCompatibleBitMap(как это было показано в

Далее функцией SelectObject пустой BitMap-растр устанавливается во временном контексте, а затем в него копируется графический образ с экрана функцией BitBlt или StretchBlt. Далее происходит циклическое отображение образа из временного контекста на экране и его затирания.

Обращаю Ваше внимание, что функции mciSendString, mciExecute могут озвучивать mp3, midi, и wav-файлы, а функция sndPlaySound-лишь wav-файлы.

100.Метафайлы.

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

1. Функция CreateMetaFile(ByVallpStringAsString) As

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

2.Функция GetMetaFile(ByVallpFileNameAsString) AsLong-открывает уже существующий метафайл и возвращает на него ссылку, если операция прошла успешно, иначе возвращает ноль.

3.Функция PlayMetaFile(ByValhdcAsLong, ByValhMFAsLong) AsLong-читает содержимое уже открытого метафайла и рисует из него изображения на контексте hDc.

5. Функция DeleteMetaFile(ByValhMFAsLong) AsLong-освобождает дескриптор метафайла. Сам метафайл при этом не разрушается и может быть вновь открыт функцией GetMetaFile. При воспроизведении метафайла записанный в него алгоритм реализуется с теми параметрами контекста устройства отображения, которые этот контекст имеет в данный момент, так как при создании метафайла ему не передаются умалчиваемые значения контекста. В связи с этим к нему нельзя применять функции, использующие информацию о параметрах контекста, такие какFrameRgn, CreateCompatibleDC, DrawIcon, FillRgn, DeleteDcи другие. При этом функция SelectObject возвращает ссылку на новый инструмент, а не на предыдущий, который автоматически уничтожается после завершения прорисовки изображения.