Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИГС / Lab_02 / labor_02.doc
Скачиваний:
34
Добавлен:
17.04.2018
Размер:
431.1 Кб
Скачать

Уничтожение следа за движущимся объектом повторным рисованием объекта в Windows программах.

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

Здесь алгоритм следующий. В ответ на сообщение таймера WM_TIMERвызывается функция Move_OnTimer, в которой сначала рисуется старое изображение стрелки цветом фона, а затем в новом положении рисуется стрелка своим цветом.

//функция обрабатывает сообщение WM_TIMER

void Move_OnTimer(HWND hwnd)

{

HDC hdcWin;

hdcWin = GetDC(hwnd); //получаем контекст экрана

//рисуем фигуру цветом фона

Arrow(hdcWin,PtA,7,xA1,yA1,xA1,yA1,0,1,1,0);

//рисуем фигуру цветом объекта

Arrow(hdcWin,PtA,7,xA1,yA1,xA2,yA2,fiA,kxA,kyA,1);

xA1 = xA2; yA1 = yA2;

ReleaseDC(hwnd,hdcWin); //освобождаем контекст экрана

}

Компилируем, запускаем программу mov02.exe, и результат работы этой программы показан на Рис.16.

Рис. 16.

Результат работы программы mov02.cpp.

Анализ Рис.16 показывает недостатки указанного метода. Как видно из этого рисунка, при движении графического объекта, стираются другие объекты встречаемые движущимся объектом на своем пути.

Обычно от этого недостатка избавляются с помощью использования специального режима окрашивания пикселей на экране. Это режим задается параметром XOR_PUT- исключающее или.

Использование режима xor для моделирования движения в Windows программах.

Если установить режим отображения XOR, то начинает работать механизм ИСКЛЮЧАЮЩЕГО ИЛИ (XOR) при рисовании фигур, окрашенных одним цветом, когда они рисуются поверх фигур окрашенных другим цветом. Самое главное в этом методе, это то, что при повторном рисовании фигуры на одном и том же месте, одним и тем же цветом, изображение фигуры пропадает и восстанавливается первоначальное изображение.

Для выбора режима рисования предназначена функция SetROP2(). Приведем ее прототип.

int SetROP2(HDC hdc, int fnDrawMode);

Первый параметр hdc– это идентификатор контекста устройства, в котором необходимо установить новый режим рисования. Второй параметр fnDrawMode– это идентификатор режима рисования.

Нас будет интересовать значение второго параметра равное R2_XORPEN. В этом случае при определении цвета пикселя выполняется операция ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR) между цветом подложки и цветом пера.

Функция выбора режима рисования SetROP2() вызывается перед рисованием стрелки в функцииMove_OnTimer(), которая обрабатывает сообщениеWM_TIMER, приходящее от таймера.

//функция обрабатывает сообщение WM_TIMER

void Move_OnTimer(HWND hwnd)

{

HDC hdcWin;

hdcWin = GetDC(hwnd); //получаем контекст окна на экране

//устанавливаем режим XOR

SetROP2(hdcWin,R2_XORPEN);

//рисуем фигуру в старом положении в режиме XOR

Arrow(hdcWin,PtA,7,xA1,yA1,xA1,yA1,0,1,1);

//рисуем фигуру в новом положении

Arrow(hdcWin,PtA,7,xA1,yA1,xA2,yA2,fiA,kxA,kyA);

xA1 = xA2; yA1 = yA2;

ReleaseDC(hwnd,hdcWin); //освобождаем контекст окна на экране

}

Напомним действие ИСКЛЮЧАЮЩЕГО ИЛИ (XOR) на отдельные биты числа. Для битовой операцииXORимеет место следующая таблица.

XOR

0

1

0

0

1

1

1

0

Пусть стрелка окрашена в красный цвет. Тогда в модели RGBэтот цвет будет представлен следующим числом.

Red = FF 00 00 = 11111111 00000000 00000000

Статический объект эллипс пусть будет окрашен в зеленый цвет. Зеленый цвет будет представлен следующим числом.

Green = 00 FF 00 = 00000000 11111111 00000000

При наложении красной стрелки на зеленый эллипс, цвет стрелки будет равен числу, полученному после применения операции XORк красному и зеленному цвету.

Red XOR Green

Проведем эту операцию детально.

11111111 00000000 00000000

XOR

00000000 11111111 00000000

--------------------------------------

11111111 11111111 00000000

Полученное число в модели RGBсоответствует желтому цвету.

Yellow = FF FF 00 = 11111111 11111111 00000000

Таким образом, в режиме XORрисуя красную стрелку на зеленом эллипсе, реально будем получать стрелку, окрашенную в желтый цвет. Далее легко проверить, что повторное рисование красной стрелки на желтой стрелке даст зеленый цвет, и зеленый эллипс будет восстановлен.

Компилируем, запускаем программу mov03.exe, и результат работы этой программы показан на Рис.17.

Рис. 17.

Результат работы программы mov03.cpp.

Анализ Рис.17 показывает особенности режима XOR. Как видно из этого рисунка, при движении графического объекта, объекты встречаемые движущимся объектом на своем пути, с одной стороны восстанавливаются. Однако с другой стороны меняется цвет самого движущегося объекта, когда он встречает другой объект на своем пути.

Если необходимо, чтобы цвет движущегося объекта оставался неизменным, то нужно использовать другие методы вывода изображения на экран монитора.

Соседние файлы в папке Lab_02