Окт 16

Эластичные прямоугольники

Графические редакторы, как правило, поддерживают операцию выделения некоторой прямоугольной области. Пользователь нажимает левую кнопку мыши, фиксируя одну из вершин прямоугольника, и перемещает мышь к противоположной вершине. В процессе перемещения мыши построение фигуры считается еще не законченным, и она выводится пунктирным контуром, который все время изменяется. При отпускании кнопки мыши прямоугольник фиксируется, обозначаясь, например, другим цветом или другим стилем линии контура.
Приложение ElasticRect, приведенное в листинге 4.4, демонстрирует реализацию подобной операции. Кроме того, в нем показана обработка двойного щелчка мыши, по которому программа рисует квадрат фиксированного размера.
Рисование линий и фигур происходит на некотором фоне или на некотором изображении, которое расположено в клиентской области окна. Для простоты дальнейшего изложения этот фон или существующее изображение будет называться холстом.
В основе рисования эластичных прямоугольников обычно лежит следующая алгоритмическая идея. Получив сообщение WM_M0USEM0VE, программа должна стереть предшествующее изображение прямоугольника, затем получить координаты новой позиции мыши и нарисовать новое изображение прямоугольника.
Проще всего стирание текущего изображения фигуры можно организовать, если в контексте устройства установлен режим рисования R2_X0RPEN или R2_N0TX0RPEN. В этом случае повторный вывод фигуры приводит к восстановлению того состояния холста, которое было перед первым выводом этой фигуры. Чем же различаются эти два режима или эти две растровые операции: R2_X0RPEN и R2_N0TX0RPEN?
Когда фигура рисуется первый раз, то наибольший интерес представляют ситуации, в которых цвет пера и холста различаются, что соответствует второй и третьей строкам в таблицах. Естественно, мы хотели бы в результате этого рисования получить цвет пера, а не холста. В графе «Примечание» показано, что такой результат достигается при рисовании белым пером на черном холсте для растровой операции R2_X0RPEN и при рисовании черным пером на белом холсте для растровой операции R2_N0TX0RPEN.