0

可能重复:
如何在 C++ 中将双精度转换为字符串?
将double转换为字符串C++?

总的 C++ 和 Win32 新手在 Visual Studio 2012 的土地上玩耍,所以请耐心等待,因为我有时咬得比我能咀嚼的还多:)

我有一个 Win32 应用程序,它只是使用 peekmessage 循环设置一个窗口以进行实时更新。该应用程序运行正常,窗口显示正常。我想将文本打印到窗口标题栏,显示我提供的时钟/计时器类的每秒帧数。

我还没有学习 GDI / GDI+ 或 Direct2D 和 DirectWrite 来将文本和变量值输出到客户区,所以现在我需要一个简单的方法来输出一些基本的统计信息到窗口,我认为最简单的方法是更新此阶段的窗口标题。我的窗口类有一个采用 std::wstring 的 SetTitle 方法,所以我想知道如何最好地从文字文本和变量值(如 double)构建字符串?您可能会猜到,除了基于控制台的应用程序的基本 std:cout 之外,我也不熟悉字符串。

亚马逊告诉我,我的神圣的“Petzold 书,第 5 版”还有 3 天,所以任何提示都将不胜感激,今年你将把它列入我的圣诞贺卡清单。

谢谢。

4

2 回答 2

1

在埋头苦干并深入研究流输入和输出之后,我终于找到了一个似乎运作良好的解决方案。

包含<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 文本输出,因为我最初在使用 winapiSetWindowTextW函数更新我的应用程序窗口标题属性时遇到了问题。它似乎不喜欢在主循环中被高频调用,导致我的系统在运行程序时变得无响应,因此需要学习基本的 GDI 来输出到我的窗口客户区而不是窗口标题栏。

顺便说一下,这个pGameClock->GetFrameRate();调用是由天才Noel Llopis设计的高分辨率时钟和计时器类的实现提供的,并在Game Programming Gems 4中介绍。(感谢诺埃尔)。

我还发现,对于更高性能的字符串格式化和构建技术,还有很多需要学习的技术,尤其是在应用于游戏中的实时要求时,但我怀疑我会更好地前往http://gamedev。 stackexchange.com(我最近才发现)有更多问题和帮助?

帮助这个 C++ 菜鸟更好地理解输入和输出流的书籍:

  • 使用 C++ 的编程原理和实践 Bjarne Stroustrup
  • 面向所有人的 C++,第 2 版,作者Cay Horstmann
于 2012-10-01T15:17:51.137 回答
0

为了效率和方便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 );

免责声明:编译器未触及代码。

于 2012-09-24T23:19:11.747 回答