Создание логического шрифта функциями createfont
TypeRECTLeftAsLong-X координата левого верхнего угла;
TopAsLong-Y координата левого верхнего угла;
RightAsLong-X координата правого нижнего угла; BottomAsLong-Y координата правого нижнего угла. EndType Координаты прямоугольной области должны быть заданы до вызова функции DrawText. Аргумент wFormat задает формат вывода текста. Форматы вывода текста начинаются с префикса DT_.
DT_BOTTOM—выравнивание по нижней части прямоугольной области. DT_TOP –выравнивание по верхней части прямоугольной области. DT_LEFT –выравнивание по левому краю прямоугольной области.
DT_RIGHT –выравнивание по правому краю прямоугольной области.
DT_CENTER –центрирование по горизонтали.
DT_VCENTER –центрирование по вертикали. DT_CALCRECT –динамически меняет ширину прямоугольной области.
DT_SINGLELINE –вывод текста в одну строку. DT_WORDBREAK –текст переносится на новую строку при достижении правой границы области, а разрыв строки происходит между словами.
89.Пример работы с базовыми шрифтами.
Если Вам необходимо изменить шрифт на один из семи базовых (предопределенных) шрифтов, то используют функции GetStockObjectиSelectObject. Пример88. Продемонстрировать работу с базовыми шрифтами. DimMyDCAsLong, S AsString, y AsIntegerDimFntAsLong, OldFntAsLong, FntName(10 To16)AsStringSubPrintFont(ByValf AsInteger)Fnt= GetStockObject(f)OldFnt= SelectObject(MyDC, Fnt)S = FntName(f)CallTextOut(MyDC, 10, y, S, Len(S))у= y + 20S = "ABCDEFGabcdeg0123456789АБВГДЕЖабвгдеж"
CallTextOut(MyDC, 10, y, S, Len(S))у= y + 20CallSelectObject(MyDC, OldFnt)EndSub PrivateSubCommand1_Click()у= 20’Начальное значение ординаты MyDC= GetDC(hWnd)ForK% = 10 To16IF K Mod2 = 1 ThenR= 1ElseR = 2EndIFCall
SetBkMode(MyDC, R)’Режим отображения прямоугольника
CallSetBkColor(MyDC, &H50FFF1 * K)
Цвет прямоугольника CallPrintFont(K)NextCallReleaseDC(hWnd, MyDC)EndSubPrivateSubForm_Load()Caption="Пример использования базовых шрифтов"BackColor= &HFFFFFFFntName(10) = "Oem_Fixed_Font"FntName(11) = "Ansi_Fixed_Font"FntName(12) = "Ansi_Var_Font"FntName(13) = "System_Font"FntName(14) = "Device_Default_Font"FntName(15) = "Default_Pallete"FntName(16) = "System_Fixed_Font"EndSub
90.Создание логического шрифта функциями CreateFont, CreateFontIndirect.
Создать собственный логический шрифт, доступный системе, на основе контурного шрифта можно с помощью функций CreateFontиCreateFontIndirect. Обе они возвращают дескриптор шрифта, который следует связать с контекстом функцией SelectObject, а после вывода текстовой информации удалить его из памяти функцией DeleteObject. Функция CreateFont имеет 14 параметров, а функция CreateFontIndirect-один параметр типа LOGFONT с теми же 14-ю полями данных.TypeLOGFONT
lfHeightAsLong’ Высота шрифта
lfWidthAsLong’Средняя ширина строчной буквы lfEscapementAsLong’ Наклон строки или символа lfOrientationAsLong’Наклон символа lfWeightAsLong’Жирность шрифта lfItalicAsByte’Признак курсива
lfUnderlineAsByte’Признак подчеркивания lfStrikeOutAsByte’Признак перечеркивания lfCharSetAsByte’Набор символов lfOutPrecisionAsByte’ Точность отображения lfClipPrecisionAsByte’Отсечение lfQualityAsByte’Качество прорисовки lfPitchAndFamilyAsByte’Семейство шрифта lfFaceName(1 To32) AsByte’Имя шрифта EndType Назначение полей(параметров) структуры следующее. lf Height—высота символов. Значение, большее0 (до16384), указывает на высоту шрифта в пикселях. Если же это значение равно0, то используется умалчиваемое значение. lfWidth—ширина символов. Для пропорциональных
шрифтов означает среднюю ширину строчных букв. Если параметр равен 0, ширина выбирается пропорционально высоте символа. lfEscapement—угол наклона базовой линии символов или строк к горизонтальной оси в десятых долях градуса. Положительный угол означает поворот базовой линии против часовой стрелки. lfOrientation—этот параметр зарезервирован. lfWeight-коэффициент, указывающий на жирность шрифта: FW_THIN =100 ‘Очень тонкий шрифт
FW_EXTRALIGHT = 200 ‘Очень светлый шрифт FW_LIGHT =300 ‘Светлый шрифт
FW_NORMAL = 400 ‘Нормальный шрифт FW_MEDIUM = 500 ‘Утолщенный шрифт FW_SEMIBOLD = 600 ‘Полужирный шрифт
FW_BOLD=700 ‘Жирный шрифт
FW_EXTRABOLD = 800 ‘ Усиленный шрифт FW_BLACK = 900 ‘Тяжелый шрифт
lfItalic-определяет наклонность символов, когда равно 1.
I/Underline-определяет подчеркнутость символов, когда равно1.
lfStrikeOut—определяет перечеркнутость, когда равно1.lfCharSet-определяет набор символов: ANSI_CharSet=0(Windows-кодировка, поддерживает кириллицу); Symbol_CharSet=2 иShiftJis_Char-Set=128 содержат греческий алфавит, спец символы и различные пиктограммы, не поддерживающие кириллицу.
lfOutPrecision—задает точность представления символов на физическом устройстве. Рекомендуемые значения: Out_Character_precis= 2,
Out_Default_precis= 0, Out_Device_precis= 5, Out_Outline_precis= 8, Out_Raster_precis= 6, Out_String_precis= 1, Out_Stroke_precis= 3, Out_TT_only_precis= 7, Out_TT_precis= 4.lfQuality-определяет качество прорисовки шрифта и может иметь одно из значений: Default_Quality=0,Draft_Quality=1,Proof_Quality=2 (поумолчанию). lfFaceName-задает имя шрифта. Например, «CourierNewСуг».lfPitchAndFamily—выбор семейства шрифта. Рекомендуемые значения: Default_Pitch=0 (по умолчанию), Fixed_Pitch=1(моноширинный), Variable_Pitch=2 (пропорциональный).Обычно в комплект русифицированных версий Windows входит более 30 контурных шрифтов(TrueType
шрифтов), поддерживающих кириллицу. Среди них основными в работе с документами являются три шрифта: CourierNewCyr, ArialCyr, TimesNewRomanCyr. Все контурные шрифты имеют по 4 начертания: обычный, наклонный, жирный, жирный наклонный. Шрифт ArialCyr-это пропорциональный шрифт без украшений, используемый в основном для заголовков, оглавлений документов. CourierNew-это моноширный шрифт, похожий на шрифт канцелярской пишущей машинки, используемый в оформлении таблиц. TimesNewRomanCyr-изящный в начертании шрифт, используемый при оформлении документов.
91.Создание логической кисти функциями CreateSolidBrush, CreateBrushIndirect, CreatePatternBrush, CreateHatchBrush.
Для создания логической кисти используются перечисленные ниже функции, причем каждая из них создает дескриптор на кисть, которую необходимо после использования уничтожить функцией DeleteObject.
1. CreateBrushIndirect(lpLogBrushAsLOGBRUSH)-создает произвольную кисть. Аргумент lpLogBrush—это структура данных типа LOGBRUSH:TypeLOGBRUSHlbStyleAsLong’Стиль кисти lbColorAsLong’ Цвет
lbHatchAsLong’ Способ штриховки(орнамент) EndType
Стиль кисти lbStyle может иметь одно из следующих значений констант :
BS_SOLID=0 –сплошная кисть;
BS_NULL=1 –пустая кисть;
BS_HATCHED=2-штрихующая кисть;
BS_PATTERN=3 –кисть использует растровое изображение для заполнения фона;
BS_DIBPATTERN =5 –кисть использует аппаратно-независимый образец фона.
Если lbStyle=BS_SOLID, то значение поля штриховки lbHatch игнорируется. ЕслиlbStyle=BS_PATTERN, то поле lbHatch должно содержать дескриптор растрового изображения.
2. CreateHatchBrush(ByValnIndexAsLong, ByValcrColorAsLong) —создает штрихующую кисть. Например, создадим кисть с цветным орнаментом и заполнимим прямоугольник :Brush=CreateHatchBrush(hs_Cross, RGB(50,50,50)) OldBrush=SelectObject(MyDc, Brush)
CallRectangle(MyDc,50,50,500,400)’Рисуем прямоугольник
CallSelectObject(MyDc, OldBrush)CallDeleteObject(Brush)
3.CreateSolidBrush(ByValcrColorAsLong) –создает сплошную без орнамента кисть.
4.CreatePatternBrush(ByValhBitmapAsLong) –создает кисть, заполняющую область узором растрового изображения.
92.Пример работы с базовыми и штрихующими кистями.
Продемонстрировать работу с базовыми и штрихующими кистями.
PrivateSubCommand1_Click()
DimMyDCAsLong, OldBrushAsLong, BrushAsLongMyDC= Form1.hdcFori%= 0 To5CallSelectObject(MyDC, GetStockObject(i))CallRectangle(MyDC, 10 + 60 * i, 30, 60 + 60 * i, 80)NextFori = 0 To5’Рисуем заштрихованные прямоугольники
Brush= CreateHatchBrush(i, RGB(255, 0, 0))OldBrush= SelectObject(MyDC, Brush)CallRectangle(MyDC, 10 + 60 * i, 100, 60 + 60 * i, 150)CallSelectObject(MyDC, OldBrush)CallDeleteObject(Brush)NextCallReleaseDC(hwnd, MyDC)
End SubPrivate Sub Form_Load()Caption= "Пример использования базовых и штрихующих кистей" BackColor= &HFFFFFFEnd Sub
93.Создание логического пера функциями CreatePen, CreatePenIndirect.
Перо используется для вычерчивания прямых линий многогранников, окружностей, дуг и т. п. Перо характеризуется цветом линии, толщиной и стилем. По умолчанию используется перо черного цвета, толщинойв1 пиксель, и стиль PS_SOLID. В базовый набор инструментов входят три константы перьев: WHITE_PEN=6, BLACK_PEN=7 и NULL_PEN=8 (перо, которое не рисует). Любой из этих инструментов выбирается и устанавливается в контекст устройства функциями GetStockObjectиSelectObject. Логическое перо, имеющее собственный стиль, цвет и толщину, создается одной из следующих функций.
1. CreatePenIndirect(lpLogPenAsLOGPEN) AsLong-создает перо, определенное заданной структурой типа LOGPEN:
TypeLOGPENlopnStyleAsLong’ Стиль пера lopnWidthAsPOINTAPI ‘ Ширина пера lopnColorAsLong’ Цвет пераEndType В структуре POINTAPI y-координата не используется. Поле lopnStyle должно содержать одну из 6 констант стилей: PS_SOLID = 0 {сплошной}; PS_DASH = 1 {пунктир}; PS_DOT = 2 {точки}; PS_DASHDOT = 3 {точка-тире}; PS_DASHDOTDOT = 4 {точка-точка-тире}; PS_NULL = 5 {невидимые линии}; PS_INSIDEFRAME = =6. При этом следует отметить, что стили PS_DASH, PS_DOT, PS_DASHDOT, PS_DASHDOTDOT определены только при толщине пера, равной единице. Толщина пера задается целым числом.
CreatePen(ByValnPenStyleAsLong, ByValnWidthAsLong, ByValcrColorAsLong) –создает перо явным определением параметров.
94.Основные API-функции ядра для работы с пером.
В Visual Basic у объектов формы и Picture имеются методы, позволяющие рисовать. Однако они работают не так быстро, каких «двойники» из набора API-функций. Система Windows содержит много графических объектов и достаточное количество API-функций для рисования и заливки изображений. Рассмотрим некоторые из них, которые помогут повысить быстро действие приложений, создаваемых в VisualBasic. Перечислим некоторые полезные API-функции при работе с пером.
♦MoveToEx(ByValhdcAsLong, ByValx AsLong, ByValyAsLong, lpPointAsPOINTAPI) –перемещает перо без отображения в заданные x, y(координаты окна);
♦LineTo(ByValhdcAsLong, ByValx AsLong, ByValyAsLong) –перемещает перо с отображением линии от предыдущей координаты;
♦Rectangle(ByValhdcAsLong, ByValx1 AsLong, ByValy1 AsLong, ByValx2 AsLong, ByValy2 AsLong) –вычерчивает и заполняет текущей кистью прямоугольник с x1,y1 —координатами левого верхнего угла и x2,y2 правого нижнего угла.
♦Ellipse(ByValhdcAsLong, ByValx1 AsLong, ByValy1AsLong, ByValx2 AsLong, ByValy2 AsLong) –вычерчивает и заполняет текущей кистью эллипс, вписанный в прямоугольник с x1,y1 –координатами левого верхнего угла иx2,y2 правого нижнего угла.
♦RoundRect(ByValhdcAsLong, ByValx1 AsLong, ByValy1 AsLong, ByValx2 AsLong, ByValy2 AsLong, ByValx3 AsLong, ByValy3 AsLong) –вычерчивает и заполняет текущей кистью прямоугольник с оскругленными углами, которые определяются шириной x3 и высотой y3 вписанного эллипса. ♦Arc(ByValhdcAsLong, ByValx1 AsLong, ByValy1 AsLong, ByValx2 AsLong, ByValy2 AsLong, ByValx3 AsLong, ByValy3 AsLong, ByValx4 AsLong, ByValy4 AsLong) –вычерчивает дугу эллипса. x1,y1,x2,y2 –координаты описанного прямоугольника. x3,y3, x4,y4 –координаты начальной и конечной точки дуги, которые в общем случае могут располагаться и не на дуге эллипса, вписанной в прямоугольник. Вычерчивание осуществляется против часовой стрелки
♦Chord(ByValhdcAsLong, ByValx1 AsLong, ByValy1 AsLong, ByValx2 AsLong, ByValy2 AsLong, ByValx3 AsLong, ByValy3 AsLong, ByValx4 AsLong, ByValy4 AsLong)-вычерчивает и заполняет текущей кистью сегмент эллипса.
♦Pie(ByValhdcAsLong, ByValx1 AsLong, ByValy1AsLong, ByValX2 AsLong, ByValy2 AsLong, ByValx3 AsLong, ByValy3 AsLong, ByValx4 AsLong, ByValy4 AsLong)-вычерчивает и заполняет текущей кистью сектор эллипса.
♦FloodFill(ByValhdcAsLong, ByValx AsLong, ByValуAsLong, ByValcrColorAsLong)-заливает текущей кистью область, ограниченную цветом crColor. x, y —внутренняя точка области.
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.