Рис. 23.2. Результат увеличения окна Таким образом, можно сформулировать общее правило. Возможность управления размером буфера является преимуществом DirectX, пока оно не приводит к масштабированию растровой картинки. При этом у разработчика есть два пути, чтобы реализовать режим линзы и избежать масштабирования при копировании данных в окно. Можно после изменения размеров окна уничтожать и заново создавать объект Di rect3DDevi се9 с новыми размерами буферов. Это потребует заметных затрат времени, потому что придется уничтожить и заново загрузить все текстуры, так как изменится их расположение в памяти. Чтобы уменьшить частоту таких изменений, можно поступить так же, как в системах реального времени при вводе состояния переключателей борются с дребезгом контактов. После получения сообщения WMSIZE нужно выдержать небольшую паузу и, только если новых
Настройка конвейєра сообщений во время этой паузы не поступит, выполнить процедуру пересоздания устройства. Также разработчик может при помощи параметров метода Présente ) указать, что следует копировать в окно не всю невидимую страницу, а только область просмотра. Используя априорную информацию о максимально возможном размере окна, можно создать буфер цвета и теневой буфер, опираясь на максимально возможный размера окна. По каждому сообщению WM_SIZE потребуется назначать область просмотра равной текущим размерам рабочей области окна, но это не связано со значительными затратами времени. Это приведет к созданию буфера, соответствующему всему экрану, и копированию без масштабирования изображений.
Для поддержки режима шторки можно всю невидимую страницу считать областью просмотра, а копировать в видимую страницу только прообраз окна. Но это неэффективное решение. В этом случае система будет рисовать во всей невидимой странице, а показывать только прообраз окна.
Чтобы рисовать только ту часть изображения, которая попадает в прообраз окна, надо по сообщениям WM_SIZE изменять матрицы геометрических преобразований, которые пока не рассматривались на страницах этой книги.