Графические объекты

Ниже описываются инкапсуляция в ObjectWindows 2.0 GDI Windows. ObjectWindows облегчает использование графических объектов и функций GDI.

Некоторые приложения, такие как графические приложения и задачи обработки изображений, требуют использования графики. Эта графика может быть в форме линий, форм, текста или побитовых (растровых) отображений. Для предоставления приложениям функциональных возможностей работы с графикой Windows имеет набор функций, называемых интерфейсом с графическими устройствами (GDI). GDI может рассматриваться как графический пакет, который используют приложения Windows для представления и манипуляций с графикой. Функции GDI дают вашему приложению возможности рисования, не зависящие от используемого устройства представления. Например, вы можете использовать одни и те же функции GDI для написания программ для дисплеев EGA и VGA или для принтера PostScript. Независимость от устройств достигается с помощью использования драйверов устройств, переводящих вызовы функций GDI в команды, понятные использующемуся устройству вывода.

Организация класса GDI

Большинство классов, инкапсулирующих функциональные возможности GDI, являются производными от класса TGdiObject. Это абстрактный класс для объектов GDI ObjectWindows. Он обеспечивает базовый деструктор, операцию преобразования HGDIOBJ и базовую функцию GetObject.

Другими классами GDI ObjectWindows являются классы:

Многие из функций классов GDI ObjectWindows могут показаться вам знакомыми, но это не совсем так. Поскольку классы GDI ObjectWindows дублируют функции многих объектов Windows, то существующая терминология сохранилась. Однако в функции внесены некоторые улучшения.

Работа с контекстами устройств

При работе с GDI Windows для доступа ко всем устройства, от окон до принтеров и графопостроителей, следует использовать контекст устройства (DC) - поддерживаемую GDI структуру, которая содержит важную информацию об устройстве (основной и фоновый цвет, шрифт, палитру и др.). ObjectWindows 2.0 инкапсулирует информацию контекста устройства в нескольких классах контекста. Для всех этих классов базовым классом является TDC. TDC содержит большую часть необходимых для работы с контекстом устройства функций.

Класс TDC

Хотя специализированные классы контекстов устройств обеспечивают дополнительные функциональные возможности, ориентированные на конкретную специфику класса, TDC содержит большую часть необходимых функций.

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

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

~TDC уничтожает объекты и восстанавливает в контексте устройства все объекты по умолчанию. TDC предусматривает также два защищенных конструктора, используемых только в производных классах.

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

Вы можете сохранить и восстановить контекст устройства аналогично тому, как используются функции SaveDC и RestoreDC. Вы можете также переустановить контекст устройства с помощью функции ResetDC. Единственный параметр ResetDC - это ссылка на структуру DEVMODE.

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

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

Функция SelectObject используется для включения объекта GDI в контекст устройства. Эта функция имеет 4 версии с различными параметрами. Используемая версия зависит от типа выбираемого объекта. Функция TMemoryDC позволяет выбрать битовый массив.

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

С помощью функции SelectStockObject можно выбрать стандартный объект. Эта функция имеет один параметр, эквивалентный параметру, используемому при вызове функции API GetStockObject. По существу эта функция эквивалентна двум вызовам: GetStockObject (для получения стандартного объекта) и SelectObject (для включения стандартного объекта в контекст устройства).

TDC предусматривает функции для восстановления в контексте устройства исходных объектов. Это RestoreBrush, RestorePen, RestoreFont и RestorePalette. RestoreTextBrush можно использовать только для 32-разрядных приложений. Все эти функции вызываются функцией RestoreObjects.

GetBrushOrg имеет один параметр - ссылку на объект TPoint. Она помещает в него координаты начала кисти. Функция SetBrushOrg имеет еще один параметр - TPoint*. Эта функция устанавливает начала кисти контекста устройства в значения x и y первого объекта TPoint. Второй параметр по умолчанию равен 0. Если вы передаете указатель на TPoint, TDC::SetBrushOrg помещает в x и y объекта старые значения кисти.

TDC обеспечивает функции для работы в контексте устройства с палитрами и цветами: GetNearestColor, GetSystemPaletteEntries, GetSystemPaletteUs, RealizePalette, SetSystemPaletteUse и UpdateColors.

Для установки режима рисования в контексте устройства используются функции атрибута рисования. Все эти функции аналогичны функциям API с теми же именами, но в каждой из них может быть опущен параметр HDC: GetBkColor, GetBkMode, GetPolyFillMode, GetROP2, GetStretchBltMode, GetTextColor, SetBkColor, SetBkMode, SetPolyFillMode, SetROP2, SetStretchBltMode и SetTextColor. Функция SetMiterLimit доступна только в 32-разрядных приложений.

Для установки области просмотра и режимов отображения окна используйте следующие функции: GetMapMode, GetViewportExt, GetVieportOrg, GetWindowExt, GetWindowOrg, OffsetViewportOrg, GetViewportExt, OffsetWindowOrg, ScaleViewportExt, ScaleWindowExt, SetWindowExt, SetMapMode, SetViewportExt, SetViewportOrg, SetWindowExt и SetWindowOrg. Для 32-разрядных приложений доступны также функции ModifyWorldTransform и SetWorldTransform.

