Как преобразовать двойное значение в строку, чтобы вывести его в строку заголовка окна под Win32
Возможный дубликат:
Как я могу преобразовать двойной в строку в C++?
Конвертировать double в строку C++?
Тотальный С ++ и Win32 нуб здесь играют в Visual Studio 2012, так что терпите меня, потому что я иногда откусываю больше, чем могу пережевывать:)
У меня есть приложение Win32, которое просто настраивает окно, используя цикл peekmessage для обновления в реальном времени. Приложение работает нормально, и окно показывает нормально. Я хотел бы напечатать текст в строке заголовка окна, отображая количество кадров в секунду из класса часов / таймеров, который мне предоставили.
Я еще не изучил GDI / GDI+ или Direct2D & DirectWrite для вывода текста и значений переменных в клиентскую область, поэтому сейчас мне нужен простой метод вывода некоторой базовой статистики в окно, и я решил, что самый простой способ - это обновить заголовок окна на данном этапе. Мой класс окна имеет метод SetTitle, который принимает std::wstring, поэтому мне было интересно, как лучше построить строку из литерального текста и значений переменных, таких как double? Как вы можете догадаться, я также незнаком со строками, выходящими за рамки стандартного std:cout для консольных приложений.
Amazon сообщает мне, что до моей Святой "Книги Петцольда, 5-е издание" осталось 3 дня, поэтому любые советы будут с благодарностью приняты, и вы попадете в мой список рождественских открыток в этом году.
Благодарю.
2 ответа
После того, как я уселся и углубился в поток ввода и вывода, я наконец нашел решение, которое, кажется, работает хорошо.
После включения <sstream>
в моем проекте я создал std::wstringstream myString;
объект.
В цикле реального времени моего приложения у меня был следующий код для форматирования строки и значения, поступающего из класса Clock, который я затем передал в GDI для распечатки в клиентскую область окна:
myString.clear(); // clear status bits
myString.str(L""); // Clear the string for reuse
myString << "FPS " << pGameClock->GetFrameRate();
TextOutW(GdiDeviceContext, x_pos, y_pos,
myString.str().c_str(),
myString.str().length());
В процессе обучения я быстро углубился в вывод простого текста GDI, поскольку у меня изначально были проблемы с обновлением свойства заголовка окна приложения с помощью winapi. SetWindowTextW
функция. Кажется, ему не нравится, когда он вызывается с высокой частотой в главном цикле, в результате чего моя система перестает отвечать на запросы при запуске программы, поэтому возникает необходимость в изучении базового GDI для вывода в мою клиентскую область окна, а не в строку заголовка окна.
pGameClock->GetFrameRate();
Кстати, это любезно предоставленная реализация класса часов и таймеров высокого разрешения, разработанного талантливым Ноэлем Ллописом и представленного в Game Programming Gems 4. (Спасибо Ноэль).
Я также обнаружил, что еще многое предстоит узнать о методах более производительных методов форматирования и построения строк, особенно применительно к требованиям реального времени в играх, но я подозреваю, что мне лучше будет перейти к https://gamedev.stackexchange.com/ (который я только недавно обнаружил) для дальнейших вопросов и помощи?
Книги, которые помогли этому C++ noob лучше понять потоки ввода и вывода:
- Принципы и практика программирования с использованием C++, Бьярне Страуструп
- C++ для всех, 2-е издание, автор Cay Horstmann
И для эффективности и для удобства выделенный StringWriter
класс предпочтительнее.
Например, с манжеты,
template< class Type >
static wstring stringFrom( Type const& o )
{
wostringstream stream;
stream << o;
return stream.str();
}
class StringWriter
{
wstring s_;
static wstring const& fastStringFrom( wstring const& s )
{ return s; }
static wchar_t const* fastStringFrom( wchar_t const* s )
{ return s; }
template< class Type >
static wstring fastStringFrom( Type const& o )
{
return stringFrom( o );
}
public:
template< class Type >
StringWriter& operator<<( Type const& o )
{
s_ += fastStringFrom( o );
return *this;
}
operator wstring const& () const { return s_; }
operator wchar_t const* () const { return s_.c_str(); }
};
Тогда используйте как
typedef StringWriter S;
foo( S() << L"pi = " << 3.14 );
Отказ от ответственности: код не тронут руками компилятора.