Операции с графическими объектами
После того как приложение создаст контроллер домена дисплея или принтера, оно может начать рисование на связанном устройстве или, в случае с памятью dc, оно может начать рисование на растровом рисунке, хранящееся в памяти. Однако перед началом рисования, а иногда и в процессе рисования, часто необходимо заменить объекты по умолчанию новыми объектами.
Приложение может проверять атрибуты объекта по умолчанию, вызывая функции GetCurrentObject и GetObject . Функция GetCurrentObject возвращает дескриптор, определяющий текущее перо, кисть, палитру, растровое изображение или шрифт, а функция GetObject инициализирует структуру, содержащую атрибуты этого объекта.
Некоторые принтеры предоставляют постоянные ручки, кисти и шрифты, которые можно использовать для повышения скорости рисования в приложении. Для перечисления этих объектов можно использовать две функции: EnumObjects и EnumFontFamilies. Если приложение должно перечислять резидентные ручки или кисти, оно может вызвать функцию EnumObjects для проверки соответствующих атрибутов. Если приложение должно перечислять резидентные шрифты, оно может вызвать функцию EnumFontFamilies (которая также может перечислять шрифты GDI).
Когда приложение определяет, что объект по умолчанию требует замены, оно создает новый объект путем вызова одной из следующих функций создания.
Графический объект | Функция |
---|---|
Bitmap | CreateBitmap, CreateBitmapIndirect, CreateCompatibleBitmap, CreateDiscardableBitmap, CreateDIBitmap |
Brush | CreateBrushIndirect, CreateDIBPatternBrush, CreateDIBPatternBrushPt, CreateHatchBrush, CreatePatternBrush, CreateSolidBrush |
Цветовая палитра | CreatePalette |
Шрифт | CreateFont, CreateFontIndirect |
Перо | CreatePen, CreatePenIndirect, ExtCreatePen |
Регион | CreateEllipticRgn, CreateEllipticRgnIndirect, CreatePolygonRgn, CreatePolygonRgn, CreateRectRgn, CreateRectRgnIndirect, CreateRoundRectRgnRgn |
Каждая из этих функций возвращает дескриптор, определяющий новый объект. После получения дескриптора приложение должно вызвать функцию SelectObject , чтобы заменить объект по умолчанию. Однако приложение должно сохранить дескриптор, определяющий объект по умолчанию, и использовать этот дескриптор для замены нового объекта, когда он больше не нужен. Когда приложение завершает рисование с новым объектом, оно должно восстановить объект по умолчанию, вызвав функцию SelectObject , а затем удалить новый объект, вызвав функцию DeleteObject . Сбой удаления объектов приводит к серьезным проблемам с производительностью.