Все записи с меткой 'gdi'


Сплэшскрин в WPF


В .NET Framework 3.5 SP1 появилась возможность использовать в качестве сплэшскрина картинку из ресурсов. Для этого необходимо было поставить у картинки Build Action в SplashScreen, либо в коде использовать класс SplashScreen. Но данный сплэшскрин был очень ограничен в своих возможностях. На него даже невозможно было вывести текст. И если при старте программы была необходимость выводить сплэшскрины с разным текстом, то приходилось создавать множество вариантов картинок, со всеми возможными надписями. Как вариант можно было сделать отдельно фоновую картинку и отдельно картинки с надписями и показывать два сплэшскрина один поверх другого (такой метод мы использовали в ТЕХНОкоорд 5.0), но в данном случае был возможен вариант, когда пользователь ткнёт мышкой в фоновый сплэшскрин и он перекроет сплэшскрин с текстом. Также как вариант можно сначала показывать простой сплэшскрин из картинки, а потом когда загрузятся нужные сборки показывать WPF-ное окно, как сплэшскрин, так например поступает Expression Blend. Но такой вариант имеет смысл, если у вас ещё после инициализации WPF-а происходит загрузка большого количества данных, или использовать как сплэшскрин только WPF-ное окно - это вообще не вариант (мы пробовали это в 4-ом ТЕХНОкоорд-е), поскольку к тому времени, как такой сплэшскрин появится на экране, уже загрузится главное окно приложения.
Сплэшскрин в WPF
А потом появилась бета-версия Microsoft Office 2010, с очень красивым анимированным сплэшскрином, и мне захотелось использовать похожие сплэшскрины в моих приложениях на WPF-е. Поэтому был создан класс ExtendedSplashScreen, который позволяет создавать гораздо более богатые сплэшскрины, чем стандартный WPF-ный SplashScreen. Модифицированная версия этого класса применяется в тестовых сборках ТЕХНОкоорд-а 6.0.

Читать далее...

Рендер под Windows CE


Экспериментальным путём установил, что рендеринг Bitmap-а под Windows CE занимает минимальное время, если формат изображения соответствует формату системы, в большинстве случаев это - 16 бит на цвет по 5-6-5 на компонент. Пришлось допилить библиотечку для работы именно в таком формате, а не в RGB32, как было (впрочем поддержку RGB32 я оставил на всякий случай).
Также написал библиотеку для работы с DirectShow, чтоб проигрывать музыку и, в будущем, видео. Также написал поддержку извлечения тэгов и mp3 и wma файлов, поскольку использовать для этого DirectShow, неудобно и ресурсоёмко.

Деградация и полный упадок


На RSDN-е эпический тред про то, как нарисовать рамочку для выделения ala MS Paint. Такого кретинизма я не видал, наверное, со времён чтения нам в институте курса по программированию под Windows (или как это там называлось). К слову, курсовой, по этому самому программированию под Windows, у меня был клон Paint-а, и рамочки там даже не думали тормозить и моргать. Да что там, у меня на 3-ем пне трёхмерный кубик на весь экран вертелся со скоростью под 30 кадров в секунду, а написан он был на голом GDI, без всяких извращений. А они на GDI+ рамочку без тормозов и морганий не могут вывести. Деградация и полный упадок, RSDN выродился окончательно и бесповоротно.

PS. Всё, на русскоязычные форумы я больше ни ногой, они подрывают моё психическое здоровье и веру в светлое будущее российского программирования.

Windows CE


После покупки в машину проигрывателя основанного на Windows CE, меня самым естественным образом потянуло написать более пристойную оболочку, чем жуткое разноцветное творение китайцев. Поэтому я активно принялся экспериментировать с различными графическими библиотеками под Windows CE. Результат оказался печальным: во-первых 90% библиотек были заточены под Windows Mobile и на CE просто не запускались, а во-вторых у меня на устройстве оказалась настолько урезанная версия Windows CE, что в неё отсутствовал DirectDraw и даже не работали функции WinApi для альфа-блендинга.
Windows CE
Поэтому пришлось написать свою маленькую библиотечку по работе с графикой. Низкий уровень библиотеки написан на C++ (думаю в будущем переписать на ассемблер, но лень пока побеждает), высокий на C#. Идеологически библиотека пытается реализовывать что-то напоминающее M-V-VM, только с огромными ограничениями. По причине неработоспособного DirectDraw, для вывода на экран, используется GDI-шный DrawBitmap, он не очень быстр (подозреваю, что тут дело в неверной битности изображения), но учитывая ориентацию на рендеринг пользовательского интерфейса, производительности должно хватить.
Впрочем хотелось бы добавить каких либо эффектов, но на устройстве очень туго с floating-point операциями, так что похоже придётся обойтись без них, разве что придумаю эффекты работающие в целых числах.