Функции координат преобразуют логические координаты в физические и наоборот. Это функции DPtoLP и LPtoDP. Для задания и считывания простых и сложных областей в области отсечения контекста устройства используются функции ExcludeClipRect, ExcludeUpdateRgn, GetBoundsRect, GetClipRgn, IntersectClipRect, OffsetClipRgn, PtVisible, RectVisible, SelectClipRgn и SetBoundsRect.

Для доступа к метафайлам служат функции EnumMetaFile, PlayMetaFile, PlayMetaFileRecord. Для перемещения в текущую точку используются три версии функции MoveTo (эта функция перемещает перо в точку с заданными координатами).

В параметре функции GetCurrentPosition задается ссылка на объект TPoint. Она помещает координаты текущей позиции в объект TPoint.

Для доступа к шрифтам и работы с ними используйте функции TDC для работы со шрифтами: EnumFontFamilies, EnumFonts, GetAspectRatioFilter, GetCharABCWidth, GetCharWidth, GetFontData и SetMapperFlags.

Функции работы с маршрутом доступны только для 32-разрядных приложений. За исключением того, что эти функции не требуют параметра HDC, эти функции совпадают с соответствующими функциями Win32: BeginPath, CloseFigure, EndPath, FillPath, FlattenPath, PathToRegion, SelectClipPath, StrokedAndFillPath, StrokePath и WidenPath.

TDC дает вам большое разнообразие функций вывода для различного вида объектов, которые может обрабатывать стандартный контекст устройства, включая пиктограммы, прямоугольники, области, формы, битовые массивы и текст. Почти все эти функции имеют несколько версий, одна из которых почти идентична соответствующей функции API (за исключением отсутствия параметра HDC), а альтернативные версии, использующие TPoint, TRect, TRegion и другие данные инкапсулируемые ObjectWindows данные делают вызовы более понятными.

Объектные элементы данных и функции

Эти элементы данных и функции используются для управления контекстом устройства самого объекта. Они являются защищенными (protected) и могут использоваться только в производных от TDC классах.

Элемент данных Описание
ShouldDelete Указывает, должен ли объект удалять свой описатель контекста устройства при вызове деструктора.
Handle Содержит фактический описатель контекста устройства.
OrgBrush, OrgPen, OrgFont, OrgPalette Описатели исходных объектов при создании контекста устройства. В 32-разрядных приложениях присутствует также OrgTextBrush.
CheckValid Генерирует исключительную ситуацию при недопустимости контекста устройства.
Init Устанавливает OrgBrush, OrgPen, OrgFont, и OrgPalette при создании объекта. Если вы создаете производный от TDC класс без явного вызова конструктора TDC, то в своем конструкторе вам следует сначала вызвать конструктор TDC::Init.
GetHDC Используя Handle возвращает HDC.
GetAttribute Используя Handle возвращает HDC. Если создаете объект с несколькими контекстами устройства, то следует переопределить эту функцию для обеспечения нужного возвращаемого значения. Эта функция использует недокументированную функцию API Windows FastWindowFrame или PatBlt.

Класс TPen

Класс TPen инкапсулирует логическое перо. Он содержит цвет чернил пера (инкапсулированный в объекте TColor), ширину пера и его стиль.

Вы можете построить объект TPen непосредственно, задавая цвет, ширину и стиль пера, или косвенно, задавая TPen& или указатель на структуру LOGPEN. При непосредственном построении задается объект TPen c заданными атрибутами. Параметр стиля может иметь значения PS_SOLID, PS_DOT, PS_DASHDOT, PS_DASHDOTDOT, PS_NULL или PS_INSIDEFRAME.

При косвенном создании пера новый объект также создается, но атрибуты копируются из указанного объекта. Вы можете создать объект TPen из существующего описания TPen.

Доступ к объекту TPen можно получить через структуру HPEN или LOGPEN. Для получения HPEN из объекта TPen, используйте операцию HPEN, передав объект TPen в качестве параметра. Явно операция HPEN почти никогда не вызывается.

Класс TBrush

Класс TBrush инкапсулирует логическую кисть. Он содержит цвет кисти (инкапсулированный в объекте TColor), ширину кисти, а также стиль кисти, шаблон или битовый массив.

Построить объект кисти можно непосредственно, задав цвет, ширину и стиль кисти, или косвенно, через TBrush& или указатель на структуру LOGBRUSH.

При косвенном создании кисти новый объект также создается, но атрибуты копируются из указанного объекта. Вы можете создать объект TBrush из существующего описателя HBRUSH.

Обращаться к TBrush можно через HBRUSH или логическую структуру LOGBRUSH. Для получения HBRUSH из объекта TBrush используйте операцию HBRUSH с объектом TBrush в качестве параметра. Явно операция HBRUSH почти никогда не вызывается.

Для преобразования TBrush в структуру LOGBRUSH используйте функцию GetObject. Чтобы сбросить начальную точку объекта кисти, используйте функцию UnrealizxeObject.

Класс TFont

Класс TFont позволяет вам создать и использовать в своих приложениях шрифты Windows. Класс TFont инкапсулирует все атрибуты логического шрифта.

