Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
321-352.doc
Скачиваний:
6
Добавлен:
11.11.2019
Размер:
521.73 Кб
Скачать

Создание графических изображений закраской пикселов

После создания объекта контекста устройства, выбора инструментов рисования и атрибутов можно приступить непосредственно к рисованию. В класс CDC входят функции для рисования точек, прямых и кривых линий, а также фигур с замкнутыми контурами. Координаты расположения фигуры в окне представления задаются логическими координатами, которые передаются в функции рисования в виде аргументов. В паре координат, описывающих точку и передаваемых в функцию рисования, задается их порядок передачи: сначала горизонтальная, затем вертикальная координаты точки. Горизонтальная координата часто называется координатой x, а вертикальная — y. Координаты передаются во все функции рисования как значения типа int. На 32-разрядной платформе ключевое слово int определяет 32-разрядное целое число со знаком. В них может храниться значение в диапазоне от –2147483648 до +2147483647. На 16-рразрядной платформе это ключевое слово соответствует типам small и short, которые определяют 16-рязрядные целые числа со знаком в диапазоне от –32768 до +32767. Например, для Windows 95 можно передавать значения координат, представляющие собой диапазон 16-битовых целых значений (ограничение значения типа int).

Можно закрасить один пиксел, вызывая функцию SetPixelV() класса CDC. Функция имеет такие прототипы:

BOOL CDC::SetPixelV(int x, int y, COLORREF crColor); BOOL CDC::SetPixelV( POINT point, COLORREF crColor );

Первые два параметра описывают горизонтальную и вертикальную координаты пиксела в логических единицах, а третий параметр — его цвет. Во втором прототипе в функцию передаются координаты точки как поля структуры POINT. Если заданный цвет не является чистым, доступным в текущем видеорежиме, то функция SetPixelV() будет использовать ближайший чистый цвет. Очевидно, что псевдополутон невозможно использовать для единственного пиксела.

Для определения значения цвета при передаче его в функцию CDC::SetPixelV() в качестве аргумента используется макрос RGB().

Пример вызова функции отображения пиксела показан ниже:

pDc->SetPixelV(10, 15, RGB(255, 0, 0));

Здесь pDc — указатель на объект контекста устройства.

Если нужно получить текущий цветовой код точки, то вместо вызова функции CDC::SetPixelV() вызовите более медленную функцию CDC::SetPixel(). Функция CDC::SetPixel() устанавливает пикселу указанный цвет и возвращает прежний. Функция объявлена таким образом:

COLORREF CDC::SetPixel( int x, int y, COLORREF crColor ); COLORREF CDC::SetPixel( POINT point, COLORREF crColor );

Не все устройства поддерживают эту функцию. Чтобы определить, поддерживает ли устройство функцию CDC::SetPixel(), нужно вызвать функцию CDC::GetDeviceCaps(), прототип которой приводится ниже:

int CDC::GetDeviceCaps( int nIndex ) const;

Параметр nIndex определяет широкий диапазон зависящей от устройства информации. Для наших целей необходимо в качестве аргумента передать значение RASTERCAPS, которое указывает растровые возможности устройства, и проверить возвращаемое значение на способность к пересылке битовых образов (флаг RC_BITBLT)

Можно получить текущее значение цвета пиксела в виде RGB кода, вызывая функцию CDC::GetPixel() и передавая ей координаты точки. Функция имеет такие прототипы:

COLORREF GetPixel( int x, int y ) const; COLORREF GetPixel( POINT point ) const;

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

Программа Mandel рисует рекурсивный узор, который полностью заполняет окно представления. Как правило, в процессе рисования узоров пользователь не выполняет никаких действий, связанных с выбором команд меню, щелчками мыши или нажатием клавиш клавиатуры, изменением размеров окна или изменением фокуса ввода. Это значит, что программа не занята обработкой никаких сообщений из очереди сообщений программы, потому что очередь сообщений пуста. В случае пустой очереди сообщений в цикле обработки сообщений приложения вызывается функция OnIdle() класса приложения программы, которая обрабатывает простой программы (idle-time processing). Эта функция имеет такой прототип:

virtual BOOL CWinApp::OnIdle( LONG lCount );

Параметр lCount определяет счетчик, который устанавливается в 0 каждый раз, когда новое сообщение обработано, и увеличивается, когда очередь сообщений пуста.

Функция CWinApp::OnIdle() возвращает значение TRUE, если необходимо продолжать периодически ее вызывать. Если функция CWinApp::OnIdle() возвращает значение FALSE, то MFC не будет ее вызывать до получения программой следующего сообщения. Как только в очередь сообщений поступят сообщения WM_SIZE (с кодами SIZE_MINIMIZED минимизации окна или SIZE_MAXIMIZED его максимизации) или WM_KILLFOCUS, вызванное перекрытием окна программы Mandel, или WM_COMMAND, вызванное выбором команд меню, например, FileNew, функция OnIdle() класса приложения вернет значение FALSE, и будут обработаны поступившие сообщения.

В процессе рисования важно иметь указатель на объект представления, который определяет активное окно, поскольку только в активном окне возможно получение графических изображений. Для получения указателя на объект представления используется функция CFrameWnd::GetActiveView(). Ее прототип показан ниже:

CView* CFrameWnd::GetActiveView() const;

Используя описанные выше прототипы функций, мы разработаем программу создания узора Мандельброта в соответствии с технологией, описанной в упражнении 2. Программа Mandel иллюстрирует использование функции CDC::SetPixelV(), а также другие способы создания графических изображений.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]