http://seprize.narod.ru |
|
Блитинг< Часть 1 | Часть 2 | Часть 3 > Блиттингом называется копирование графических изображений в память видеоустройств, и DirectDraw представляет собой просто механизм Блиттинга. Начнем знакомство с этим механизмом. Пример является продолжением знакомства с DirectDraw. В примере используется первичная поверхность, которая полноэкранная, на нее с помощью вспомогательной канвы выводится растровое изображение. Это изображение, используемое здесь, взято из DirectX SDK производства Microsoft. Содержит эта картинка пейзаж. Отличие данного примера состоит в том, что поверхность, служащая фоном нашего растра, закрашивается. Работа приложения теперь выглядит естественной для полноэкранных приложений вообще, и для приложений, использующих DirectDraw, в частности. Что украшает нашу программу. Поскольку это полноэкранное приложение, то обработчики событий OnCanResize и onResize ему не нужны. Не пропустите также, что свойство BorderStyle формы необходимо установить в bsNone. Это важно, если этого не сделать, то приложение будет работать прекрасно, но при движении курсора вблизи границ экрана и в районе системного заголовка окна приложения сквозь "экран" будет проглядывать другое окно. Обязательно проверьте это, вернув обычное значение указанного свойства формы. Полноэкранная поверхность занимает рабочий стол, загораживает собой все окна, но они продолжают реагировать на поступающие им сообщения. Чтобы при восстановлении приложения его окно появлялось распахнутым на весь экран, появился обработчик события OnRestore компонента ApplicationEvents1: procedure TfrmDD.ApplicationEvents1Restore(Sender: TObject); begin WindowState := wsMaximized; end; Следует задавать это свойство именно динамически, т. е. принудительно распахивать окно при каждом его восстановлении. Главные изменения коснулись кода, связанного с перерисовкой окна. Часть этого кода, предназначенную для вывода изображения, рассматривать не будем. Здесь ничего нового для нас нет. Посмотрим внимательно на то, что ему предшествует, а именно на заполнение фона черным цветом. Кстати, обратите внимание, что порядок действий должен быть такой: закрашиваем фон, на закрашенный фон выводим растр. Процедура обработчика перерисовки окна имеет локальную вспомогательную переменную ddbltfx типа tddbltfx, который представляет собой запись и является вспомогательным, подобным использованному нам при создании поверхности типу TDDSurfaceDesc2, но применяется лишь для задания параметров Блиттинга. Поля этой структуры мы изучим по ходу дальнейшего изложения. Пока ограничимся тем, что значение поля dwFillcolor задает цвет заполнения поверхности. Как указывалось ранее, работа с подобными структурами начинается с обнуления всех полей и задания ее размера указанием значения поля dwsize:
ZeroMemory(@ddbltfx, SizeOf (ddbltfx)); // Обнуляем все поля ddbltfx.dwSize := SizeOf (ddbltfx); // Обязательно задаем размер ddbltfx.dwFillColor := 0; // Цвет заполнения — черный
Для блиттинга используем метод Blt первичной поверхности: hRet := FDDSPrimary .Bit (nil, nil, nil, DDBLT_COLORFILL or DDBLT_WAIT,@ddbltfx) ;
Первым трем аргументам присваиваем значение nil (смысл их раскроим позже). Четвертый аргумент метода является битовым флагом: у нас это комбинация двух констант. Константа ddblt_wait задает режим ожидания для вывода. В этом режиме вывод станет осуществляться, когда устройство будет готово к нему, и поэтому метод не возвратит никогда значение DDERR_WASSTILLDRAWING. Флаг DDBLT_COLORFILL сообщает методу Blt О ТОМ, ЧТО вместо блиттинга выполняется цветовое заполнение. Последний аргумент указывает адрес переменной, хранящей параметры блиттинга. < Часть 1 | Часть 2 | Часть 3 >
|
|
Если вы используете материалы с данного сайта, то сообщите
владельцу по почте |
© Сайт открылся 04.09.2002 Дата последнего обновления 09.10.2002 |