Построить объект TFont можно непосредственно, задав атрибуты шрифта, или косвенно, задав TFont& или указатель на структуру LOGFONT. При непосредственном построении шрифта создается новый объект с заданными атрибутами.

При косвенном создании шрифта новый объект также создается, но атрибуты копируются из указанного объекта. Вы можете создать объект TFont и из существующего описателя HFONT.

Обращаться к объекту TFont можно через HFONT или логическую структуру LOGFONT. Для получения HFONT из объекта TFont используйте операцию HFONT с объектом TFont в качестве параметра. Операция HFONT явно почти никогда не вызывается.

Класс Palette

Класс Palette инкапсулирует палитру цветов Windows, которая может использоваться с битовыми массивами и DIB. TPalette позволяет вам нестроить таблицу цветов, привести в соответствие отдельные цвета, поместить палитру в буфер обмена Clipboard и т.д.

Построить объект TPalette можно непосредственно, задав атрибуты палитры, или косвенно, задав TPalette& или указатель на структуру LOGPALETTE. При непосредственном построении палитры создается новый объект с заданными атрибутами.

При косвенном создании палитры новый объект также создается, но атрибуты копируются из указанного объекта. Вы можете создать объект TPalette и из существующего описателя HPALETTE.

Обращаться к объекту TPalette можно через HPALETTE или логическую структуру LOGPALETTE. Для получения HPALETTE из объекта TPalette используйте операцию HPALETTE с объектом TPalette в качестве параметра. Операция HPALETTE явно почти никогда не вызывается.

Функция GetObject для TPalette функционирует аналогично соответствующей функции API Windows. TPalette инкапсулирует также стандартные функции API для работы с палитрами. Функция GetNearestPaletteIndex приводит цвет в соответствие с записью палитры. Эта функция имеет единственный параметр (объект TColot) и возвращает индексный номер ближайшего цвета палитры. Функция GetNumEntries не имеет параметров и возвращает число записей в таблице цветов палитры.

Получить значения из диапазона записей таблицы цветов можно с помощью функции GetPaletteEntries. Эта функция работает аналогично соответствующей функции API Windows. С помощью функции SetPaletteEntries вы можете задать значения в диапазоне записей таблицы цветов. Для изменения размера палитры используется функция ResizePalette, в параметре которой задается размер новой палитры. SetPalette устанавливает указанную индексом запись палитры соответственно значению объекту PALETTEENTRY. Эта функция работает аналогично функции API Windows ResizePalette.

Функция AnimatePalette позволяет вам заменить записи в таблице цветов палитры. В третьем параметре этой функции задается указатель на массив объектов PALETTEENTRY. Записи, указанные двумя первыми объектами, занимаются значениями из массива.

Для своих объектов палитры вы можете использовать функцию UnrealizePalette, которая приводит палитру в соответствие с текущей системной палитрой. Эта функция не имеет параметров и ведет себя как соответствующая функция API Windows.

Функция ToClipboard позволяет поместить палитру в буфер обмена. В качестве параметра этой функции задается ссылка на объект TClipboard. Так как эта функция фактически удаляет объект из приложения, для создания временного объекта следует использовать конструктор TPalette.

Две функции Create TPalette вызываются из конструкторов TPalette. Второй параметр Create эквивалентен элементу peFlags структуры PALETTEENTRY. Функции Create создают LOGPALETE с помощью таблицы цветов из передаваемого во втором параметре битового массива. Вы можете использовать Create для создания 2- 16- или 256-цветных битовых массивов.

Класс TBitmap

Класс TBitmap инкапсулирует независимый от устройства битовый массив Windows. Он предусматривает различные конструкторы и функции-элементы для работы с битовым массивом.

Построить битовый массив можно непосредственно или косвенным путем. Используя косвенное построение, вы можете задать существующий объект битового массива, указатель на структуру BITMAP, метафайл, контекст устройства TDC и др.

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

TBitmap предусматривает два конструктора, которые вы можете использовать для создания битового массива, совместимого с данным контекстом устройства. Первый конструктор создает битовый массив заданного размера (высоты и ширины). Третий параметр позволяет сделать битовый массив выгружаемым. Второй конструктор создает битовый массив с заданной высотой и шириной, совместимый с контекстом устройства из DIB.

Вы можете создавать битовые массивы из буфера обмена Windows, метафайла или объекта DIB. Чтобы создать битовый массив из буфера обмена, нужно только передать конструктору ссылку на объект Clipboard. Конструктор получает описатель битового массива в буфере обмена и строит по этому описателю объект битового массива. Чтобы создать объект из метафайла, нужно передать TMetaFilePict&, TPalette& и TSize&. Конструктор на основе палитры инициализирует совместимый с устройством битовый массив. Чтобы создать битовый массив из битового массива, независимого от устройства, нужно передать конструктору TDib&. Можно также задать палитру. Можно создать битовый массив, и загрузив его из модуля. При этом конструктору передается HINSTANCE модуля, содержащего битовый массив, и идентификатор ресурса битового массива. Можно также создать новый объект битового массива из существующего описателя HBITMAP.

