- •Часть 2 (продолжение): Прикладное программирование в Windows
- •Глава 8. Виртуальное окно: работа с текстом
- •8.1. Оконные координаты, цвета, отображение строк
- •Кодировка rgb-значений
- •Размеры системных метрик
- •8.2. Виртуальное окно
- •Способы заполнения прямоугольной области
- •8.3. Изменение шрифтов
- •Макроимена распространенных шрифтов
- •8.4. Создание собственных шрифтов
- •Глава 9. Программирование графики
- •9.1. Логическая система координат
- •Рекомендуемый самый яркий состав цветов
- •9.2. Пиксели, линии, дуги, прямоугольники, эллипсы и секторы
- •9.3. Работа с перьями и кистями
- •Типы линий, создаваемых пером
- •9.4. Технология виртуального окна
- •9.5. Режимы отображения и области вывода
- •Текущий режим отображения (mappind mode)
- •Глава 10. Работа с панелями инструментов
- •10.1. Общие элементы управления
- •Общие элементы управления
- •10.2. Подключение и инициализация общих элементов управления
- •10.3. Работа с панелью инструментов
- •Начальные состояния кнопок панели инструментов
- •Стиль кнопки определяется (значения поля fsStyle)
- •Сообщения к панели инструментов
- •10.4. Создание растрового изображения для панели инструментов
- •10.5. Включение подсказок
- •Глава 11. Спины, ползунки и индикаторы процессов
- •11.1. Работа со спином
- •Стили «up-down control»
- •Сообщения, которые можно посылать спину
- •11.2. Создание спина с «приятельским» окном
- •11.3. Работа с ползунком
- •Значения стилей для ползунка
- •Перечень сообщений, которые можно посылать ползунку
- •Перечень нотификационных сообщения ползунка
- •11.4. Индикатор процесса
- •Управляющие сообщения индикатору
- •Глава 12. Многозадачность: процессы и потоки
- •12.1. Создание нового процесса (отдельной задачи)
- •Разрешенные значения поля dwFlags
- •12.2. Многопотоковые программы
- •12.3. Работа с несколькими потоками
- •12.4. Синхронизация процессов и потоков: семафоры
- •12.5. Обработка событий
- •Глава 13. Приемы программного управления вычислительным процессом
- •13.1. Использование функций Проводника Explorer для работы в файловой системе
- •Управляющая информация Проводника
- •Режимы обработки файлов
- •13.2. Создание собственных динамических библиотек (dll-файлов)
- •13.3. Работа с буфером обмена Clipboard
- •Функции подсистемы Clipboard
- •Свойства выделяемого блока памяти
- •Форматы и типы данных
- •Литература
Рекомендуемый самый яркий состав цветов
№ |
Цвет |
По англ. |
Англ. суффикс (перо, кисть) |
Значение RGB |
1 |
Черный |
Black |
pen или brush |
RGB( 0, 0, 0) |
2 |
Белый |
White |
pen или brush |
RGB(255,255,255) |
3 |
Красный |
Red |
pen или brush |
RGB(255, 0, 0) |
4 |
Зеленый |
Green |
pen или brush |
RGB( 0,255, 0) |
5 |
Голубой |
Blue |
pen или brush |
RGB( 0, 0,255) |
6 |
Желтый |
Yelloy |
pen или brush |
RGB(255,255, 0) |
7 |
Фиолетовый |
Magenta |
pen или brush |
RGB(255, 0,255) |
8 |
Изумрудный |
Cyan |
pen или brush |
RGB( 0,255,255) |
9.2. Пиксели, линии, дуги, прямоугольники, эллипсы и секторы
Установка цвета пикселя. Цвет отдельного пикселя можно установить при помощи функции API SetPixel(), имеющей следующий прототип:
COLORREF SetPixel(HDC hdc, int X, int У, COLORREF color);
Здесь hdc задает контекст устройства вывода, X и Y – координаты точки, в которой необходимо установить нужный цвет, a color – задаваемый для пикселя цвет. Тип данных COLORREF описан в гл. 8. Эта функция возвращает:
прежний цвет пикселя в случае успешного завершения;
–1 при возникновении ошибки, или же тогда, когда точка с заданными координатами не попадает в рабочую область окна.
Рисование линий. Для рисования линий используется функция API LineTo(). Цвет и способ рисования линий определяется текущим пером. Вот прототип этой функции:
BOOL LineTo(HDC hdc, int X, int Y);
Параметр hdc задает дескриптор контекста устройства вывода. Линия рисуется от текущей графической позиции до точки с координатами, задаваемыми параметрами Х и Y. После этого текущая позиция также устанавливается в точке X, Y. При успешном завершении (то есть когда линия нарисована) эта функция возвращает ненулевое значение. При возникновении ошибки возвращается 0.
У некоторых программистов такая схема рисования вызывает недоумение. Понятно, что функция LineTo() использует для определения начала линии текущую графическую позицию. Однако почему затем координаты текущей позиции изменяются, а не остаются неизменными? – Причина в том, что во многих случаях при рисовании ломаных линий каждый следующий отрезок линии начинается там, где заканчивается предыдущий. В этом случае функция LineTo() работает очень эффективно, самостоятельно изменяя координаты текущей позиции и не требуя дополнительных вызовов функции для их установки и передачи параметров, задающих начальную точку каждого отрезка линии. В некоторых случаях текущую позицию можно устанавливать при помощи функции API MoveToEx(), которая описана ниже, вызывая ее непосредственно перед вызовом функции LineTo().
Установка текущей позиции. Для установки текущей позиции используется функция MoveToEx():
BOOL MoveToEx(HOC hdc, int X, int Y, LPPOINT lpCoord);
Здесь параметр hdc определяет контекст устройства вывода, координаты новой текущей позиции задаются параметрами Х и Y, а координаты старой текущей позиции возвращаются в структуре POINT, указатель на которую передается в параметре lpCoord. Структура POINT определяется следующим образом:
typedef struct tagPOINT
{
LONG x;
LONG y;
} POINT;
Если значение параметра lpCoord равно NULL, функция MoveToEx() не возвращает координаты старой текущей позиции. Функция MoveToEx() возвращает ненулевое значение в случае успешного завершения и нуль при возникновении ошибки.
Рисование дуги. Используя функцию API Arc(), можно нарисовать эллиптическую дугу (часть эллипса) цветом и способом, задаваемыми текущим пером. Дуга рисуется против часовой стрелки. Работа функции Агс() показана на рис. 9.1.
Рис. 9.1. Результаты работы функции Arc()
Прототип этой функции имеет следующий вид:
BOOL Arc(HDC hdc, int upX,int upY, int lowX, int lowY, int startX, int startY, int endX, int endY);
Здесь hdc представляет контекст устройства вывода, на котором будет нарисована дуга. Сама дуга определяется двумя объектами. Во-первых, она является частью эллипса, ограниченного, в свою очередь, прямоугольником (вписанного в прямоугольник), координаты которого задаются координатами левого верхнего (параметры upX и upY) и правого нижнего (параметры lowX и lowY) углов. Часть эллипса, которая будет нарисована (т.е. дуга), начинается в точке его пересечения с линией, проходящей через центр прямоугольника и точку, задаваемую координатами startX и startY, a заканчивается в точке пересечения эллипса с линией, проходящей через центр прямоугольника и точку с координатами endX и endY.
Рисование прямоугольников. Нарисовать прямоугольник, используя текущее перо, можно при помощи функции API Rectangle():
BOOL Rectangle(HDC hdc, int upX, int upY, int lowX, int lowY);
Как обычно, hdc представляет контекст устройства. Координаты левого верхнего угла прямоугольника задаются параметрами upХ и upY, а правого нижнего угла – параметрами lowX и lowY. При успешном завершении функция возвращает ненулевое значение и нуль – в случае возникновения ошибки. Прямоугольник автоматически заполняется цветом и способом, задаваемыми текущей кистью.
Можно также нарисовать скругленный прямоугольник (прямоугольник со скругленными углами). Это делается при помощи функции API RoundRect(), прототип которой имеет следующий вид:
BOOL RoundRect(HDC hdc, int upX, int upY, int lowX, int lowY, int curveX, int curveY);
Первые пять параметров этой функции имеют такое же назначение, что и в функции Rectangle(). Закругление углов прямоугольника определяется параметрами curveX и curveY, которые задают соответственно ширину и высоту эллипса, определяющего дуги. При возникновении ошибки эта функция возвращает 0, а при успешном завершении – ненулевое значение. Скругленный прямоугольник автоматически заполняется цветом и способом, определяемыми текущей кистью.
Рисование эллипсов и секторов. Для того чтобы нарисовать эллипс или круг, используя атрибуты текущего пера, необходимо вызвать функцию Ellipse():
BOOL Ellipse(HDC hdc, int upX, int upY, int lowX, int lowY);
Здесь hdc задает контекст устройства вывода, на котором будет нарисован эллипс. Сам эллипс определяется через ограничивающий его (описывающий) прямоугольник. Координаты верхнего левого угла этого прямоугольника задаются параметрами uрХ и upY, а правого нижнего угла – параметрами lowX и lowY. Чтобы нарисовать круг, необходимо задать равносторонний описывающий квадрат. Эта функция возвращает ненулевое значение при успешном завершении и нуль в случае возникновения ошибки. Эллипс заполняется цветом и атрибутами текущей кисти. Сектор эллипса – это объект, состоящий из дуги эллипса и линий, соединяющих концы дуги с точкой в центре эллипса. Для рисования сектора эллипса используется функция Pie(), прототип которой выглядит так:
BOOL Pie(HDC hdc, int uрХ, int upY, int lowX, int lowY, int startX, int startY, int endX, int endY);
Здесь hdc – это дескриптор контекста устройства, на котором рисуется сектор. Дуга сектора определяется двумя объектами – собственно эллипсом и ограничивающим его прямоугольником, координаты которого задаются параметрами uрХ, upY (левый верхний угол) и lowX, lowY (правый нижний угол). Дуга начинается в точке пересечения эллипса с линией, проходящей через центр ограничивающего прямоугольника и точку с координатами startX, startY, а заканчивается в точке пересечения эллипса с линией, проходящей через центр ограничивающего прямоугольника и точку с координатами endX, endY.
Сектор эллипса рисуется цветом и атрибутами текущего пера и заполняется цветом и атрибутами текущей кисти. Функция Pie() возвращает ненулевое значение при успешном завершении и нуль в случае возникновения ошибки.
