http://seprize.narod.ru |
|
Блитинг< Часть 1 | Часть 2 | Часть 3 > Возвращаемое методом значение мы анализируем, подобно тому, как это делали в предыдущем примере. Только здесь мы покидаем цикл при любой ошибке, отличной от ошибки, связанной с потерей поверхности, или при отсутствии ошибок. Протестируйте пример. Приложение должно функционировать надежно в самых различных ситуациях, но если по ходу его работы изменить настройки экрана и установить его новые размеры больше предыдущих, то при восстановлении приложения оно не будет закрывать весь экран, а размеры его станут такими же, как при первоначальном запуске. Заметна еще одна проблема: если до запуска приложения установить режим экрана в 256 цветов, образ выводится совсем не красочным. Чтобы избежать таких ошибок, обычно полноэкранные приложения устанавливают разрешения экрана сообразно со своими нуждами. Код обработчика OnCreate формы дополнился строками: hRet := FDD.SetDisplayMode (640, 480, 16, 0, 0); // Задаем режим if hRet О DD_OK then begin // Обязательно анализируем результат ErrorOut(hRet, 'SetDisplayMode'); Exit; end; Установка режима является методом главного объекта, поэтому должна происходить строго после его создания, но не обязательно первым же действи-:м. Первые три аргумента метода, надеюсь, сразу же ясны: высота, ширина экрана и разрешение (число бит, необходимых для определения цвета пиксела). Последние два аргумента метода всегда будем задавать нулевыми. первый из них определяет частоту регенерации. При нулевом значении параметра отдается на усмотрение DirectDraw. Последний аргумент задает дополнительные флаги, пока из них доступен только ddsdm_standardvgamode, связанный с особым режимом Mode X (320x200x8). Итак, на время работы приложения мы задаем режим 640x480x16. Эта тройка чисел не может браться наобум, а должна принадлежать набору поддерживаемых системой режимов. Если на вашей карте выводимое изображение теряет в красочности по сравнению с исходным 24-разрядным растром, установите этот режим 24- или 32-битным, в зависимости от того, какой из них доступен. Обратите внимание, что нет необходимости по окончании работы приложения возвращаться к режиму, установленному пользователем. Это произойдет автоматически. Разобравшись с данным примером, мы можем перейти к рассмотрению процедуры настоящего блиттинга. Коренное отличие его от предыдущего состоит в том, что образ помещаем на вспомогательную поверхность, а при воспроизведении осуществляется блиттинг на первичную поверхность. Раздел private описания класса формы дополнился строкой объявления дополнительной поверхности, предназначенной для хранения образа: FDDSImage : IDirectDrawSurface7; Код обработчика события OnCreate начинается с того, что этой переменной присваивается значение nil, а при завершении работы приложения освобождается память в порядке, обратном связыванию переменных: if Assigned(FDD) then begin if Assigned(FDDSImage) then FDDSImage := nil; // Перед первичной if Assigned(FDDSPrimary) then FDDSPrimary := nil; // поверхностью FDD := nil; end; Растровое изображение считывается только один раз. У обработчика OnCreate появился вспомогательный объект wrkBitmap класса TBitmap. Вторичная поверхность создается после первичной и заполняется считанным растром: wrkBitmap := TBitmap.Create; // Создание объекта растра wrkBitmap.LoadFromFile ('..\lake.bmp'); // Считывание файла растра // Напоминаю, что обнулять поля можно и с помощью ZeroMemory FillChar (ddsd, SizeOf(ddsd), 0); with ddsd do begin // Как для любой записи, можно использовать with dwSize := SizeOf(ddsd); // Обязательное действие // Будем задавать размеры поверхности (+ DDSD_HEIGHT и DDSD_WIDTH) dwFlags := DDSD_CAPS or DDSD_HEIGHT or DDSD_WIDTH; ddsCaps.dwCaps := DDSCAPS_OFFSCREENPLAIN; // Внеэкранная поверхность dwWidth := wrkBitmap.Width; // Ширина поверхности равна ширине растра dwHeight := wrkBitmap.Height; // Задаем высоту поверхности end; // with // Собственно создание вспомогательной поверхности hRet := FDD.CreateSurfасе(ddsd, FDDSImage, nil); if hRet <> DD_OK then begin // Анализируем на предмет успешности ErrorOut(hRet, 'Create Image Surface'); Exit; end; // Копирование растра из wrkBitmap во вспомогательную поверхность hRet := DDCopyBitmap (FDDSImage, wrkBitmap.Handle, 0, 0, wrkBitmap.Width, wrkBitmap.Height); if hRet <> DD_OK then begin // Обязательно анализируем результат ErrorOut(hRet, 'DDCopyBitmap'); Exit; end; // Удаление вспомогательного объекта wrkBitmap.Free;
Вспомогательная, внеэкранная поверхность FDDSImage создается с описанием ddscaps_offscreenplain. Здесь есть некоторые нюансы, но пока рассматривать их не будем. После создания вторичной поверхности заполняем ее растровым изображением с помощью вспомогательной функции DDCopyBitmap из модуля DDUtil, не забываем дописать имя модуля после uses. В тонкости того, как осуществляется копирование, можете не вникать или разберитесь позднее самостоятельно. Код данной функции основан на функциях API. Ключевым является вызов StretchBlt. < Часть 1 | Часть 2 | Часть 3 >
|
|
Если вы используете материалы с данного сайта, то сообщите
владельцу по почте |
© Сайт открылся 04.09.2002 Дата последнего обновления 09.10.2002 |