В проекте Template ширина диалогового окна вычислялась, исходя из длины выводимой строки. Длину строки в пикселах можно приблизительно определить, запросив характеристики шрифта и умножив среднюю ширину символа на количество символов в строке, как это показано в листинге 19.2.
Атрибуты контекста устройства и текста
Листинг 19.2
TEXTMETRIC tm:
GetTextMetri es(hdc.&tm):
int Res -tm.tmAveCharWidth*strlen(Str);
Но следует учитывать, что символы пропорциональных шрифтов имеют различную ширину. Поскольку поле tm.tmAveCharWidth содержит значение средней ширины символа, то полученный результат будет неточным. Для получения точного значения можно обратиться к функции GetTextExtentPoint32(hdc. Str. st г 1 en (St г). &StrSi ze). Длина строки в пикселах будет записана в поле сх структуры StrSize. Существуют также функции для точного определения размеров каждого отдельного символа.
2#1 Создание и применение U регионов Типы регионов Для определения взаимного перекрытия окон, ограничения требующих обновления рисунка областей окна и других целей операционная система Windows создает объекты, которые называются регионами. Регион задает форму плоской области, которая может состоять из нескольких не связанных фигур. Прикладная программа может работать с регионом при помощи дескриптора, имеющего тип HRGN. API Windows предоставляет средства, позволяющие получить дескрипторы регионов, создаваемых системой, или формировать собственные регионы.
Применение регионов в прикладных программах открывает для разработчика ряд весьма заманчивых возможностей. Регионы можно использовать для манипулирования видимой частью изображаемых объектов. При помощи функций RectlnRegiorU), PtlnRegionO или PtlnVisibleO можно проверять, принадлежит ли региону участок прямоугольника или точка с заданными координатами.
Система предоставляет средства работы с регионами произвольной формы, но может идентифицировать прямоугольные регионы, что позволяет ей более эффективно выполнять проверку принадлежности точки такому региону и определять взаимное пересечение прямоугольных регионов. Регионы произвольной формы представляются в виде объединения множества прямоугольных полосок, поэтому работа с ними требует значительно большего процессорного времени.