Здавалка
Главная | Обратная связь

Функции рисования замкнутых фигур



Функции рисования замкнутых фигур строят закрашенные или незакрашенные фигуры, такие, как прямоугольники, эллипсы, многоугольники с прямыми и скругленными углами и т. д. Для закрашивания внутренней области замкнутых фигур используют кисть контекста отображения. Внешний контур фигуры обводят пером контекста отображения. Учитывают и остальные атрибуты отображения. В зависимости от стиля пера граница фигуры может находиться полностью внутри заданного внешнего контура или выходить за его пределы. Если выбрать стиль пера PS_NULL, контур станет невидимым.

Для рисования прямоугольника вызывают функцию Rectangle:

 

BOOL Rectangle( HDC hdc, int l, int t, int r, int b);

 

Параметры l, t, r и b определяют логические координаты соответственно левого, верхнего, правого и нижнего краев прямоугольника. В случае успешного выполнения функция возвращает ненулевое значение. Функция игнорирует текущую позицию.

Функция RoundRect рисует прямоугольник с закругленными углами:

 

BOOL RoundRect( HDC hdc, int l, int t, int r, int b, int w, int h);

 

Первые 5 параметров этой функции совпадают с параметрами функции Rectangle. А параметры w и h задают соответственно ширину и высоту эллипса, дуги которого закругляют углы прямоугольника. В случае успешного выполнения функция возвращает ненулевое значение. Функция игнорирует текущую позицию.

Функция FillRect закрашивает прямоугольную область окна заданной кистью:

 

int FillRect( HDC hdc, CONST RECT lprc, HBRUSH hbr);

 

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

 

FillRect( hdc, &rect, (HBRUSH)(COLOR_WINDOW+1));

 

Правая и нижняя границы прямоугольника не закрашиваются. В случае успешного выполнения функция возвращает ненулевое значение. Функция игнорирует текущую позицию.

Функция FrameRect рисует прямоугольную рамку:

 

int FrameRect( HDC hdc, CONST RECT lprc, HBRUSH hbr);

 

Параметры этой функции подобны параметрам функции FillRect. Функция FrameRect кистью hbr рисует рамку вокруг заданного прямоугольника. Ширина пера, используемого для рисования рамки, всегда равна одной логической единице. В случае успешного выполнения функция возвращает ненулевое значение. Функция игнорирует текущую позицию.

Функция InvertRect инвертирует значения цветов точек заданной прямоугольной области lprc:

 

BOOL InvertRect (HDC hdc, CONST RECT lprc);

 

В случае успешного выполнения функция возвращает ненулевое значение. Для восстановления цветов еще раз вызывают эту функцию.

Следующая функция пунктиром обозначает границы заданной прямоугольной области lprc:

 

BOOL DrawFocusRect( HDC hdc, CONST RECT lprc);

 

Пунктирные линии строятся с использованием растровой операции ИСКЛЮЧАЮЩЕЕ ИЛИ цветов точек, лежащих на границе прямоугольника. Вызывая эту функцию второй раз, можно удалить выделение прямоугольника. При прокрутке содержимого окна выделенная граница остается на месте. Для этой функции не нужно выбирать перо, рисующее пунктирную линию. Перед вызовом функции DrawFocusRect устанавливают режим отображения ММ_ТЕХТ.

Для рисования эллипса используют функцию Ellipse:

 

BOOL Ellipse( HDC hdc, int l, int t, int r, int b );

 

Параметры функции Ellipse идентичны первым пяти параметрам функции Arc. В случае успешного выполнения функция возвращает ненулевое значение. Функция игнорирует текущую позицию.

Сегмент эллипса рисуют при помощи функции Chord:

 

BOOL Chord( HDC hdc, int l, int t, int r, int b,

int x0, int y0, int x, int у);

 

Параметры этой функции аналогичны параметрам функции Arc.

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

Для рисования сектора эллипса используют функцию Pie:

 

BOOL Pie( HDC hdc, int l, int t, int r, int b,

int x0, int y0, int x, int у);

 

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

Функция Polygon рисует многоугольник:

 

BOOL Polygon(HDC hdc, CONST POINT lpPoints, int nCount);

 

Параметр lpPoints указывает на массив структур POINT, в котором находятся координаты вершин многоугольника. Параметр nCount равен размеру этого массива. В массиве каждая вершина должна быть указана только один раз. Функция Polygon автоматически соединяет первую и последнюю вершины многоугольника. В случае успешного выполнения функция возвращает ненулевое значение. Функция игнорирует текущую позицию.

Контрольные вопросы

1. Каковы особенности вывода в окно?

2. Из каких основных шагов состоит обработка сообщения WM_PAINT?

3. Какими способами выводят в окно при обработке любых сообщений?

4. Какие виды контекста отображения существуют и чем они отличаются?

5. Перечислите основные атрибуты рисования контекста отображения.

6. Из каких шагов состоит процедура выбора нового шрифта в контекст отображения и его удаление?

7. Какие функции используют при рисовании точек?

8. Какие функции рисования линий существуют?

9. Как закрашивают замкнутые фигуры?

Упражнения

1. От левого верхнего до нижнего правого угла рабочей области окна вывести текст таким образом, чтобы он полностью помещался в окне при любых изменениях размеров окна. Использовать шрифт Times New Roman Cyr.

