Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

Рисование на DirectX\OpenGL приложениях

Аллоха, All!
А я вот щас как сморожу очередную глупость:

Как осуществить рисование на DirectX\OpenGL канвасе другого
приложения?
Сейчас рисую так:
function DrawConnectionStatus: integer;
begin
ptaArray[0].PAnsiChar := @ConnectStatus;
ptaArray[0].n := lstrlen(ConnectStatus);

ptaArray[1].PAnsiChar := @TimeString;
ptaArray[1].n := lstrlen(TimeString);
DC := GetDC(0);
try
SetBkMode(DC, OPAQUE);
SetBkColor (DC, BkColor);
SetTextColor(DC, Color);
SetMyFont;
PolyTextOut(DC, ptaArray, 2);
Result := 1;
finally
ReleaseDC(0, DC);
end;
end;

все это дело крутиться по SetTimer-у
Но это сильно мерцает, т.к. рисует поверх всех программ и постоянно
перерисовывается этим самым приложением.
А как рисовать на самом канвасе?
Например так рисует FPS и т.п. прога 3DAnalyze (и на DirectX, и на
OpenGL), в нем, как я понял, используется какая-то hook dll.

Ответить   Tue, 29 Mar 2005 16:09:42 +0600 (#341759)

 

Ответы:

Glad to greet, Александр!

You seem to have written (Tuesday, March 29, 2005):

Полазай по сайту Fraps-а (кажется, www.fraps.com). В архиве лежит док,
вот маленькая выдержка:

"Hooking is currently performed on separate functions for DirectDraw,
Direct3D8, and OpenGL. These are:
Flip (for DirectX 7 and earlier - DDRAW.DLL)
Present (for DirectX 8 D3D8.DLL)
wglSwapBuffers (for OpenGL)
Note that DirectX is class based. This means that Flip and Present are
not exported from the DLL directly. You must take the parent class and
obtain the function pointers directly from an offset within the class
(or subclasses). Consult the header files in the DX SDK in order to
determine the offsets of the function pointers."

Также он тебе может предоставить свои функции (опять выдержка):

Type
tFrapsData = Record
sizeOfStruct : dword;
currentFPS : dword;
totalFrames : dword;
timeOfLastFrame : dword;
gameName : Array[0..29] of Char;
End;
pFrapsData = ^tFrapsData;

Var
frapsDLLBase : tHandle;
frapsDataGet :Function:pFrapsData;StdCall;
x : pFrapsData;

begin
Memo1.Lines.Clear;
frapsDLLbase := GetModuleHandle('FRAPS.DLL');
if (frapsDLLbase = NULL) or (FrapsDLLBase=0) Then Begin
Memo1.Lines.add('Fraps not running!');
Exit;
End;

FrapsDataGet := GetProcAddress(frapsDLLbase,'FrapsSharedData');
If not Assigned(FrapsDataGet) Then Begin
Memo1.Lines.add('Needs Fraps 1.9C or later!');
Exit;
End;

Memo1.Lines.add('Fraps running');
x := FrapsDataGet;
With x^ Do Begin
memo1.Lines.Add('Size:'+IntToStr(sizeOfStruct));
memo1.Lines.Add('FPS:'+IntToStr(currentFPS));
memo1.Lines.Add('Total frames:'+IntToStr(totalFrames));
memo1.Lines.Add('Last time:'+IntToStr(timeOfLastFrame));
memo1.Lines.Add('Name:'+gameName);
End;
End;

Alles Gute!

...In Code We Trust...

Ответить   Mon, 4 Apr 2005 13:03:07 +0400 (#344818)

 

Хаю ду ю ду Denis Kravtsoff?

Смотрю и вижу, как ты печатаешь умные вещи и дай-ка, думаю,
тоже что-нибудь напечатаю:

Спасибо, посмотрю.

Ответить   Mon, 4 Apr 2005 23:08:29 +0600 (#345127)