Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как вывести текст в чужое Direct3D приложение? 
:(
    Опции темы
Attack
Дата 5.4.2007, 07:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 20.7.2006

Репутация: нет
Всего: нет



Собственно в названии всё сказано...
Вообщем необходимо написать слово в DirectX или OpenGL(лучше DX, или в обоих )).
Желателен пример кода, так как я всё таки новичок в этом =)
PM   Вверх
Notreg
Дата 29.4.2007, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 10.1.2007

Репутация: нет
Всего: нет



Для начала тебе нужно организовать ссылку на контекст устройства.
Тип такой величины - hdc (Handle Device Context, ссылка на контекст устройства), значение ее можно получить вызовом функции API GetDC с аргументом-ссылкой на устройство вывода.
В качестве аргумента указать ссылку на окно (запомни нужное тебе окно).
После получения ссылки на контекст устройства обращаемся собственно к функции, которая нам будет херячить текстовые символюхи прямо на контексте устройства (в данном случае на твоем не опознанном окошеке, как ты там его называешь D3D или OpenGL).
Первым аргументом этой функции является ссылка на контекст устройства.
После использования ссылки ее необходимо освободить, а в конце работы приложения - удалить для освобождения памяти.

Нарисовали кляксу(в твоем случае текст) на окне form1 класса tform1:
Код

procedure TForm2. Button2Click(Sender: TObject); 
var
dc: HDC; 
Window: HWND;
begin
Window: = FindWindow ('TForml', 'Forml'); If Window <> 0 then begin // окно найдено
dc: = GetDC (Window); // ссылка на найденное окно
Rectangle (dc, 10, 10, 110, 110); // квадрат на чужом окне 
ReleaseDC (Window, dc); // освобождение ссылки
DeleteDC (dc); // удаление ссылки
end; 
end;

Это реальное решение не реальной проблемы, как может оказаться не попашит.
Можешь купить исходник проги fraps, на сайте fraps.com, и посмотреть как они это сделали, а вообще издеваться над игрушками(особенно не твоими, особенно ради выгоды не респект).
Да простит меня модератор.
--------------------
Надежна лишь смерть, жизнь - нет.
PM MAIL   Вверх
Attack
Дата 30.4.2007, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 20.7.2006

Репутация: нет
Всего: нет



Notreg, спасибо, но есть одно НО:
D3D или OpenGL приложение постоянно отрисовывается, сного, сного и сного...
и получаеться, что то изображение, которое я нарисовал моментально перекроется,
а потоянно отрисовывать(в цикле скажем) это очень сложная для процессора задача ((
Мне кажеться, что необходимо как то внедриться в 3D приложение и уже рисовать поверх его каждого фрема.
Но как это сделать я незнаю =(
PM   Вверх
Notreg
Дата 30.4.2007, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 10.1.2007

Репутация: нет
Всего: нет



Похоже на правду, так как fraps считает количество кадров в секунда, да еще и avi пишет с заданным количеством кадоров, то естественно эта прога имеет доступ к отрисованным фреймам. Сразу вопрос на каком уровне это делается, врядли fraps внедряется в D3D приложение (ведь к каждому приложению нужен свой подход). Может fraps пасет это дело уже на уровне воспроизведения системными файлами отвечающими за D3D и openGL. 
--------------------
Надежна лишь смерть, жизнь - нет.
PM MAIL   Вверх
Notreg
Дата 1.5.2007, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 10.1.2007

Репутация: нет
Всего: нет



Код

procedure TForm1.Timer1Timer(Sender: TObject);
var i:integer;ScreenDC: hDC;
begin
application.ProcessMessages;

//текст

TextOut(GetWindowDC(GetDesktopWindow),(screen.Width div 2)-4, (screen.Height div 2)-8,'X',1);

//точка

ScreenDC := GetDC(0); {получить контекст экрана}
Ellipse(ScreenDC,(screen.Width div 2)-4, (screen.Height div 2)-5,(screen.Width div 2)+5, (screen.Height div 2)+4); {нарисовать}
ReleaseDC(0, ScreenDC); {освободить контекст}
end;

end;

Наблюдается мерцание, конечно, но проц не нагружен, так как использую таймер. Если еще к тому же действия в таймере провернуть в цикле, то уже 3 оборота, нагружают проц. 
--------------------
Надежна лишь смерть, жизнь - нет.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0814 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.