Вы можете получить доступ к TBitmap через HBITMAP или структуру BITMAP. Чтобы получить HBITMAP из объекта TBitmap, используйте операцию HBITMAP с объектом TBitmap в качестве параметра. Операция HBITMAP почти никогда явно не вызывается. Для преобразования объекта TBitmap в структуру BITMAP используется функция GetObject (фактические биты массива можно получить с помощью функции GetBitmapBits).

TBitmap инкапсулирует ряд стандартных вызовов API для работы с палитрами. С помощью функций Width() и Height() вы можете получить ту же информацию, что и с помощью GetObject. Каждая функция возвращает характеристики объекта битового массива.

Функции GetBitmapDimension и SetBitmapDimension позволяют вам найти и изменить размеры битового массива. GetBitmapDimension имеет единственный параметр - ссылку на объект TSize и помещает в объект TSize размер битового массива. SetBitmapDimension имеет два параметра: ссылку на объект TSize, содержащий новый размер битового массива, и указатель на объект TSize, куда функция помещает старый размер.

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

Функции GetBitmap и SetBitmap позволяют вам изменить и опросить биты битового массива. Эти функции имеют по два параметра: размер массива в байтах и указатель на битовый массив. SetBitmapBits копирует массив в битовый массив (копируется заданное в параметре число байт). GetBitmap заполняет массив битами из битового массива.

Поместить массив в буфер обмена можно с помощью функции ToClipboard. Так как эта функция фактически удаляет объект из приложения, вам следует для создания временного объекта использовать конструктор TBitmap.

Tbitmap имеет две функции Create. В параметре первой функции указывается ссылка на объект TBitmap. По существу эта функция копирует переданный объект TBitmap. Во второй функции Create указываются ссылки на объект TDib и объект TPalette. Create создает контекст устройства, совместимый с TPalette.

Класс TRegion

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

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

TRegion предусматривает используемый по умолчанию конструктор, который создает пустую прямоугольную область. Для инициализации объекта TRegion вы можете использовать функцию SetRectRgn. Для прямого создания TRegion можно использовать несколько источников. Для создания прямоугольной области используется конструктор, в качестве параметров которого задаются логические координаты объекта TRect. Конструктор, создающий прямоугольную область с закругленными краями, имеет также параметр TSize, определяющий высоту и ширину эллипса закруглений. Конструктор эллиптической области имеет параметр TEllipse. Для создания нерегулярной многоугольной области конструктору передается массив точек TPoints (координат вершин многоугольника).

Вы можете получить доступ или модифицировать объекты TRegion непосредственно через описатель HRGN или через ряд функций-элементов и операций. Для получения HRGN из объекта TRegion используйте операцию HRGN.

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

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

TRegion имеет также ряд операций, которые можно использовать для опроса и модификации значений области. Многие из них позволяют вам выполнять сложение и вычитание прямоугольных областей и других элементов с указанной областью. Булевские операции == и != используются для проверки - сравнения двух областей. Изменит область можно с помощью операций присваивания. Например, операция = позволяет присвоить одну область другой, += позволяет сдвинуть область на смещение, заданное в объекте TSize (область сохраняет при этом все свои свойства), операций -= выполняет обратное действие - вычитает смещение из каждой точки области (при использовании с объектом TSize).

Операция &= может выполняться с объектами TRegion и TRect (перед выполнением операции TRect конвертируется в TRegion с помощью конструктора) и задает пересечение областей (это логическая операция И). Операция |= может выполняться с объектами TRegion и TRect (перед выполнением операции TRect конвертируется в TRegion) и задает объединение областей (это логическая операция ИЛИ). Операция ^= может выполняться с объектами TRegion и TRect (перед выполнением операции TRect конвертируется в TRegion) и позволяет получить ту область, которая не является объединением областей (это логическая операция исключающего ИЛИ).

Класс TIcon

Класс TIcon инкапсулирует описатель пиктограммы и конструкторы для инициализации объекта TIcon. Вы можете использовать класс TIcon для построения пиктограммы из ресурса или на основе явной информации.

Построить пиктограмму можно несколькими способами: из существующего объекта TIcon, из ресурса в текущем приложении, из ресурса в другом модуле или на основе заданного размера и явной информации. Для 32-разрядных приложений можно также использовать два специальных конструктора, один из которых имеет два параметра (указатель на массив буферов, содержащих биты данных пиктограммы, и размера - числа бит в буфере), а другой - один параметр (структуру ICONINFO). ~TIcon удаляет пиктограмму и освобождает занимаемую ей память.

Обращаться к TIcon можно через HICON. Чтобы получить HICON из объекта TIcon, используйте операцию HICON. В 32-разрядных приложениях доступна также функция TIcon GetIconInfo с единственным параметром - указателем на структуру ICONINFO. Она заполняет структуру ICONINFO и возвращает True в случае успешного выполнения.

Класс TCursor

Этот класс инкапсулирует описатель курсора и конструктор для создания экземпляра объекта TCursor. Вы можете использовать класс TCursor для построения курсора из ресурса или явной информации.

Построить курсор можно несколькими способами: из существующего объекта TCursor, из ресурса в текущем приложении, из ресурса в другом приложении или на основе заданного размера и явной информации. Для 32-разрядных приложений можно также использовать два специальных конструктора, один из которых имеет два параметра (указатель на массив буферов, содержащих биты данных курсора, и размера - числа бит в буфере), а другой - один параметр (структуру ICONINFO). ~TCursor удаляет пиктограмму и освобождает занимаемую ей память.

