0

重複の可能性:
C ++でdoubleを文字列に変換するにはどうすればよいですか?
doubleを文字列C++に変換しますか?

ここでVisualStudio2012の土地で遊んでいるC++とWin32の合計noobは、噛むことができる以上に噛むことがあるので、我慢してください:)

リアルタイム更新のためにpeekmessageループを使用してウィンドウを設定するだけのWin32アプリがあります。アプリは正常に実行され、ウィンドウは正常に表示されます。提供された時計/タイマークラスからの1秒あたりのフレーム数を表示するウィンドウタイトルバーにテキストを印刷したいと思います。

クライアント領域にテキストと変数の値を出力するためのGDI/GDI +またはDirect2D&DirectWriteをまだ学習していないので、今のところ、いくつかの基本的な統計をウィンドウに出力する簡単な方法が必要であり、最も簡単な方法は更新することです。この段階でのウィンドウタイトル。私のウィンドウクラスにはstd::wstringを受け取るSetTitleメソッドがあるので、リテラルテキストとdoubleなどの変数値から文字列を構築するのに最適な方法を考えていましたか?ご想像のとおり、コンソールベースのアプリの基本的なstd:cout以外の文字列にも慣れていません。

アマゾンは私の聖典「ペッツォルドの本、第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());

学習プロセス中に、winapiSetWindowTextW関数を使用してアプリケーションウィンドウのタイトルプロパティを更新する際に最初に問題が発生したため、単純なGDIテキスト出力にすばやく迂回しました。メインループで高頻度で呼び出されるのは好きではないようです。その結果、プログラムの実行時にシステムが応答しなくなります。したがって、ウィンドウのタイトルバーではなく、ウィンドウのクライアント領域に出力するための基本的なGDIを学習する必要があります。

ちなみに、この呼び出しは、才能のあるNoel Llopisによって設計され、 Game ProgrammingGems4で提示さpGameClock->GetFrameRate();れた高解像度の時計とタイマーのクラスの実装のおかげです。(Noelに感謝します)。

また、特にゲームのリアルタイム要件に適用した場合、よりパフォーマンスの高い文字列のフォーマットと構築のテクニックについて学ぶことがまだたくさんあることを発見しましたが、http://gamedevに向かうほうがよいと思います。さらなる質問とヘルプのためにstackexchange.com (私は最近発見したばかりです)?

このC++noobが入力ストリームと出力ストリームをよりよく理解するのに役立った本:

  • C ++ BjarneStroustrupを使用したプログラミングの原則と実践
  • C ++ for Everyone、第2版 CayHorstmann著
于 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 に答える