PDA

Просмотр полной версии : Интересная задачка :-) DirectDraw


CyberSubaru
06.03.2011, 19:26
Есть программа. Точнее 2 программы. Они обе рисовали через GDI. Одна все время, другая иногда показывала свое окно и тоже там рисовала.
Основную программу переложил в DirectDraw, полноэкранный режим. Теперь показать окно другой программы стало весьма проблематчино.
Как рисовать на сурфейсах созданного в экзешнике DirectDraw из длл это понятно. А вот как такое сделать из другого экзешника?
Т.е. как из одного экзешника рисовать на сурфейсах в другом экзешнике?
Никто таким не заморачивался?

Virtual
06.03.2011, 20:41
хм....
попробуй начать с получения извне, handle окна куда ты DirectDraw засадил....
рисование в обычных окнах таким макаром прокатывало :).... но имхо хлопотно это :)
проще:
а. обьеденить проги....
если нет возможности то
б. пусть основная прога где фуллскрин.... перехватывает появление чужего окошка и сама его изображение себе в область DirectDraw отрисовывает ;)
(скриншот чужего окна через PrintWindow мона получить ;))

awtoap
06.03.2011, 20:49
Все элементарно...передавайте из второстепенной проги в основную запрос на выдачу ссылки на интерфейс DirectDraw через оконную функцию(через сообщения винды). Потом с этим интерфейсом работаете также как и из основной проги. Или второй вариант пишите DLLку в которой реализован движок вывода и там с помощью функции так же получаете интерфейс. Эту DLL будут юзать основная и второстепенные проги (аля плагины).

CyberSubaru
07.03.2011, 03:53
хм....
попробуй начать с получения извне, handle окна куда ты DirectDraw засадил....
рисование в обычных окнах таким макаром прокатывало :).... но имхо хлопотно это :)
проще:
а. обьеденить проги....
если нет возможности то
б. пусть основная прога где фуллскрин.... перехватывает появление чужего окошка и сама его изображение себе в область DirectDraw отрисовывает ;)
(скриншот чужего окна через PrintWindow мона получить ;))
Какой еще handle окна? :-) ДиректДро рисует напрямую в видеопамять вне зависимости где расположено окно, соотвественно перекрывая результаты всех GDI функций. Делать цикл поиска окна как бы не вариант....

Все элементарно...передавайте из второстепенной проги в основную запрос на выдачу ссылки на интерфейс DirectDraw через оконную функцию(через сообщения винды). Потом с этим интерфейсом работаете также как и из основной проги. Или второй вариант пишите DLLку в которой реализован движок вывода и там с помощью функции так же получаете интерфейс. Эту DLL будут юзать основная и второстепенные проги (аля плагины).

wm_copydata. Знаю. Только один нюанс. Адресные пространства разных процессов разные и во втором процессе указатель на интерфейс, объявленный в первом процессе, будет ссылаться в никуда. Тоже самое с длл, подгружаемой из разных процессов.

CyberSubaru
07.03.2011, 04:33
Важно то, что программы должны работать раздельно. Впринципе есть идейка.

Virtual
07.03.2011, 09:20
ну раз обе проги твои, то самое логичное это придумать какой либо апи по обмену данными, а рисовать из двух мест это как одеяло перетягивать :).

CyberSubaru
07.03.2011, 19:40
Я ж грю - есть идея как это реализовать. Ток как правило сначала надеешься, что кто-то уже делал подобный ход и есть где слизать :-)))))

Virtual
07.03.2011, 21:30
сколько подобных задачек возникало.... всегда приходил к выводу что надежней пробрасывать исходные данные.... иль через сообщения иль пайпами... а гуем пусть занимется кто-то один :).... кстати такой подход когда источник данных отдельно а гуй отдельно....приводит к универсальности ;).... нужен гуй пожалуйсто.... не нужен ну и фиг с ним :). (вроде гдет валялись наработки с подобной задачкой.... сервис и гуй к нему отдельный.)

CyberSubaru
08.03.2011, 05:14
Плагины то у меня сами рисуют))) Ибо там проще! Передаешь указатель на сурфейс и рисуй! ))

CyberSubaru
02.04.2011, 06:23
Перешел на D3D :-)

CyberSubaru
03.04.2011, 05:13
Вопрос такой....
А как в 3Д-гонках реализуется перемещение?
Передвижением камеры по готовой "местности" или камера стоит на месте и передвигается "местность", путем уничтожения пройденных объектов и созданием новых? Или и так и так?