Консультация № 84850
30.04.2007, 17:27
0.00 руб.
0 1 1
Здравствуцте уважаемые эксперты.
У меня к вам пара вопросов:
1)У меня возникли вопросы по выводу текста в Direct3D9
Знаю что это делается с помощью функций D3DXCreateFont и DrawTextA
интерфейса IDirectFont9(вроде бы). А вот как этими функциями
пользоваться я понять немогу.
2)Незнаете где можно скачать справочные файлы из DirectX SDK, вся SDK не нужна(так как я программирую на Делфи и пользуюсь заголовочными файлами JEDI) да и трафика не хватит на всю SDK.
Спасибо за внимание!☺

Обсуждение

Неизвестный
01.05.2007, 17:23
общий
это ответ
Здравствуйте, _Alex_!
Для вывода текста в Direct3D используется интерфейс ID3DXFont библиотеки D3DX. Этот интерфейс выводит текст с помощью
GDI и его применение может значительно уменьшить быстродействие приложения.

(1) Инициализация ID3DXFont

Для инициализации интерфейса используется функция D3DXCreateFontIndirect.

function D3DXCreateFontIndirect(
pDevice: IDirect3DDevice9; // устройство которое будет связано со шрифтом
const pLogFont: TLogFont; // Структура описания шрифта
out ppFont: ID3DXFont // возвращает интерфейс ID3DXFont
): HResult; stdcall; external d3dx9coreDLL;
Для описания шрифта используется структура TLogFont которая предоставляется GDI.

tagLOGFONTA = packed record
lfHeight: Longint; // Высота в логических единицах
lfWidth: Longint; // Ширина в логических единицах
lfEscapement: Longint; // угол вывода
lfOrientation: Longint; // угол вывода
lfWeight: Longint; // Насыщенность, диапозон от 0(тонкий) до 1000(жирный)
lfItalic: Byte; // если TRUE то шрифт будет курсивным
lfUnderline: Byte; // если TRUE то шрифт будет подчеркнутым
lfStrikeOut: Byte; // если TRUE то шрифт будет зачеркнутый
lfCharSet: Byte; // набор символов (DEFAULT_CHARSET см. справку по GDI)
lfOutPrecision: Byte; // качество вывода (можно ноль, см. справку по GDI)
lfClipPrecision: Byte; // качество обрезки (можно ноль, cм. справку по GDI)
lfQuality: Byte; // качество вывода ( можно ноль, см. справку по GDI)
lfPitchAndFamily: Byte; // Шаг и Семейство шрифта (можно ноль, см. справку по GDI)
lfFaceName: array[0..LF_FACESIZE - 1] of AnsiChar; // имя шрифта
end;

(2) Вывод текста

После того как интерфейс инициализирован можно перейти к выводу текста для этого используется метод ID3DXFont.DrawTextA

function DrawTextA(
pString: PAnsiChar; // Выводимая строка
Count: Integer; // кол-во отображаемых символов строки. можно -1
const pRect: TRect; // область экрана в которой будет отображаться текст
Format: DWord; // Флаги форматирования текста DT_LEFT,DT_RIGHT и.т.д
Color: TD3DColor // Цвет текста
): Integer; stdcall;

справку по структуре TLogFont можно посмотреть тут: http://msdn2.microsoft.com/en-us/library/ms533931.aspx

Приложение:
program Sample;uses Windows,Messages, D3DX9, Direct3D9;{$R *.res}varwcex:WNDCLASSEX;Handle:HWND;d3d:IDirect3D9;d3dDevice:IDirect3DDevice9;pp:TD3DPresentParameters;Msg:tagMSG;d3dFont:ID3DXFont;procedure InitFont; // Здесь инициализируем шрифтvarLogFnt:TLogFont;begin ZeroMemory(@LogFnt,sizeof(LogFnt)); LogFnt.lfHeight:=20; LogFnt.lfWidth:=20; LogFnt.lfWeight:=500; LogFnt.lfStrikeOut:=1; LogFnt.lfCharSet:=DEFAULT_CHARSET; LogFnt.lfFaceName:=‘Times New Roman‘; LogFnt.lfOutPrecision:=100; D3DXCreateFontIndirect(d3dDevice,LogFnt,d3dFont); if d3dFont=NIL then MessageBox(0,‘Cannot Create Font‘,NIL,MB_OK);end;function WndProc(Handle:HWND;msg:UINT;wPrm:WPARAM;lPrm:LPARAM):LRESULT;stdcall;var ps:PAINTSTRUCT; rect:TRECT;begin case msg of WM_PAINT:begin BeginPaint(Handle,ps); D3DDevice.BeginScene; D3DDevice.Clear(0,0,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,255),0,0); rect.Left:=0; rect.Top:=0; rect.Right:=300; rect.Bottom:=100; if (d3dFont <> NIL) then d3dFont.DrawTextA(‘Sample Text‘,-1,rect,DT_LEFT,D3DCOLOR_XRGB(255,0,0)); // выводим шрифт форматируя по левой стороне D3DDevice.EndScene; D3DDevice.Present(0,0,0,0); EndPaint(Handle,ps); InvalidateRect(Handle,NIL,TRUE); WndProc:=0; end; WM_DESTROY: begin PostQuitMessage(0); WndProc:=0; end; else begin WndProc:=DefWindowProc(Handle,msg,wPrm,lPrm);end; end;end; begin ZeroMemory(@wcex,sizeof(wcex)); wcex.cbSize:=sizeof(wcex); wcex.lpszClassName:=‘Sample Class‘; wcex.hInstance:= hInstance; wcex.lpfnWndProc:=@WndProc; wcex.style:=CS_OWNDC or CS_HREDRAW or CS_VREDRAW; RegisterClassEx(wcex); Handle:=CreateWindowEx(0,‘Sample Class‘,‘Sample‘,WS_OVERLAPPEDWINDOW,0,0,640,480,0,0,wcex.hInstance,0);if Handle=0 then MessageBox(0,‘Cannot Create Main Window‘,0,MB_OK)else begin ZeroMemory(@pp,sizeof(pp)); pp.BackBufferFormat:=D3DFMT_UNKNOWN; pp.SwapEffect:=D3DSWAPEFFECT_DISCARD; PP.Windowed:=TRUE; PP.hDeviceWindow:=Handle; d3d:=Direct3DCreate9(D3D_SDK_VERSION); if D3D=NIL then MessageBox(0,‘Cannot Create Main Window‘,0,MB_OK) else begin d3d.CreateDevice(0,D3DDEVTYPE_HAL,Handle,D3DCREATE_SOFTWARE_VERTEXPROCESSING,@PP,D3DDevice); if D3DDevice=NIL then MessageBox(0,‘Cannot Create Main Window‘,0,MB_OK) else begin InitFont; ShowWindow(Handle,SW_NORMAL); UpdateWindow(Handle); end; while(GetMessage(Msg,0,0,0)) do begin TranslateMessage(Msg); DispatchMessage(Msg); end; end;end;UnregisterClass(‘Sample Class‘,wcex.hInstance);end.
Форма ответа