Обращаться к TCursor можно через HCURSOR. Чтобы получить HCURSOR из объекта TCursor, используйте операцию HCURSOR. В 32-разрядных приложениях доступна также функция TIcon GetIconInfo с единственным параметром - указателем на структуру ICONINFO. Она заполняет структуру ICONINFO и возвращает True в случае успешного выполнения.

Класс TDib

Независимый от устройства битовый массив DIB не имеет описателя GDI как обычный битовый массив, хотя имеет глобальный описатель. Это просто структура, содержащая информацию о палитре и набор бит (элементов изображения). Класс TDib дает удобный способ работы с DIB, аналогичный методам работы с другим объектами GDI. Память для DIB выделяется одним фрагментом (с помощью функции Windows GlobalAlloc), так что ее можно передать в буфер обмена, OLE-серверу или клиенту.

Построить объект TDib вы можете прямо или косвенно. При непосредственном построении вы можете задать высоту, ширину битового массива и т.д. При косвенном построении вы можете задать существующий объект битового массива, указатель на структуру BITMAP, метафайл, контекст устройства TDC, буфера обмена и т.д.

Если ShouldDelete возвращает True, ~TDib освобождает ресурс и используемую глобальную память.

Для доступа к инкапсулированному DIB TDib предусматривает различные функции-элементы. Функции преобразования типов в TDib позволяют вам обращаться к TDib наиболее удобным для конкретной операции способом. Для доступа к TDib через HANDLE можно использовать операцию преобразования HANDLE. Вы можете также преобразовать объект TDib в три других типа битовых массивов. Для этого используются операции BITMAPINFO, BITMAPINFOHEADER и TRgbQuad.

Для доступа к внутренним структурам DIB используются специальные функции с такими же именами BITMAPINFO, BITMAPINFOHEADER и TRgbQuad. Функция GetIndices возвращает указатель на массив, содержащий биты фактического образа DIB.

Поместить объект DIB в буфер обмена Clipboard можно с помощью функции ToClipboard, в качестве единственного параметра которой задается ссылка на объект TClipboard. Так как эта функция фактически удаляет объект из приложения, нужно использовать конструктор TDib для создания временного объекта.

Класс TDib предусматривает ряд функций доступа, которые можно использовать для опроса объекта TDib и получения информации о содержащемся в объекте DIB.

Чтобы определить допустимость объекта, вызовите функцию IsOK, которая не имеет параметров и возвращает True в случае допустимости объекта. Функция IsPM также не имеет параметров и возвращает True, если DIB имеет представление, совместимое с Presentation Manager. Функции Width и Height возвращают ширину и высоту битового массива в элементах изображения. Функция Size возвращает ту же информацию в объекте TSize. Функция NumColor возвращает число используемых в битовом массиве цветов. StartScan предусмотрена для совместимости со старыми программами и всегда возвращает 0. NumScan также обеспечивает совместимость и возвращает высоту DIB в элементах изображения. Функция Usage указывает, в каком режиме находится DIB (DIB_RGB_COLORS или DIB_PAL_COLORS). Функция WriteFile записывает объект DIB на диск.

Работа с палитрой в режиме RGB

DIB может включать в себя цветовые значения двумя способами. В режиме палитры цветовая таблицы DIB. Сами значения цветов не указывают конкретного цвета. Эти являются индексами соответствующей записи текущей палитры. В режиме RGB каждая запись в таблице цветов DIB представляет фактическое значение цвета RGB. Переключиться из RGB на режим палитры и обратно можно с помощью функций ChangeModeToPal и ChangeModeToRGB.

Когда вы переключаетесь в режим палитры с помощью ChangeModeToPal, в качестве палитры DIB используется параметр TPalette&. Каждый используемый в DIB цвет отображается в палитру и преобразуется в индекс палитры. При переключении в режим RGB с помощью ChangeModeToRGB параметр TPalette& используется для конвертирования индексов палитры в содержащиеся в палитре эквиваленты RGB.

Если вы работаете в режиме RGB, то можете использовать для доступа к палитре цветов DIB и ее изменения следующие функции:

Функция Назначение
GetColor Получает любую запись в палитре цветов DIB по индексу в таблице цветов. Возвращается объект TColor.
SetColor Изменяет запись в таблице цветов DIB. В параметрах указываются индекс в таблице цветов и новое значение.
FindColor Сравнивает объект TColor с записью в таблице цветов, используя функцию FindColor. В пара- метре задается объект TColor.
MapColor Заменяет цвет в существующей таблице цветов. Имеет 3 параметр: TColor, содержащий заменяемый цвет, TColor c новым цветом, и значение, указывающее, нужно ли заменить все вхождения.
GetIndex Позволяет получить индекс палитры любой для любой таблицы цветов. Параметр задает индекс в таблице цветов. Возвращается значение индекса палитры.
FindIndex Находит индекс палитры по записи таблицы цветов. Выполняет поиск по таблицам цветов DIB. пока не найдет заданное в параметре значение.
MapIndex Заменяет цвет на цвет, уже существующий в таблице цветов DIB. В параметрах задаются индекс для замены, новый индекс палитры, помещаемый в таблицу цветов, и значение, определяющее, нужно ли заменить все вхождения.