2. В окне приложения многократно отобразить текст "Привет!!!" жирным шрифтом Arial Cyr. Вывод текста начинать от нижнего края окна и продолжать до верхнего края, плавно меняя цвет текста от желтого до черного и цвет фона от синего до желтого. При этом текст должен полностью помещаться по ширине при любых размерах окна.

3. В центре окна нарисовать эллиптическую диаграмму. Диаграмму разбить на секторы 25, 65 и 10 % красного, зеленого и голубого цветов и указать по центру дуги каждого сектора проценты. При всех изменениях размеров окна диаграмма должна быть отображена полностью.

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

5. В окне приложения отобразить рейтинг участников какого-либо события: для каждого участника нарисовать геометрическое тело (например, цилиндр), высота которого пропорциональна рейтингу участника, ниже фигуры вывести фамилию участника, выше – рейтинг (в %). Причем текст должен быть наклонен на некоторый угол. Для всех участников использовать разные цвета.

6. В окне приложения вывести текст "Анкета" на русском языке и строго под ним "Anketa" на английском языке, первую букву "А" увеличить в размере и сделать общей для обоих слов. Букву "А" вывести красным цветом, остаток слова на русском языке – синим, на английском – зеленым. При этом выводимый текст должен занимать всю высоту или ширину окна при любых размерах окна.

7. Текст заголовка окна отобразить красным цветом на фоне заголовка, а правее этого текста нарисовать синий эллипс, вписанный в зеленый прямоугольник шириной в 3 полосы заголовка.

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

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

10. В центре окна нарисовать мишень из 10 полей и в каждом поле вывести его значение (от 1 с краю до 10 в центре). При любых изменениях размеров окна мишень должна полностью отображаться в окне. Поля раскрасить случайно выбранными различными цветами.

11. В окне отобразить черным цветом оси координат (Оху) и синим цветом график функции c*cos(x), где х принимает значения от 0 до 10 тс и с*0. Размах вывода по осям ординат и абсцисс – 90 % размеров окна при любых изменениях размеров.

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

13. Описать функцию, которая в указанном прямоугольнике строит эллиптическую диаграмму. Количество секторов, их доля в процентах и цвета закрашивания также передаются аргументами вызова функции.

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

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

16. В рабочей части окна при движении мыши с нажатой левой клавишей рисовать траекторию движения курсора мыши. При нажатии правой клавиши мыши поменять цвет для рисования.

17. Рабочую область закрасить спектром цветов, начиная слева красным цветом и заканчивая, на правом краю, синим. Цвет изменять в 4 этапа: на первом этапе, при максимальном красном составляющем, увеличивать зеленую, на втором, при максимальном зеленом, уменьшать красную составляющую, затем, при максимальном зеленом, увеличивать синюю составляющую и, на последнем этапе, при максимальном синем уменьшать зеленую составляющую.

18. В окне отобразить клетки для игры в крестики-нолики. При нажатии левой клавиши мыши в клетке нарисовать крестик, а правой – нолик. Запретить заполнять клетку более одного раза. Рекомендация: если при перемещении курсора была нажата левая клавиша мыши, то параметр wParam содержит значение MK_LBUTTON.

19. Нарисовать светофор, в котором цвет "зажигается" при нажатии на эту лампу левой клавишей мыши. Одновременно может гореть только один цвет.

20. В окне с помощью мыши выделить прямоугольник и создать эффект мигания этого прямоугольника.

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

22. Нарисовать графики функций 2*a*Cos(kt)*exp(-nt) и 0.5*a*Sin(kt)*exp(-nt).

23. В рабочей области окна кистью по умолчанию в метрической системе координат нарисовать эллипс.

24. Создать окно с полосами просмотра и обеспечить просмотр всего содержимого таблицы.

25. Разработать функцию вывода текста в заданной позиции со специальным эффектом. Эффект заключается в том, что текст медленно "выплывает" слева направо. Используя эту функцию отобразить рейтинги участников некоторого события.

Приложение 3

Таблица 3.1. Список системных цветов в RGB-представлении

Красный цвет Зеленый цвет Голубой цвет Цвет в системной палитре
Черный
Темно-красный
Темно-зеленый
Темно-желтый
Темно-голубой
Темно-малиновый
Темно-синий
Светло-серый
Светло-зеленый
Светло-голубой
Кремовый
Светло-серый
Серый
Красный
Зеленый
Желтый
Синий
Малиновый
Голубой (циан)
Белый

Таблица 3.2. Список режимов рисования

Режимы рисования Цвет пикселя
R2_BLACK Черный
R2_COPYPEN Цвет пера
R2_MASKNOTPEN или R2_MERGENOTPEN Комбинация цвета пикселя до рисования и инверсии цвета пера
R2_MASKPEN или R2_MERGEPEN Комбинация цвета пикселя до рисования и цвета пера
R2_MASKPENNOT или R2_MERGEPENNOT Комбинация инверсии цвета пикселя до рисования и цвета пера
R2_NOP Остается неизменным
R2_NOT Инверсия цвета пикселя до рисования
R2_NOTCOPYPEN Инверсия цвета пера
R2_NOTMASKPEN или R2_NOTMERGEPEN Инверсия цвета пикселя до рисования
R2_NOTXORPEN Инверсия цвета R2_XORPEN
R2_WHITE Белый
R2_XORPEN Операция ИСКЛЮЧАЮЩЕЕ ИЛИ к цветам пикселя до рисования и пера

 

 







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.