Главная страница
Навигация по странице:

  • SelectObject

  • LOGPEN

  • CreatePenIndirect

  • Алгоритмизации


    Скачать 1.15 Mb.
    НазваниеАлгоритмизации
    Дата27.09.2022
    Размер1.15 Mb.
    Формат файлаdocx
    Имя файла12_100229_1_124427 (1).docx
    ТипДокументы
    #700459
    страница62 из 67
    1   ...   59   60   61   62   63   64   65   66   67

    Основныеинструментыграфическойподсистемы


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

    К основным инструментам относятся:

      • перо(Pen) отображение контурных примитивов («карандаш»);

      • кисть(Brush) заполнение внутренних областей примитивов;

      • шрифт(Font) отображение символов и строк;

      • битоваякарта(Bitmap) «готовые» растровые изображения.

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

    Приложение6

    ИнструментPen


    Для отображения контурных примитивов используется перо, выбранное в контексте, определяющее цвет, ширину и стиль линии, который может быть сплошным (solid), точечным (dotted) или пунктирным (dashed).

    По умолчанию устанавливается одно из трехстандартныхперьев, рисующих сплошные линии толщиной в единицу, выбранного цвета: BLACK-

    _PEN черное перо, WHITE_PEN белое перо и NULL_PEN пустое перо, которое ничего не рисует.

    Определив переменную, например, hPenтипа HPEN (описатель пера handletoapen): HPENhPen; получить описатель одного из стандартных перьев, например белого пера, можно, вызывая функцию

    hPen = GetStockObject(WHITE_PEN);

    сделаем это перо текущим, вызвав функцию

    SelectObject(hdc, hPen);

    После этого все линии будут использовать белое перо до тех пор, пока не выберем другое перо в контекст устройства или пока не освободим контекст устройства.

    Все вышесказанное можно совместить в одной инструкции: hPen = SelectObject(hdc, GetStockObject(WHITE_PEN));

    Если это первый вызов, функция SelectObject возвращает описатель того пера, которое уже было выбрано в контексте устройства; текущим пером становится белое, а переменная hPenполучает описатель предыдущего (по умолчанию черного) пера, вернуться к которому можно, используя вызов

    SelectObject (hdc, hPen);

    Для созданияпераиспользуются функции CreatePenили CreatePen- Indirect (ExtCreatePen).

    ФункцияCreatePen:

    hPen = CreatePen(iPenStyle, iWidth, rgbColor);

    параметр iPenStyle определяет стиль линии и может принимать одно из семи значений (семь стилей пера): PS_SOLID– сплошное, PS_DASH, PS_DOT, PS_DASHDOT, PS_DASHDOTDOT – штриховое, пунктирное и штрихпунктирное, PS_NULL нерисующее (пустое) перо, PS_INSIDEFRAME

    • внутренняя обводка, в замкнутом контуре автоматически отступает внутрь в соответствии с толщиной линии.

    Для стилей PS_SOLID, PS_NULLи PS_INSIDEFRAMEпараметр iWidth

    задает ширину пера, при iWidth= 0 перо шириной в один пиксел.

    Параметр rgbColor– цвет пера; для перьев всех стилей, кроме PS_- INSIDEFRAME, преобразуется в ближайший чистый цвет, стильPS_INSIDE- FRAME позволяет использовать полутона при ширине больше 1.

    Можно создать перо, определив структуру LOGPENlogpen(«логи-

    ческое перо» logicalpen), содержащую поля:


    Приложение6

    lopnStyle(UINT) стиль пера;

    lopnWidth(POINT) ширина пера в логических единицах измерения;

    lopnColor(COLORREF) цвет пера.

    Затем создаем перо, передавая адрес структуры в функцию CreatePenIndirect: hPen = CreatePenIndirect(&logpen);

    Получить информацию об уже существующем пере можно, используя функцию

    GetObject(hPen, sizeof(LOGPEN), &logpen);

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

    Рассмотрим метод создания, выбора и удаления перьев. Предположим, в программе используются два пера – красное шириной 3 и черное точечное. Определим переменные для хранения описателей этих перьев:

    static HPEN hPen1, hPen2;

    В процессе обработки сообщения WM_CREATEсоздадим перья: hPen1 = CreatePen (PS_SOLID, 3, RGB (255, 0, 0));

    hPen2 = CreatePen (PS_DOT, 0, 0);

    В процессе обработки сообщения WM_PAINT или когда есть действительный контекст устройства, выберем одно из этих перьев в контекст устройства и можем рисовать, используя его:

    SelectObject (hdc, hPen2); [функции рисования линий]

    SelectObject (hdc, hPen1);

    [другие функции рисования линий]

    В процессе обработки сообщенияWM_DESTROYудалить их: DeleteObject (hPen1);

    DeleteObject (hPen2);

    Можно создать перья в процессе обработки сообщения WM_PAINTи удалить их после вызоваEndPaint.

    Можно объединить вызовы функций CreatePenи SelectObjectв одну инструкцию:

    SelectObject (hdc, CreatePen (PS_DASH, 0, RGB (255, 0, 0)));

    Удалить перо можно, выбрав стандартное перо BLACK_PENв контекст устройства и удаления значения, возвращаемого функцией SelectObject:

    DeleteObject (SelectObject (hdc, GetStockObject (BLACK_PEN)));

    Приложение6

    Выбирая только что созданное перо в контекст устройства, сохраним описатель, возвращаемый функцией SelectObject:

    hPen = SelectObject (hdc, CreatePen (PS_DASH, 0, RGB (255, 0, 0)));

    Если это первый вызов, hPen– описатель стандартного черного пера, мы можем теперь выбрать его в контекст устройства и удалить созданное перо (описатель, возвращаемый вызовом функции SelectObject) в одной инструкции:

    DeleteObject (SelectObject (hdc, hPen));

    1   ...   59   60   61   62   63   64   65   66   67


    написать администратору сайта