Соответствие цветов интерфейса системным цветам

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

Флаг Замена Заменяется на
TDib::MapText TColor::Black COLOR_BTNTEXT
TDib::MapFace TColor::LtGray COLOR_BTNFACE
TDib::MapFace TColor::Gray COLOR_BTNSHADOW
TDib::MapFace TColor::White COLOR_BTNHIGHLIGHT
TDib::MapFrame TColor::LtMagenta COLOR_WINDOWFRAME

Второй параметр, если он задается, приводит к замене TColor::LtYellow на bkColor. Так как эта функция ищет и заменяет записи таблицы TColor, ее полезно использовать с DIB только в режиме RGB. Поскольку она заменяет отдельные цвета, вы должны проектировать свой интерфейс с использованием стандартный цветовой схемы.

Расширение TDib

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

Элемент данных Описание
Info Указатель на структуру BITMAPINFO или BIT- MAPCOREINFO, содержащую атрибуты, таблицу цветов и другую информацию о DIB.
Bits Указатель на область памяти с фактическими графическими данными для DIB.
NumClrs Содержит фактическое число используемых в DIB цветов (не возможных, а фактически используемых).
W Ширина DIB в элементах изображения.
H Высота DIB в элементах изображения.
Mode Режим DIB (RGB или палитра).
IsCore Имеет значение True, если Info указывает на структуру BITMAPCOREINFO.
IsResHandle Указывает, был ли DIB загружен из ресурса, и, следовательно, является ли Handle описателем ресурса.

Функция InfoFromHandle позволяет заполнить структуру Info. Она выделяет информацию из Handle и заполняет атрибуты в структуре Info. Эта функция не имеет параметров и не возвращает значения.

Функция Read считывает из файла, указываемого объектом TFile, DIB, совместимые с Windows 3.0 или Presentation Manager. При загрузке Read проверяет заголовок DIB, атрибуты, палитры и битовый массив. Совместимые с Presentation Manager DIB сразу преобразуются в DIB Windows. При удачном чтении возвращается True.

Чтобы загрузить DIB из приложения или модуля DLL, вы можете использовать функцию LoadResource. Эта функция имеет два параметра, первый из которых - это HINSTANCE приложения или модуля DLL, из которого вы загружаете DIB, а TResId указывает конкретный ресурс в модуле, который вы хотите загрузить. Для загрузки DIB из файла можно использовать функцию LoadFile с единственным параметром - строкой имени файла.

Объекты проверки допустимости

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

Стандартные объекты проверки допустимости

Стандартные классы проверки допустимости ObjectWindows автоматизируют проверку данных. ObjectWindows определяет в validate.h 6 классов проверки допустимости:

Класс Назначение
TValidator Базовый класс, из которого создаются все другие производные классы.
TFilterValidator Класс фильтра проверки допустимости.
TRangeValidator Класс проверки допустимости по целочисленному диапазону.
TLookupValidator Класс проверки по таблице.
TStringLookupValidator Класс проверки допустимости строки.
TPXPictureValidator Класс проверки допустимости по шаблону.

Базовый класс TValidator

Абстрактный класс TValidator - это базовый класс, из которого получаются все объекты проверки допустимости. Все его функции-элементы всегда возвращают значения True, а Error не выполняет никаких действий. Чтобы определять, какие значения являются допустимыми, производные классы должны переопределять функции IsValid, IsValidInput и Error.

Класс фильтрации ввода

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

Объект фильтра проверки допустимости ObjectWindows представляет общий механизм, ограничивающий вид символов, которые пользователь может вводить в данном управляющем элементе редактирования. TFilterValidator - это простой механизм проверки допустимости, проверяющий данные по мере ввода их пользователем. Его конструктор имеет только один параметр - набор допустимых символов.

TFilterValidator переопределяет IsValidInput таким образом, чтобы она возвращала True, если все символы строки содержатся в наборе допустимых символов. Редактируемый управляющий элемент вставляет символы только в том случае, если IsValidInput возвращает True. Производные классы, такие как TRangeValidator, могут комбинировать фильтрацию ввода с другими видами проверки допустимости строки.

Класс проверки допустимости по диапазону

TRangeValidator - это класс проверки допустимости, производный от TFilterValidator. Он воспринимает только числа и добавляет к конечному результату проверку по диапазону. Этот конструктор имеет два параметра, определяющие минимальное и максимальное допустимые значения.

Механизм проверки допустимости по диапазону действует как механизм фильтрации, воспринимающий только цифры от 0 до 9, символы + и -. Таким образом, наследуемая TValidInput пропускает через фильтр только числа. IsValid в TRangeValidator возвращает True только в том случае, если введенное число является допустимым числом в заданном диапазоне. Если число лежит вне диапазона, функция-элемент Error возвращает сообщение об ошибке.

Класс проверки допустимости по таблице

Класс проверки допустимости по таблице TLookupValidator это абстрактный класс, который сравнивает введенное значение со списком значений. TLookupValidator вводит виртуальную функцию-элемент Lookup. По умолчанию Lookup возвращает True. Производные классы должны переопределять Lookup и сравнивать параметр со списком элементов, возвращая True в случае совпадения.

