Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2 3  Все   Вниз
  Печать  
Автор Тема: Вывод текста в DirectX 9  (Прочитано 92018 раз)
0 Пользователей и 1 Гость смотрят эту тему.
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« : 23-02-2009 22:50 » 

Начал учится выводить текст на экран по книге Станислава Горнакова "DirectX 9: Уроки программирования на С++".
У него в главе одни ошибки я их поправил как писали в интернете всё равно ошибки.

У меня есть ещё книга Алена Торна "Графика в формате DirectX 9: Поолное руководство по использованию 3D-пространства", но там к сожалению нет главы посвещённой выводу текста.

Что же я не так сделал?

Прикрепляю архив Text.rar с двумя файлами:
1. Text_Original.cpp текст кода из книги (в интернете говорят там много всего неправельно)
2. Text.cpp текст кода из книги переделанный по совету из интернета и адаптирован под builder
3. error.jpg - PrintScreen ошибок

* test.rar (82.28 Кб - загружено 1015 раз.)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 24-02-2009 15:40 » 

HFONT - это обычный апишный фонт, может просто достать  контекста HDC да рисовать текст как обычно ? Улыбаюсь Должна быть где то функция для достатия контекста
Записан

RXL
Технический
Администратор

ru
Online Online
Пол: Мужской

WWW
« Ответ #2 : 24-02-2009 16:15 » 

Леш, что там? Расскажи для ленивых, кому не хочется качать проект. Улыбаюсь
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 24-02-2009 17:48 » 

эхъ, знал бы я ещё, про что рассказывать Улыбаюсь

но вот прототип нашёл.
zuze, у тебя в Text_Original.cpp такая строка обламывается
   D3DXCreateFont(pDirect3DDevice, hFont, &pFont);
а параметры должны быть такие

        LPDIRECT3DDEVICE9       pDevice, // 3Dдевайс
        INT                     Height,
        UINT                    Width,
        UINT                    Weight,
        UINT                    MipLevels,
        BOOL                    Italic,
        DWORD                   CharSet,
        DWORD                   OutputPrecision,
        DWORD                   Quality,
        DWORD                   PitchAndFamily,
        LPCSTR                  pFaceName,
        LPD3DXFONT*             ppFont);

по аналогии с GDI-шной CreateFontIndirect ,

typedef struct tagLOGFONT {
  LONG lfHeight;
  LONG lfWidth;
  LONG lfEscapement;
  LONG lfOrientation;
  LONG lfWeight;
  BYTE lfItalic;
  BYTE lfUnderline;
  BYTE lfStrikeOut;
  BYTE lfCharSet;
  BYTE lfOutPrecision;
  BYTE lfClipPrecision;
  BYTE lfQuality;
  BYTE lfPitchAndFamily;
  TCHAR lfFaceName[LF_FACESIZE];
} LOGFONT, *PLOGFONT;

zuze, найди описание структуры  LOGFONT, цитировать из мсдн там много
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #4 : 24-02-2009 21:32 » 

Да строка

Код:
D3DXCreateFont(pDirect3DDevice, hFont, &pFont);

не подходит, так как такая строка используется в DirectX 9.0b, а у меня DirectX 9.0c
Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #5 : 24-02-2009 22:07 » 

Странно у меня DirectX 9.0c, а функция D3DXCreateFont содержин не 12, а 3 параметра.

Это я узнал из того что компилятор начал выдавать ошибки с надписью HFONT.

Надеюсь я заполню структуру HFONT правельно и текст наконец-то начнёт выводится на экран.

Прикрепляю файл с ошибками их стало намного меньше.

* error.JPG (52.25 Кб - загружено 1065 раз.)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 25-02-2009 04:26 » 

HFONT - это не структура, а хендл

лучше покажи строчку, на которую ругается, а также текст ругани
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #7 : 25-02-2009 07:59 » 

Вот код

Код:
// Глобальные переменные
LPD3DXFONT pFont = NULL;//указатель на интефейс, отвечающий за работу со шрифтом
RECT myRect;            //переменная, которая будет задавать область вывода на экран

void MyTextOut(char *TextString, long x1, long y1, long x2, long y2, D3DCOLOR TextColor)
{
   // инициализация шрифта
   if(pFont == NULL)
     D3DXCreateFont(pDirect3DDevice, 20, 0, FW_NORMAL, 1, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, ANTIALIASED_QUALITY, DEFAULT_PITCH | FF_DONTCARE, TEXT("Times New Roman"), &pFont);
   // координаты прямоугольнка
   myRect.left   = x1;
   myRect.top    = y1;
   myRect.right  = x2;
   myRect.bottom = y2;
   // Вывод текста
   pFont->DrawText(TextString, -1,&myRect, DT_CENTER, TextColor);
}

