Вот написал небольшое тестовое приложение, цель которого продемонстрировать отрисовку трехмерного объекта средствами Direct3D на фоне прозрачного окна. Т.е. я стремлюсь создать эффект "3D окна" (В данном случае просто кубик). Проблема заключается в том, что при установке темы "Windows Aero" фон окна перестает быть прозрачным. Во всех остальных случаях все работает нормально, в том числе и с темой "Windows Vista - упрощенный стиль". Важный момент: подобного рода проблема возникает только если рисовать в окне средствами Direct3D, если же рисовать через GDI, то все работает нормально! Перерыл всю сеть, нашел лишь одну статью (http://rsdn.ru/article/opengl/layeredopengl.xml) реализующую "3D окно" и успешно работающюю с темой "Windows Aero", но увы там применяется OpenGL... Исходники и бинарник программы в аттаче. Хочу сразу оговориться, с DirectX я сталкиваюсь впервые, а код рисующий вращающийся кубик выдран из какого-то урока. Подскажите в чем причина такого поведения... Заранее большое спасибо!
Udzhen я как-то экспериментировал с такими окнами (тоже с кубом . использовать D3D + WS_EX_LAYERED у меня получилось только рендером в текстуру, а потом из текстуры делал DIB, а потом средствами GDI (WM_PAINT + SetDIBitsToDevice) рисовал окно.
Да, здесь http://rsdn.ru/article/opengl/layeredopengl.xml как раз и описан подобный способ, но только с использованием OpenGL... К сожалнию этот способ мне не подходит по причине его очень медленной работы. Но все равно большое спасибо за сорцы! Кроме того у способа "D3D + WS_EX_LAYERED" есть один очень большой, на мой взгяд, недостаток... Дело в том, что во первых: границы 3D объекта выглядят ступенчато, а использовать штатные средства Direct3D (Antialiasing filter) для устранения этого недостатка не возможно ввиду того, что граница прозрачности определяется по маске. В вторых: объект на фоне рабочего стола выглядит не естественно, т.е. не вписывается в окружение, цветовую гамму и "освещение"... Можно конечно все настроить один раз, но например при смене темы все наши усилия сойдут на нет. Поэтому хотелось бы развернуть наше окно на весь экран, а прозрачным его делать средствами Direct3D. Это нам дает большие приемущества, а в точности: Возможность применить Antialiasing filter для сглаживания границ объекта, возможность рисовать самые разнообразные тени отбрасываемые объектом и возможность так вписать объект в окружающую среду, что он будет выглядеть на фоне GUI Windows естественно (Технология "встраивания" 3D объекта в графическое изображение не однократно описывалась на сайтах посвященных 3D графике). Правда в этом случае есть одна проблемма: как сделать окно прозрачным, тем более которое развернуто на весь экран, и избежать тормозов? У кого какие будут идеи? Интересно узнать, какими средствами винда делает окно прозрачным? Интересует сам механизм. Сейчас курю сорцы win2k, но там такая помойка... P.S. В идеале прозрачное окно развернутое на весь экран должно быть одно, а приложение которое хочет отрисовать свой 3D объект просто должно добавить свой объект к остальным объектам других приложений. В результае чего мы сможем получить красивые визульные эффекты (отражение в одном объекте другого и т.д.)...
У меня есть тупая идея: При любом изменении положения окна сохранять фон под ним и создавать текстуру и затем выводить ее как фон
CnCVK Не сработает, если за окном что-то меняется - пусть GIF открыт. Udzhen Прога из D3D.ZIP без прозрачности вообще (на XP SP2, даже с классической темой) А сделать такую вещь без GDI сложно будет, ИМХО. Просто "прозрачность" областей окна как раз на этом уровне контролируется. А на аппаратном уже только отрисовка. Если фигура простая - можно прогнать точки через матрицы преобразования и установить регион из треугольников, которые получились. Сложная - будет тормозить. Вторая идея хороша, только её бы на уровне ОС сделать :-9 Ступенчатость - тут совсем все плохо. Идея: нарисовать со сглаживанием на ЧЕРНОМ фоне, считать альфа канал, его использовать при UpdateLayeredWindow, а цвет - само собой вывести. Только тормозить будет жутко.
Udzhen Еще один вопрос по теме: Можно ли юзать Direct3D из драйвера? А вопрос очень хороший, но боюсь проффесионала такого уровня даже на этом форуме ты не найдешь