IsValid в TLookupValidator возвращает True только если возвращает True Lookup. В производных классах не следует переопределять IsValid. Вместо этого нужно переопределить Lookup. TStringLookupValidator - это экземпляр класса, основанный на TLookupValidator.

Класс проверки допустимости строки

TStringLookupValidator - это пример средства проверки допустимости по таблице. Он сравнивает переданную из редактируемого управляющего элемента строку с элементами в списке строк и возвращает True, если эта строка содержится в списке. Конструктор здесь имеет только один параметр - список допустимых строк TSortedStringArray. Чтобы после построения объекта проверки допустимости строки использовать другой список строк, воспользуйтесь функцией NewStringList, которая отменяет старый список и инсталлирует новый.

TStringLookupValidator переопределяет Lookup и Error. Lookup возвращает True, если переданная строка содержится в списке, а Error выводит окно сообщения, указывающее, что строки нет в списке.

Класс проверки допустимости по шаблону

При проверке допустимости по шаблону переданная пользователем строка сравнивается с шаблоном, описывающим допустимый формат ввода. Эти шаблоны совместимы с шаблонами, используемыми в реляционных базах данных Borland, в частности, в Paradox. При построении такого объекта проверки допустимости задаются два параметра: строка, содержащая образ шаблона, и булевское значение, указывающее, следует ли автоматически заполнять образ шаблона символами.

TPXPictureValidator переопределяет функции Error, IsValid и IsValidInput и добавляет новую функцию-элемент - Picture. Error выводит сообщение об ошибке, указывающее, каким должен быть формат строки. IsValid возвращает True только при возврате True функцией Picture. Таким образом, переопределив функцию-элемент Picture, вы можете создать новые виды проверки допустимости по шаблону. IsValidInput проверяет символы по мере ввода их пользователем, допуская только те символы, которые разрешены форматом ввода.

Использование средств проверки допустимости данных

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

Редактируемые управляющие элементы являются экземплярами класса TEdit. Так как объекты проверки допустимости не являются интерфейсными объектами, их конструкторы требуют только информацию, достаточную для задания критерия проверки допустимости. Каждый объект редактируемого управляющего элемента имеет элемент данных, указывающих на объект проверки допустимости. Полный пример, показывающий использование стандартных объектов проверки допустимости, вы можете найти в OWLAPI\VALIDATE.

Переопределение функций-элементов класса проверки допустимости

Хотя стандартные объекты проверки допустимости обычно удовлетворяют большинство требований по проверке данных, вы можете также модифицировать стандартные механизмы проверки допустимости и написать свои собственные объекты проверки допустимости. Если вы решили это сделать, то вам потребуются функции Valid, IsValid, IsValidInput и Error. Кроме понимания каждой из этих функций-элементов вы должны знать, как их используют редактируемые управляющие элементы и каким образом их можно при необходимости переопределить.

Функция Valid

Функция-элемент Valid вызывается соответствующим объектом редактируемого управляющего элемента для проверки допустимости вводимых данных. Аналогично функции CanClose для интерфейсных объектов Valid возвращает True только если переданная ей строка содержит допустимые данные.

При использовании объектов проверки допустимости с редактируемыми управляющими элементами переопределять или вызывать функцию Valid объекта проверки допустимости вам не нужно. Здесь достаточно наследуемой версии Valid. По умолчанию Valid возвращает True, если возвращает True функция-элемент IsValid. В противном случае она вызывает функцию Error для уведомления пользователя об ошибке и возвращает False.

Функция IsValid

Виртуальная функция-элемент IsValid вызывается функцией Valid, которая передает IsValid проверяемую строку текста. IsValid возвращает True, если строка представляет допустимые данные. IsValid выполняет фактическую проверку допустимости, так что при создании собственных объектов проверки допустимости вам потребуется переопределить эту функцию. Обратите внимание, что IsValid не вызывается непосредственно. Это делается через Valid, которая вызывает Error, если IsValid возвращает False. Это позволяет отделить проверку допустимости от сообщения об ошибке.

Функция IsValidInput

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

Функция Error

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

Хотя большинство производных объектов переопределяют Error, ее не следует вызывать непосредственно. Valid вызывает Error, если IsValid возвращает False.

Управляющие объекты Visual Basic

ObjectWindows позволяет вам использовать в приложениях Windows управляющие элементы, совместимые с управляющими элементами Visual Basic 1.0 (VBX). Использовать их также легко, как стандартные управляющие элементы Windows или ObjectWindows.

Управляющие элементы VBX представляют большой диапазон функциональных возможностей, не предусмотренных в стандартных управляющих элементах Windows.

Использование управляющих элементов VBX

Чтобы использовать в приложении ObjectWindows стандартные управляющие элементы VBX, нужно выполнить следующие шаги:

Классы управляющих элементов VBX

ObjectWindows предусматривает два класса, используемых при проектировании интерфейса для управляющих элементов VBX. Это классы TVbxControl и TVbxEventHandler.

Класс TVbxControl

TVbxControl обеспечивает для управляющего элемента фактический интерфейс и позволяет вам:

