Как преобразовать двойное значение в строку, чтобы вывести его в строку заголовка окна под 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 );

Отказ от ответственности: код не тронут руками компилятора.

Другие вопросы по тегам