Как работать с оверлеями в DDraw??? Я читал книгу (Трухильо 98-го года...) там всё более-менее описано, но вот тольк не про оверлеи. Я попробовал сам, но ничего не вышло. Вроде бы все поверхности нормально создаются, а вот при попытки обращения к ним я получаю FAULT. Моя видеокарта поддерживает работу с оверлеями - это точно. Я приложил исходник (я этот пример вытянул из нета и немного модифицировал), надеюсь, что там всё понятно. То есть, если всё пройдёт нормально, сверху у экрана должен появиться белый прямоугольник размером 1024х30. Если кому интересно почему же именно оверлей... просто я хотел рисовать поверх всех окон и чтобы это всё не моргало. Я пробовал сначала синхронизировать с развёрсткой, но ничего хорошего из этого не получилось. Вот если бы WaitForVerticalBlank действительно поддерживала нотификацию по эвенту, то тогда это может быть и сработало. Кстати, может кто-нибудь знает, зачем в функции объявлять возможность нотификации по эвенту, а потом ниже писать, что пока они это не доделали. И делают они, уже судя по всему, восемь версий директ икса . Потом решил блокировать нужную часть экрана, но не помогло, моё окно действительно не рисуется в залоченой части, а вот остальные приложения рисуют в неё совершенно свободно. И ещё один вопрос - Может кто-нибудь знает, что надо передовать в Unlock в седьмой версии DD? Раньше был лпвоид, а теперь лпрект. У меня, конечно есть предположение, что надо передовать тот же рект, который мы передовали функции Lock. Просто хотелось бы ясности. Может кто-нибудь знает хорошие книги по DDRAW??? Что-то я в гугле не натолкнулся (честно говоря, я недолго искал...). Я бы с удовольствием их почитал. P.S.: Но вот выводят же как-то Fraps и ATi Tray Tools фпс и ничего не моргает при этом. Я смотрел, ати трай тулз перехватыват GetProcAdress и ещё чего-то. Хотелось бы найти более легкий способ, без хуков.
Fraps хукает. Например если вместо ID3DDevice9::Present использовать ID3DDevice9::PresentEx, то он обламывается. Я оверлеи не юзал, но вот рабочий пример:DDraw Overlay
Спасибо за ссылку, посмотрел исходник и слегка его переделал (там стл и всякие бяки вроде классов) и что самое удивительное всё заработало! Выводит изображение даже поверх игр!!! Хотя не на всех играх стабильно работает. Вот в CNQ (доработанный клиент Q3) пашет без проблем, а в контре 1.6 не работает, наверно потому, что теряется сурфейс. Просто я перенёс не весь код из примера, а только самое нужное, потом как-нибудь допишу, чтобы нормально работало. Единственное, что меня огорчает, так это то, что на моей видеокарте максимальное количество оверлеев равно единице... и она поддерживает прозрачность только по колор кею, а вот альфа прозрачность осталась за бортом . Интересно, а зачем Фрапс и иже с ним перехватывают дохрена апи, если можно выводить фпс в оверлее? Накодить такое намного проще и к тому же не надо никаких грязных хуков. Единственное что меня бы могло остановить от вывода фпс в оверлее - это скорость. Неужели вывод в оверлее будет медленней??? Мне кажется, что всё должно быть наоборот, ведь не надо восстанавливать фон и всё такое....
Выводить то можно. Но во первых надо как-то считать кадры, а во вторых если приложений несколько? И восстанавливать фон не надо, надо просто рисовать на заднем буфере перед переключением или копированием.
Не знаю как в последних версиях Fraps, но до этого он просто сплайсил d3d**.dll, в частности создание Direct3D Create, после чего при каждом вызове Present лочил BackBuffer и на основе прошедшего числа кадров рисовал свои циферки поверх всего. Причем делал это незамысловатым способом в виде очистки прямоугольниками нужного размера (несколько десятков пикселей) и нужного цвета BackBuffer. Итого на цифру там у него выходила колбаса из массива координат в виде четырех или пяти прямоугольников на цифру, которые он и передавал на вход Clear.