| « Поставить закладку » « Сделать стартовой » | |||
|
|||
|
Второй урок по DelphiX.
Прошёл месяц с тех пор как я написал первую часть статьи по использованию
DirectX в среде Delphi. У меня накопилось ещё несколько примеров, которые,
надеюсь, послужат наглядным руководством для начинающих. Вызовы _AddRef() и _Release() больше не используются – в конце концов я посчитал это бессмысленной тратой времени при наборе кода. К тому же, как выяснилось, что вызов именно этих методов привёл к неработоспособности одного из примеров предыдущей статьи – если кто интересовался, знает, что это был пример опроса клавиатуры с использованием DirectInput. После удаления вызовов программа стал работать корректно. По-видимому, имело место некорректное взаимодействие с драйвером клавиатуры. Выражение вида if COM-объект <> nil then COM-объект := nil переписано с
использованием процедуры следующего вида: Теперь достаточно написать SAFE_DELETE( @COM-объект ) – может, это покажется
и излишним, но поверьте, в более крупных программах, где надо удалить 15-20
COM-интерфейсов, это становится удобным и сокращает код. Все эти соображения
навеяны под влиянием примеров из MS SDK. Кстати, может, кто-то несогласен с
правильностью описанной процедуры? В функции LoadFiles() добавлен вызов DeleteObject() – как известно, после
работы объекты GDI надо удалять, иначе они поглощают ресурсы системы. В данном
случае именно такой объект создаётся при вызове функции GDI LoadImage() –
казалось бы, тип HBITMAP – это всего лишь переопределение типа LongWord,
копилятор самостоятельно удалит переменную этого типа после выхода из функции.
На самом деле GDI при вызове LoadImage() (и других подобных функций) создаёт
ресурс GDI и резервирует для него часть системной памяти, а переменная hBmp –
всего лишь идентификатор этого ресурса в общем списке ресурсов Windows. Поэтому
в процессе выполнения программы будет удаляться только идентификатор, а ресурс,
на который он указывает, будет «висеть» в памяти. Именно поэтому следует вызвать
DeleteObject() для удаления объекта GDI. В предыдушем примере я не сделал этого
по причине недосмотра. Надеюсь, мой стиль написания кода программ покажется удовлетворительным – он
почти во всём подобен стилю, который использовали составители DirectX SDK.
Вообще, многие пишут, как курица лапой – и предлагают свои творения на всеобщее
обозрение. Ещё полезно заглянуть на страницу в нашем уважаемом Королевстве -
http://www.delphikingdom.com/article/tassel.htm - это классика. Хочется поделиться с новичками своим мнением по поводу компонетов DelphiX и
почему я не рекомендую их использовать. Такие наборы классов – это нестандартный подход. Допустим, вы потратили
изрядно своего времени и досконально изучили DelphiX. Так вот, изучив всё ЭТО,
вы в итоге не изучили сам DirectX. Второе – изученные классы обладают многим и
позволяют писать реальные программы, но всё равно этот подход очень негибок – вы
ограничены тем, что уже сделано. На этот счёт у меня есть веский аргумент – это
Direct3D. Вот тут DelphiX уж точно не даст развернуться как следует – и это
характерно и для других компонент DirectX, пусть и в меньшей мере. Третье –
немного, но снижается быстродействие. Четвёртое – в классах DelphiX кроме
непосредственных вызовов методов интерфейсов DirectX используются ещё и
собственные функции – кто даст гарантию, что в них нет ошибок? Bounds Когда я впервые столкнулся с этой проблемой, меня это неприятно поразило. Оказалось, что необходимо использовать интерфейс отсечения – IDirectDrawClipper. Однако он предназначен только для оконных приложений, в полноэкранном режиме от него нет никакого проку. Как уже было упомянуто, рекомендую программировать только полноэкранные приложения как наиболее быстродействующие, и забыть об оконных. Так как же быть – тупик? К сожалению, даже в SDK нет примеров решения этого вопроса. Впрочем ответить
на него не так уж сложно – нужно лишь понять, что хочет DirectDraw и как это
преподнести. Обратите внимание на четвёртый параметр метода IDirectDrawSurface7.BltFast() – это адрес структуры типа TRect. Для чего он нужен? Как известно, назначение струтуры TRect в GDI API – указание положения и размера какой либо области путём задания левого верхнего и правого нижнего угла. Так вот, эта структура позволяет указать DirectDraw о необходимости вывести не всё изображение спрайта, а лишь его часть: Воспользуемся этой структурой и будем вместо всего спрайта выводить какую-то его облать – ту, которая будет видна на экране, а невидимая будет находиться вне области, описываемой структурой TRect. Т. о. будет создаваться лишь иллюзия пребывания спрайта за пределами экрана. Например, спрайт выходит за границы экрана, как это показано на самом первом рисунке. Тогда выводимая область должна быть такой (показана красным цветом): Теперь повоображайте и нарисуйте на бумаге, как будут выглядеть выводимые
части спрайта при различных его положениях за границами экрана. // Предполагаем, что края спрайта не выходят за границы
экрана // Проверяем выход краёв, и если такая ситуация имеет
место, то корректируем Где nX и nY – координаты левого верхнего угла спрайта. При выводе надо не
забыть скорректировать их: Scale Transparent DirectDraw предоставляет удобный инструмент для задания маски прозрачности.
Цвета пикселей, которые игнорируются, называются «цветовыми ключами». Каждая
поверхность может иметь свои цветовые ключи, причём их может быть несколько. var ddck: TDDCOLORKEY; Для указания прозрачного цвета, как видно, используется структура TDDCOLORKEY.
В её двух полях необходимо указать нижнюю и верхнюю границу диапазона
«прозрачных» цветов. Замечу, что использование диапазона цветов возможно только
в случае, если такая возможность поддерживается аппаратно. Поэтому лучше
ограничиться каким-либо одним цветом, как это сделано выше. После заполнения
структуры TDDCOLORKEY необходимо вызвать метод
IDirectDrawSurface7.SetColorKey(), где первый параметр – один из возможных
флагов, второй - адрес структуры TDDCOLORKEY. Обычно используется флаг
DDCKEY_SRCBLT, который указывает, что при копировании изображения будет
использоваться цветовой ключ поверхности-источника. Другие флаги можно узнать из
справочной службы DirectX SDK. Поэтому можно смело присваивать 0 для чёрной маски в любом режиме. Однако,
предположим, нам надо задать цветовой ключ в виде чистого синего цвета. Для 24-
и 32-битного режима это можно сделать с помощью макроса (функции) из модуля
windows.pas: Зарезервированное слово shl относится к сдвиговым операциям и сдвигает
содержимое на указанное значение влево. Так, для задания цветового ключа в виде чистого синего цвета необходимо
написать так: Ну и в том же духе, в полном соответствии с теорией цвета. В своё время я довольно долго промучился с этой проблемой, тем более что в
имеющейся литературе ничего об этом не сказано. В конце концов решил, что
необходимо написать аналогичную к RGB() функцию, но об этом немного позже. var ddpf: TDDPIXELFORMAT; Формат цветовых составляющих описывается в полях dwRBitMask, dwGBitMask и dwBBitMask структуры TDDPIXELFORMAT – но только в том случае, если битовое поле dwFlags содержит флаг DDPF_RGB – признак того, что поверхность создана в RGB-режиме. Значения полей dwRBitMask, dwGBitMask и dwBBitMask для режимов с разной глубиной палитры описываются в разделе dwRBitMask, dwGBitMask и dwBBitMask справочной службы DirectX SDK: DDPF_RGB 16 R: 0x0000F800 Запустите готовое приложение GetPixFormat из каталога DXCommon – и посмотрите, какой формат поверхности использует ваша карта в 16-битовом режиме. Скажу, что на компьютере с видеоакселератором GeForce 2 MX 420 получались значения из самой верхней ячейки – и это соответствует формату 5-6-5. По-моему, именно такой формат принят во всех современных видеокартах (заметьте, что во второй ячейке таблицы составляющие R и B переставлены местами). А вот, например, дедушка S3 Trio 3D/2X использует формат, описанный в нижней ячейке – опытным путём установлено, что это 5-5-5. Вот как должен быть переписан макрос для формата 5-6-5: Как видно, последний бит не используется. Обратите внимание, что группа
битов, отвечающих за красную и синию составляющую, в 16-битовом режиме
поменялись старшинством. А формат, описанный во второй ячейке таблицы, наоборот,
по старшинству схож с 24- и 32-битовым режимами. Подозреваю, что используется
этот формат довольно редко. Для того, чтобы наша DirectDraw-программа без проблем работала в обоих форматах, необходимо проверить текущий формат, запомнить его и при задании цветового ключа для поверхности вызвать соответствующий макрос. Всё это и делается в приложении Transparent – надеюсь при его разборе у вас не возникнет проблем. Не забудьте при копировании методом BltFast() указать флаг DDBLTFAST_SRCCOLORKEY. Fps Откройте файл проекта fps.dpr. Т. к. функция TextOut() уже занята, функцию,
отвечающую за вывод текста, пришлось назвать менее звучно – OutText(). Я не буду
подробно описывать её, надеюсь, всё понятно. Для ускорения работы программы я
поступил так: для вывода текста используется отдельная поверхность – именно на
неё и выводится текст средствами GDI. Затем всё время поверхность просто
копируется на задний буфер – это осуществляется гораздо быстрее, чем постоянный
вывод текста на задний буфер, а когда появляется необходимость изменить текст –
он снова выводится на нашу отдельную поверхность. Потребность изменить текст
появляется лишь раз в секунду. И последнее. По-видимому, в операционной системе Windows 2000 функции GDI должны работать быстрее, т. к. эта ОС полностью 32-х разрядная. Но всё же рекомендую пользоваться описанным выше подходом. Text Sound var sound: TWave; GetDXVer и GetDXVerSetup Пример имеет два недостатка:
Рубрика: Графика в Delphi
HTML 5: пять вещей вызывающих особый интер....
HTML 5 — это грядущее обновление гипертекстового языка разметки, основного способа создания контента для размещения его во всемирной паутине. Разработка HTML остановилась в 1999 году, на версии HTML 4.01 и с тех пор web-содержимое изменилось так, что текущие спецификации HTML перестали соответствовать сегодняшним требованиям. HTML 5 нацелен на то, чтобы увеличить функциональную совместимость HTML и соответствовать растущим требованиям разнообразного и смешанного web-контента. HTML 5 так же нацелен на устранение недостатков четвертой версии. В этой статье мы взглянем на 5 новых интересных вещей в HTML 5.
Подробнее... |
Рубрика: Html
| Добавлено: 22.12.2008
asp.net: ListView с разных сторон.
Элемент управления ListView был представлен в .Net Framework 3.5 как замена устаревшему GridView. Новый элемент имеет более расширенный функционал, чем его предшественник, но в тоже время лишен некоторых внутренних механизмов, что впрочем целиком следствие из расширенной универсальности ListView. Среди отличий ListView и GridView можно назвать и гибкую настройку разметки, что позволяет выводить данные не только в табличном виде, но и вообще в любом каком пожелает программист. Благодаря шаблонам ItemTemplate, EditItemTemplate, InsertItemTeplate можно настроить внешний вид при любом из состояний ListView: редактировании или выборе элемента.
Подробнее... |
Рубрика: .NET компоненты
| Добавлено: 22.12.2008
Создание кросс-таб отчета в Stimulsoft Rep....
Компания Стимулсофт предоставляет для разработчиков мощный набор инструментов для создания отчетов для Microsoft Visual Studio .Net 2005 и 2008; эти инструменты доступны как для Windows Forms, так и для Web Forms. Это генератор отчетов Stimulsoft Reports.Net. Генератор отчетов Stimulsoft Reports.Net имеет ряд особенностей: простая работа с дизайнером отчетов, полная поддержка экспорта в PDF, Word, Excel и многие другие форматы. Crystal Report и Microsoft Reporting Service – очень хорошие программные продукты для повседневной работы, но, если Вам необходимо создать отчеты с поддержкой кросс-табов, drill down, Ajax, штрих-кодов и возможностью подключения одновременно более одного источника данных, то Stimulsoft Reports.Net поможет Вам сэкономить массу времени. Также, данный генератор отчетов позволяет пользователям создавать свои собственные отчеты любой сложности. И все эти особенности делают Stimulsoft Reports.Net хорошим выбором в сфере программных продуктов для Business Intelligence.
Подробнее... |
Рубрика: .NET компоненты
| Добавлено: 22.12.2008
Остальные статьи: |
Цитата дня (все,добавить):
|
Realcoding.NET
© 2003-2008 |
Контакты |
Реклама на сайте
|