Класс TVbxControl является производным от класса TControl, который, в свою очередь, является производным от TWindow. Таким образом, TVbxControl действует во многом аналогичном другим основанным на TWindow управляющим элементам.

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

Управляющие элементы VBX можно строить явно или косвенно. Вы можете построить объект явным образом вызовом одного из конструкторов. Неявное его построение осуществляется когда вы не вызываете конструкторы и позволяете создавать экземпляр управляющего элемента родительскому объекту.

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

Неявное построение имеет место, когда вы проектируете интерфейсный элемент вне исходного кода приложения, например, с помощью Resource Workshop. Вы можете использовать Resource Workshop для добавления управляющих элементов VBX в диалоговые окна и другие интерфейсные элементы. Затем, при создании экземпляра родительского объекта дочерние элементы, такие как поля редактирования, блоки списка, командные кнопки и управляющие элементы VBX автоматически создаются вместе с родительским объектом.

Класс TVbxEventHadler

Класс TVbxEventHadler - это небольшой класс и в основном малоинтересный для программистов класс. Однако он выполняет важные действия. Без него вы не могли бы взаимодействовать с управляющими элементами VBX, поскольку он реализует программирование, управляемое событиями.

Этот класс состоит из единственной функции и таблицы реакции на одно сообщение. Функция называется EvVbxDispatch. Это подпрограмма обработки события для сообщения WM_VBXFIREEVENT. EvVbxDispatch получает сообщение WM_VBXFIREEVENT, преобразует необработанное сообщение в структуру WVBXEVENT и планирует новое сообщение, которое обрабатывается родительским объектом управляющего элемента. Это означает, что родительский объект снова вызывает себя с другим сообщением. Это новое сообщение намного легче обработать и понять.

Обработка сообщений управляющих элементов VBX

Обрабатывать сообщения управляющих элементов VBX нужно через родительский объект управляющего элемента. Чтобы родительский объект мог обрабатывать эти сообщения, он должен быть производным от класса TVbxEventHandler. Для этого вы можете смешать класс интерфейсного объекта, который хотите использовать для включения VBX (например, TDialog, TFrameWindow или классы, производные от интерфейсных классов ObjectWindows) с классом TVbxEventHandler.

Таблица реакции на сообщения

После создания нового производного класса вам нужно построить для него таблицу реакции. Таблица реакции для данного класса выглядит как обычная таблица реакции. Вам нужно обрабатывать в ней те же командные сообщения, как и обычно. Единственным добавлением является макрокоманда EV_VBXEVENTNAME для обработки нового класса сообщений от управляющих элементов VBX. Эта макрокоманда имеет три параметра:

Интерпретация события управляющего элемента

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

Чтобы понять эту структуру, нужно понимать, как работает управляющий элемент VBX. Первые 3 элемента достаточно просты и позволяют вам идентифицировать передающий событие управляющий элемент. Следующие 2 элемента также достаточно просты: каждое событие, которое может посылать управляющий элемент VBX, представляется здесь индексом события и его именем.

Следующие 2 элемента сохраняют события содержат параметры события. Эти параметры более сложны. Информацию по ним вы можете найти в руководстве по библиотеке управляющих элементов VBX.

Поиск информации о событии

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

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

Получить имя любого события в данном диапазоне вы можете с помощью функции-элемента TVbxControl GetEventName, которая имеет один параметр (индекс) и возвращает строку с именем события. Индекс события по его имени можно получить с помощью GetEventIndex.

Доступ к управляющему элементу VBX

Непосредственный доступ к управляющему элементу VBX вы можете получить двумя способами. Первый способ состоит в получении и установке имен характеристик управляющего элемента, которые позволяют управлять его внешним видом и поведением. Другой способ заключается в вызове методов управляющего элемента, которые аналогичны функциям-элементам класса, а обращаться к ним можно через функции в классе TVbxControl.

Характеристики управляющего элемента VBX

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

TVbxControl предусматривает ряд методов для получения информации о характеристиках. С помощью функции GetNumProps вы можете получить общее число характеристик.

Получить имя характеристики в данном диапазоне вы можете с помощью функции-элемента TVbxControl GetPropName, которая имеет один параметр (индекс) и возвращает строку с именем характеристики. Индекс характеристики по ее имени можно получить с помощью GetPropIndex.

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

Для получения характеристик управляющего элемента TVbxControl предусматривает функцию GetProp, которая позволяет получать характеристики, используя индекс или имя.

Устанавливать значение характеристики также можно по ее индексу или имени. Для этого в TVbxControl предусмотрена функция SetProp.

Методы управляющих элементов VBX

Методы управляющих элементов VBX - это функции, содержащиеся в каждом управляющим элементом VBX и вызывающие определенное действие. TVbxControl обеспечивает совместимость с методами Visual Basic 1.0 Move, Refresh, AddItem и Remove.

Функция Move помещает управляющий элемент в точку с заданными координатами и задает его размер в элементах изображения. Функция Refresh обновляет область вывода управляющего элемента. AddItem добавляет заданный элемент к списку управляющих элементов и дает ему указанный индекс. Функция RemoveIndex удаляет элемент с заданным индексом.

Назад | Содержание | Вперед

Copyright © CIT