Вот что выдаёт компилятор

C:\borland\bcc55\bin>bcc32 -tW -w- Text.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
Text.cpp:
ERROR E2034 Text.cpp 235: Cannot convert 'int' to 'HFONT__ *' in function MyTextOut(char *, long, long, long, long, unsigned long)
ERROR E2342 Text.cpp 235: Type mismatch in parameter 'hFont' (wanted 'HFONT__ *', got 'int') in function MyTextOut(char *, long, long, long, long, unsigned long)
ERROR E2227 Text.cpp 235: Extra parametr in call to __stdcall  D3DXCreateFont(IDirect3DDevice9, HFONT__ *, ID3DXFont **)  in function MyTextOut(char *, long, long, long, long, unsigned long)
*** 3 errors in Compile ***

C:\borland\bcc55\bin>

На всякий случай рикрепляю полный текст

* Text.cpp (16.99 Кб - загружено 1194 раз.)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 25-02-2009 08:21 » 

Цитата
Type mismatch in parameter 'hFont' (wanted 'HFONT__ *', got 'int')
почему то ругань на указатель , почему - не понимаю ((.

может привести насильно -

(HFONT*)&pFont
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #9 : 25-02-2009 16:15 » 

Открыл посмотреть файл d3dx9core.h нашёл функцию D3DXCreateFont у неё три параметра

Вот код

Код:
#ifdef __cplusplus
extern "C" {
#endif //__cplusplus

HRESULT WINAPI
    D3DXCreateFont(
        LPDIRECT3DDEVICE9   pDevice,
        HFONT               hFont,
        LPD3DXFONT*         ppFont);

А во многих примерах в интернете это функция с 12 параметрами это очень странно.

Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #10 : 25-02-2009 16:39 » 

Побробовал сделать иначе, как написано в книге Франка Луны - Введение в программирование трехмерных игр с DX9

Код

Код:
// Глобальная переменная
LPD3DXFONT pFont = NULL;//указатель на интефейс, отвечающий за работу со шрифтом
void MyTextOut(char *TextString, long x1, long y1, long x2, long y2, D3DCOLOR TextColor)
{
   RECT myRect;            //переменная, которая будет задавать область вывода на экран
   LOGFONT lf;
   ZeroMemory(&lf, sizeof(LOGFONT));
   lf.lfHeight    = 25;    // в логических единицах
   lf.lfWidth     = 12;    // в логических единицах
   lf.lfWeight    = 500;   // насыщенность, диапазон 0(тонкий) - 1000(жирный)
   lf.lfItalic    = false;
   lf.lfUnderline = false;
   lf.lfStrikeOut = false;
   lf.lfCharSet   = DEFAULT_CHARSET;
   lstrcpy(lf.lfFaceName, "Times New Roman"); // гарнитура шрифта

   D3DXCreateFontIndirect(pDirect3DDevice, &lf, &pFont);

   
   // координаты прямоугольнка
   myRect.left   = x1;
   myRect.top    = y1;
   myRect.right  = x2;
   myRect.bottom = y2;
   // Вывод текста
   pFont->DrawText(TextString, -1,&myRect, DT_CENTER, TextColor);
}

Возникает такая ошибка

C:\borland\bcc55\bin>bcc32 -tW -w- Text.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
Error: Unresolved external 'D3DXCreateFontIndirect' referenced from C:\BORLAND\BCC55\BIN\TEXT.OBJ

Что же опять не так?
Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #11 : 25-02-2009 22:45 » 

У меня подключено

Код:
#include <windows.h>
#include <d3d9.h>
#include <d3dx9.h>
#include <d3dx9core.h>
#include <math.h>

#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")


Думал не работает из-за того что не подключил gdi.

Добавил

Код:
#include  <wingdi.h>
#pragma comment(lib/psdk, "gdi32.lib")

Не помогло.

Я склоняюсь к тому что нужно подключить библиотеку вопрос какую?
Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #12 : 26-02-2009 10:07 » 

Я использовал файлы DirectX 9 с сайта www.clootie.ru, ту узнал что они плохие.

В связи с этим у меня два маленьких вопросика:

1. Действительно файлы DirectX 9 с сайта www.clootie.ru плохие?
2. Если у Microsoft-а компилятор похожий на Borland C++ 5.5 Builder [67МБ](т.е. такой-же маленький)?
« Последнее редактирование: 02-03-2009 18:35 от RXL » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #13 : 26-02-2009 16:55 » 

zuze, что значит - плохие файлы DirectX 9 ?

Качай с мелкософтовского сайта SDK - и вперёд Улыбаюсь
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #14 : 26-02-2009 17:02 » 

Для того чтобы правельно работал настроил DirectX 9 для Borland надо сделать:

1. Установка компилятора Borland C++ 5.5
2. Установка DirectX 9 SDK
3. Изменить строчки в файле bcc32.cfg на эти
-I"c:\DXSDK\include";"c:\Borland\Bcc55\include"
-L"c:\DXSDK\lib";"c:\Borland\Bcc55\lib"
4. Изменить строчки в файле ilink32.cfg на эти
-L"c:\DXSDK\lib";"c:\Borland\Bcc55\lib"
5. Файлы из папки CBuilder_DX92_libs скопировать в c:\DXSDK\lib
(CBuilder_DX92_libs.zip можно скачать с сайта www.clootie.ru)
6. Файлы из папки Clootie_DX92_dlls скопировать в c:\windows\system32 и c:\DXSDK\lib
(Clootie_DX92_dlls.zip можно скачать с сайта www.clootie.ru)
7. Создание файла с расширением *.c или *.cpp

#ifndef _MSC_VER
#define sqrtf (float)sqrt
#endif

// в этом файле лежат все функции WinAPI
#include <windows.h>
// подключаем заголовочный файл DirectX 9 SDK
#include <d3d9.h>
// заголовочный файл с матричными функциями
#include <d3dx9.h>

#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")

void main(void)
{
     
}
8. Компиляция
bcc32 -tW -w- <имя файла>.cpp
Если не хотим видеть предупреждения, то ставим параметр  -w-
Создание Windows приложения -tW

Оригинальная статья на английском языке
http://www.sorgonet.com/modules.php?name=News&file=article&sid=117
« Последнее редактирование: 02-03-2009 18:35 от RXL » Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #15 : 27-02-2009 03:08 » 

Перешёл на Microsoft Visual C++ 6 и текст начал выводится как написано в книге  Франка Луны - "Введение в программирование трехмерных игр с DX9".

Обнаглела администрация сайта www.clootie.ru раздают некоректно работающие файлы, а люди мучаются.

Только я одного понять не могу зачем нужно при использовании функции timeGetTime​ подключать библиотеку
#pragma comment(lib, "winmm.lib"), а если не подключать библиотеку, то при запуске программы возникает ошибка text.obj : error LNK2001: unresolved external symbol __imp__​timeGetTime@0, я её в компиляторе borland не подключал она и так работала, да и во многих примерах для Microsoft Visual не написано про это.

Если кто знает поясните пожалуйста этот момент?

И ещё один маленький вопросик, извините если немного не в тему

Как правельно компилировать и создавать исполняемый файл на Visual C++ 6 в командной строке?
« Последнее редактирование: 02-03-2009 18:35 от RXL » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #16 : 27-02-2009 05:08 » 

Цитата
Как правельно компилировать и создавать исполняемый файл на Visual C++ 6 в командной строке?
зачем тебе командная строка ? Прямо в среде всё делай , для релиза выбери Release режим
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #17 : 27-02-2009 14:00 » 

Вот у меня тут вопросик в тему возник

Вот есть строка

Код:
 
// Вывод текста
pFont->DrawText(TextString, -1,&myRect, DT_CENTER, TextColor);

Второй параметр говорит о том чтобы длинну строки вычисляла функция DrawText автоматически.

А если сюда вбить точное значение размера длины строки будет ли программа работать намного быстрее или это не принципиально?  
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #18 : 28-02-2009 09:29 » 

при работе с HDC размер строки определяется при помощи GetTextExtentPoint, потом в прямоугольнике выводится текст. То есть, это всё равно что два раза текст напечатали, только первый раз не вывели на экран. Думаю, тут то же самое
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #19 : 28-02-2009 09:56 » 

Я имел ввиду слудующие, покажу на примере.
Код:
TextString = "Hello";
длина строки 5 и я делаю так
Код:
pFont->DrawText(TextString, 5, &myRect, DT_CENTER, TextColor);
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #20 : 28-02-2009 10:06 » 

pFont->DrawText(TextString, ::strlen(TextString), &myRect, DT_CENTER, TextColor);

думаю, при -1 там та же функция вызовется
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #21 : 28-02-2009 11:33 » 

А если тупо в место ::strlen(TextString) написать 5 будет ли намного быстрее или нет?
Ведь тогда не вычисляется длина, а она заложенна как константа.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #22 : 28-02-2009 13:19 » 

zuze, это негибко, и лазейка для вирусов.
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #23 : 28-02-2009 14:30 » 

Если текст меняется, а следовательно и его длина, то это конешно плохо ставить значение длины текста в виде константы, это как ты сказал негибко и лазейка для вирусов (основанные на переполнение буфера), но если текст не меняется, а следовательно и его длина, то я думаю можно задать длину текста в виде константы и скорость выполнения программы будет быстрее.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #24 : 28-02-2009 17:07 » 

если и будет быстрее, то настолько незаметно, что оно не стоит того (особенно на фоне ухудшения безопасности и устойчивости программы) Улыбаюсь
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #25 : 28-02-2009 17:33 » 

Вот это я и хотел узнать, я наверно плохо объяснил по этому мы так долго и проковырялись с этим очень маленьким вопросом.

Теперь всё понятно.
Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #26 : 28-02-2009 17:39 » 

Если можешь Алексей1153++ посмотри пожалуйста мою тему "Несколько вопросов по поводу Visual C++" в разделе  "...>Программирование > С/С++ > WinAPI & Visual C++" и дай пожалуйста ответ на вопросы я в этой теме не мог задать эти вопросы так как они не потеме, хотя один третьий вопрос уже был в этой теме и я пока на него ответа не получил. Я пока не получил там ни одного ответа.

Заранее спасибо!!!
Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #27 : 13-03-2009 09:34 » 

Хотел вращать выводимый текст по оси X, но что то не получается.

Функция вывода текста на экран

Код:
void MyTextOut(char *TextString, long x1, long y1, long x2, long y2, D3DCOLOR TextColor)
{   
   RECT myRect;            //переменная, которая будет задавать область вывода на экран
   LOGFONT lf;

   ZeroMemory(&lf, sizeof(LOGFONT));
   lf.lfHeight    = 25;    // в логических единицах
   lf.lfWidth     = 12;    // в логических единицах
   lf.lfWeight    = 500;   // насыщенность, диапазон 0(тонкий) - 1000(жирный)
   lf.lfItalic    = false;
   lf.lfUnderline = false;
   lf.lfStrikeOut = false;
   lf.lfCharSet   = DEFAULT_CHARSET;
   lstrcpy(lf.lfFaceName, "Times New Roman"); // гарнитура шрифта

   D3DXCreateFontIndirect(pDirect3DDevice, &lf, &pFont);
   
   // координаты прямоугольнка
   myRect.left   = x1;
   myRect.top    = y1;
   myRect.right  = x2;
   myRect.bottom = y2;
   // Вывод текста
   pFont->DrawText(TextString, -1,&myRect, DT_CENTER, TextColor);
}

Хотел в этой же функции сделать вращение по оси Х сделал так, но текст не вращается

Код:
void MyTextOut(char *TextString, long x1, long y1, long x2, long y2, D3DCOLOR TextColor)
{   
   RECT myRect;            //переменная, которая будет задавать область вывода на экран
   LOGFONT lf;
   D3DXMATRIX MatrixWorld;

   ZeroMemory(&lf, sizeof(LOGFONT));
   lf.lfHeight    = 25;    // в логических единицах
   lf.lfWidth     = 12;    // в логических единицах
   lf.lfWeight    = 500;   // насыщенность, диапазон 0(тонкий) - 1000(жирный)
   lf.lfItalic    = false;
   lf.lfUnderline = false;
   lf.lfStrikeOut = false;
   lf.lfCharSet   = DEFAULT_CHARSET;
   lstrcpy(lf.lfFaceName, "Times New Roman"); // гарнитура шрифта

   D3DXCreateFontIndirect(pDirect3DDevice, &lf, &pFont);

   // Поворот текста
   D3DXMatrixRotationX(&MatrixWorld, 1.57f);
   pDirect3DDevice->SetTransform(D3DTS_WORLD, &MatrixWorld);
   
   // координаты прямоугольнка
   myRect.left   = x1;
   myRect.top    = y1;
   myRect.right  = x2;
   myRect.bottom = y2;
   // Вывод текста
   pFont->DrawText(TextString, -1,&myRect, DT_CENTER, TextColor);
}

Помогите пожалуйста понять, что нужно сделать чтобы текст начал вращатся?

На всякий случай пикрепляю полный код, необращайте внимание на то что у меня в коде описано кроме текста ещё вращение двух кубов с освещением.

* text.cpp (14.96 Кб - загружено 1281 раз.)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #28 : 13-03-2009 10:01 » 

наверное, нужно напечатать текст на полигоне и вращать полигон Улыбаюсь Как - не знаю
Записан

Антон__
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #29 : 13-03-2009 21:09 » 

А зачем ты каждый раз создаёшь шрифт?
Достаточно создать один раз и потом только
Font->DrawText(TextString, -1,&myRect, DT_CENTER, TextColor);
Записан
Страниц: [1] 2 3  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines