forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Вывод текста (http://forum.boolean.name/showthread.php?t=15533)

Mind 23.09.2011 17:35

Вывод текста
 
Помогите разобраться....
По книге Станислава Горнакова пробывал выводить текст так там у него одни ошибки. Он предназначен для старого DXSDK. Я так и немогу понять как создать текст в С++, с помошщью какой команды.
ЗЫ как вывести цифры на экран, прейдется преобразовывать типы (из int в char и т.д)?

FireOwl 23.09.2011 17:40

Ответ: Вывод текста
 
Имеется в виду это: http://adorning.ru/2010/01/10/c-urok-6-stroki/
Или что?

Mind 23.09.2011 17:54

Ответ: Вывод текста
 
Я имел ввиду вывод текста в 3D приложение

falcon 23.09.2011 22:49

Ответ: Вывод текста
 
Цитата:

По книге Станислава Горнакова
сожги книгу и автора, по возможности...

Mind 24.09.2011 11:53

Ответ: Вывод текста
 
Цитата:

Сообщение от falcon (Сообщение 203275)
сожги книгу и автора, по возможности...

:-D
Уже ей непользуюсь месяца полтора где-то. Сам кодю и решаю задачи.

Но все же как быть с текстом?

Mhyhr 24.09.2011 22:11

Ответ: Вывод текста
 
Неужели так сложно нагуглить самому что-то типа:
http://www.toymaker.info/Games/html/text.html

Цитата:

прейдется преобразовывать типы (из int в char и т.д)?
Да прЕЙдется.

Reizel 25.09.2011 12:33

Ответ: Вывод текста
 
Цитата:

Сообщение от Mind (Сообщение 203231)
прейдется преобразовывать типы (из int в char и т.д)?

Нет, преобразование тут не поможет. Читай itoa, ftoa и подобные

genroelgvozo 25.09.2011 13:53

Ответ: Вывод текста
 
можно еще char(n+48 ) в цикле

Mind 25.09.2011 14:39

Ответ: Вывод текста
 
Цитата:

Сообщение от Mhyhr (Сообщение 203345)
Неужели так сложно нагуглить самому что-то типа:
http://www.toymaker.info/Games/html/text.html

Такой метод я знаю. Я не пойму как в таком случае вывести число из переменной.Если с преобразованием то какой командой?stroka=reinterpret_cast<LPCWSTR>(perem)?


Цитата:

Сообщение от genroelgvozo
можно еще char(n+48 ) в цикле

нафига?:4to:

Цитата:

Сообщение от ПАВЕЛ
Нет, преобразование тут не поможет. Читай itoa, ftoa и подобные

Что это такое?

ЗЫ есть ли еще какя-нить команда для вывода текста в 3D приложение кроме Drawtext ?

impersonalis 25.09.2011 14:59

Ответ: Вывод текста
 
Цитата:

Сообщение от genroelgvozo (Сообщение 203380)
можно еще char(n+48 ) в цикле

это проканает при системе кодирования числа "1-байт-1-цифра"
т.е. 123 задаётся как
Код:

char n[3];
n[0]=1;
n[1]=2;
n[2]=3;

и выводится как
Код:

for(short i=0;i<sizeof(n);i++){
cout<<char(n[i]+48)<<endl;
}

48 - кодовая разница по ASCII между '0' и 0

Mind 25.09.2011 16:29

Ответ: Вывод текста
 
Цитата:

48 - кодовая разница по ASCII между '0' и 0
Понял спс.

genroelgvozo 28.09.2011 10:33

Ответ: Вывод текста
 
ну так можно получать разряды из числа а не хранить их в массиве
ну а вообще да лучше наверное itoa, хотя мне кто то говорил что там фишки не хорошие есть

impersonalis 28.09.2011 10:59

Ответ: Вывод текста
 
Цитата:

Сообщение от genroelgvozo (Сообщение 203646)
ну так можно получать разряды из числа а не хранить их в массиве

Что-то в голове рождается не очень красивый код, со скачками по адресам и кучей битовых операций, а в итоге:
Цитата:

Сообщение от genroelgvozo (Сообщение 203646)
ну а вообще да лучше наверное itoa, хотя мне кто то говорил что там фишки не хорошие есть

Ну, наверное, проблемы с переполнением переданного char буфера

Mind 21.12.2011 20:13

Ответ: Вывод текста
 
Вот краткая функция вывода текста:

Код:

void InitMyText(IDirect3DDevice9* dev,HFONT hFont)
{
        if (hFont == NULL)
        hFont = CreateFont(30,10,0,0,FW_NORMAL,0,0,0,1,0,0,0,DEFAULT_PITCH | FF_MODERN,L"Arial");
 
        if (pFont == NULL)
        D3DXCreateFontIndirect(dev,&hv,&pFont);
}
void DrawMyText(LPCWSTR str,int x,int y,int x1,int y1,D3DCOLOR MyColor)
{
        Rec.left = x;
        Rec.top = y;
        Rec.right = x1;
        Rec.bottom = y1;
       
        pFont -> DrawText(0,str,-1,&Rec,DT_WORDBREAK,MyColor);
}

Вопрос в том как только выводить цифры? Где-то читал что надо делать так:

Код:

void PrintInt(int a, int x, int y,D3DCOLOR MyColor)
{
    char textint[33];
    _itoa_s(a,textint,10);
    pFont -> DrawText(0,textint,-1,&Rec,DT_WORDBREAK,MyColor); // Ругается 
}

Ругается потому что не совпадает тип char с типом LPCWSTR.
Вот и не пойму что делать. Подскажите.

pozitiffcat 21.12.2011 21:35

Ответ: Вывод текста
 
а ты попробуй DrawTextA, а вообще переключи в свойствах проекта использовать unicode, на многобайтовую. Или wchar_t textint[33]
UPD:
wchar_t* textint = new wchar_t[33];

Mind 21.12.2011 23:19

Ответ: Вывод текста
 
Цитата:

Сообщение от pozitiffcat (Сообщение 214844)
а ты попробуй DrawTextA

Спасибо и правдо помогло :super:

Mind 22.12.2011 15:12

Ответ: Вывод текста
 
Еще одно. А как узнать длину строки в пикселях?

Mind 23.12.2011 12:35

Ответ: Вывод текста
 
Какой командой можно подсчитать длину моего текста(в пикселях)?
Другими словами я хочу объединить текст предложения с текстом цифр, но для этого мне надо знать длину строки первого текста чтобы потом поставить цифры.

pozitiffcat 23.12.2011 12:50

Ответ: Вывод текста
 
ооо ну это хз. Это я не умею делать. Примерно так
заранее узнать размер каждой буквы занести в массив например int wordSize[255];
узнать промежуток между буквами например
int space = 1;
Код:

int len=0;
for(int i=0;i<strlen(text);i++)
{
  int sizea = wordsize[(int)text[i]];
  len += sizea + space;
}
len -= space;
//len - это размер нашей строки в пикселях


Mind 26.12.2011 22:23

Ответ: Вывод текста
 
Короче опять проблемы:

Нашел функцию gcvt(....) которая выводит целые и вещественные числа.Пользовался часто пока не начал выводить числа меньше нуля. Причем число - 0.123456789 - выводится нормально, а такое - 0.0123456789 - через экспоненту(например: 0.01 = 1е-0.02).
Как мне избавится от неё. Или может есть другая функция(которую я нигде не могу найти) или может подскажите с алгоритмом преобразования вещ. числа в строку?

mr.DIMAS 26.12.2011 22:33

Ответ: Вывод текста
 
Тему не читай @ сразу отвечай.

Чем тебе не угодила функция sprintf?
http://www.cplusplus.com/reference/c...stdio/sprintf/

mr.DIMAS 26.12.2011 22:37

Ответ: Вывод текста
 
UPD. Чтобы не париться с преобразованием каждой переменной в строку сделай свою функцию вывода с переменным кол-вом аргументов ( как printf и тому подобные ). Как-то при работе с Б3Д Сдк мне понадобилась подобная функция. Вот она

void bbTextEx( int x, int y, const char * text, ... )
{
va_list argumentList;
char buffer[512];

va_start(argumentList, text);
vsprintf_s( buffer, text, argumentList);
va_end(argumentList);

bbText( x,y, buffer );
};

нужно еще подключить windows.h

Mind 26.12.2011 23:48

Ответ: Вывод текста
 
Цитата:

Сообщение от mr.DIMAS (Сообщение 215328)
Чем тебе не угодила функция sprintf?

Разве она может выводить текст в определённом шрифте в 3D приложение?

Код:

void bbTextEx( int x, int y, const char * text, ... )
{
va_list argumentList;
char buffer[512];

va_start(argumentList, text);
vsprintf_s( buffer, text, argumentList);
va_end(argumentList);

bbText( x,y, buffer );
};

Функция нписана на С++? Если да то что такое va_list,va_start,va_end?

Update:
Извиняюсь за это:

Цитата:

Цитата:

Сообщение от mr.DIMAS (Сообщение 215328)
Чем тебе не угодила функция sprintf?

Разве она может выводить текст в определённом шрифте в 3D приложение?
Сам разобрался. И в правду функция делает то что надо.

mr.DIMAS 27.12.2011 00:07

Ответ: Вывод текста
 
http://www.cplusplus.com/reference/c...darg/va_start/
http://www.cplusplus.com/reference/c...stdarg/va_end/
http://www.cplusplus.com/reference/c...tdio/vsprintf/

Цитата:

Функция нписана на С++
А мы сейчас в какой теме по какому языку?

Mind 27.12.2011 18:51

Ответ: Вывод текста
 
mr.DIMAS а ты не знаешь как сделать чтобы если число например = 0.01, а максимальный размер вводимых цифр=5, то чтоб число выводило - 0.01 а не 0.01000. Хочу избавляться от нулей даже если еще есть место для цифр. Как это сделать(через функцию sprintf и тп)?

pozitiffcat 27.12.2011 20:10

Ответ: Вывод текста
 
float a=0.01f;
char text[5];
sprintf(text,"%.2f",a);//так че не работает?

УПД.
или так
sprintf(text,"%.*f",2,a);

Mind 28.12.2011 12:23

Ответ: Вывод текста
 
Я наверно не правильно объяснил: нужно чтоб когда я ввожу число(будь то 0.01 или 0.001) оно само выбирало сколько цифр после запятой должно быть до последней цифры, а когда следующие идут нули то их оно просто округлять(не выводить).
Например:
0.001 = 0.001
0.0123000 = 0.0123
3.14150 = 3.1415
и т.д.

Нашел следующие:
sprintf(buffer,"%.g",nubmer);
тогда все выше описанные проблемы исчезают кроме одной: мин. предел числа = 0.0001 -> далее идёт экспонент(который мне не нужен)!

dsd 28.12.2011 12:51

Ответ: Вывод текста
 

pozitiffcat 28.12.2011 14:22

Ответ: Вывод текста
 
Цитата:

Сообщение от Mind (Сообщение 215527)
Я наверно не правильно объяснил: нужно чтоб когда я ввожу число(будь то 0.01 или 0.001) оно само выбирало сколько цифр после запятой должно быть до последней цифры, а когда следующие идут нули то их оно просто округлять(не выводить).
Например:
0.001 = 0.001
0.0123000 = 0.0123
3.14150 = 3.1415
и т.д.

Нашел следующие:
sprintf(buffer,"%.g",nubmer);
тогда все выше описанные проблемы исчезают кроме одной: мин. предел числа = 0.0001 -> далее идёт экспонент(который мне не нужен)!

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


Часовой пояс GMT +4, время: 08:48.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot