zuze
Опытный
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 Кб - загружено 1059 раз.)
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #1 : 24-02-2009 15:40 » |
|
HFONT - это обычный апишный фонт, может просто достать контекста HDC да рисовать текст как обычно ? Должна быть где то функция для достатия контекста
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #2 : 24-02-2009 16:15 » |
|
Леш, что там? Расскажи для ленивых, кому не хочется качать проект.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
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
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #4 : 24-02-2009 21:32 » |
|
Да строка D3DXCreateFont(pDirect3DDevice, hFont, &pFont); не подходит, так как такая строка используется в DirectX 9.0b, а у меня DirectX 9.0c
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #5 : 24-02-2009 22:07 » |
|
Странно у меня DirectX 9.0c, а функция D3DXCreateFont содержин не 12, а 3 параметра.
Это я узнал из того что компилятор начал выдавать ошибки с надписью HFONT.
Надеюсь я заполню структуру HFONT правельно и текст наконец-то начнёт выводится на экран.
Прикрепляю файл с ошибками их стало намного меньше.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #6 : 25-02-2009 04:26 » |
|
HFONT - это не структура, а хендл
лучше покажи строчку, на которую ругается, а также текст ругани
|
|
|
Записан
|
|
|
|
zuze
Опытный
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 Кб - загружено 1235 раз.)
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #8 : 25-02-2009 08:21 » |
|
Type mismatch in parameter 'hFont' (wanted 'HFONT__ *', got 'int')
почему то ругань на указатель , почему - не понимаю ((. может привести насильно - (HFONT*)&pFont
|
|
|
Записан
|
|
|
|
zuze
Опытный
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
Опытный
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
Опытный
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
Опытный
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 »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #13 : 26-02-2009 16:55 » |
|
zuze, что значит - плохие файлы DirectX 9 ? Качай с мелкософтовского сайта SDK - и вперёд
|
|
|
Записан
|
|
|
|
zuze
Опытный
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
Опытный
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 »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #16 : 27-02-2009 05:08 » |
|
Как правельно компилировать и создавать исполняемый файл на Visual C++ 6 в командной строке?
зачем тебе командная строка ? Прямо в среде всё делай , для релиза выбери Release режим
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #17 : 27-02-2009 14:00 » |
|
Вот у меня тут вопросик в тему возник Вот есть строка // Вывод текста pFont->DrawText(TextString, -1,&myRect, DT_CENTER, TextColor);
Второй параметр говорит о том чтобы длинну строки вычисляла функция DrawText автоматически. А если сюда вбить точное значение размера длины строки будет ли программа работать намного быстрее или это не принципиально?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #18 : 28-02-2009 09:29 » |
|
при работе с HDC размер строки определяется при помощи GetTextExtentPoint, потом в прямоугольнике выводится текст. То есть, это всё равно что два раза текст напечатали, только первый раз не вывели на экран. Думаю, тут то же самое
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #19 : 28-02-2009 09:56 » |
|
Я имел ввиду слудующие, покажу на примере.длина строки 5 и я делаю так pFont->DrawText(TextString, 5, &myRect, DT_CENTER, TextColor);
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #20 : 28-02-2009 10:06 » |
|
pFont->DrawText(TextString, ::strlen(TextString), &myRect, DT_CENTER, TextColor);
думаю, при -1 там та же функция вызовется
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #21 : 28-02-2009 11:33 » |
|
А если тупо в место ::strlen(TextString) написать 5 будет ли намного быстрее или нет? Ведь тогда не вычисляется длина, а она заложенна как константа.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #22 : 28-02-2009 13:19 » |
|
zuze, это негибко, и лазейка для вирусов.
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #23 : 28-02-2009 14:30 » |
|
Если текст меняется, а следовательно и его длина, то это конешно плохо ставить значение длины текста в виде константы, это как ты сказал негибко и лазейка для вирусов (основанные на переполнение буфера), но если текст не меняется, а следовательно и его длина, то я думаю можно задать длину текста в виде константы и скорость выполнения программы будет быстрее.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #24 : 28-02-2009 17:07 » |
|
если и будет быстрее, то настолько незаметно, что оно не стоит того (особенно на фоне ухудшения безопасности и устойчивости программы)
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #25 : 28-02-2009 17:33 » |
|
Вот это я и хотел узнать, я наверно плохо объяснил по этому мы так долго и проковырялись с этим очень маленьким вопросом.
Теперь всё понятно.
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #26 : 28-02-2009 17:39 » |
|
Если можешь Алексей1153++ посмотри пожалуйста мою тему "Несколько вопросов по поводу Visual C++" в разделе "...>Программирование > С/С++ > WinAPI & Visual C++" и дай пожалуйста ответ на вопросы я в этой теме не мог задать эти вопросы так как они не потеме, хотя один третьий вопрос уже был в этой теме и я пока на него ответа не получил. Я пока не получил там ни одного ответа.
Заранее спасибо!!!
|
|
|
Записан
|
|
|
|
zuze
Опытный
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 Кб - загружено 1324 раз.)
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #28 : 13-03-2009 10:01 » |
|
наверное, нужно напечатать текст на полигоне и вращать полигон Как - не знаю
|
|
|
Записан
|
|
|
|
Антон__
|
|
« Ответ #29 : 13-03-2009 21:09 » |
|
А зачем ты каждый раз создаёшь шрифт? Достаточно создать один раз и потом только Font->DrawText(TextString, -1,&myRect, DT_CENTER, TextColor);
|
|
|
Записан
|
|
|
|
|