4

次のコードで win32 ウィンドウのタイトルを取得しようとしてから、wostringstream を使用して同じウィンドウのタイトルを変更しようとしています。タイトルを取得するコードは次のとおりです。

std::wstring Window::getTitle()const
{
    int length = SendMessage(hwnd,WM_GETTEXTLENGTH,0,0);
    if(length == -1)
        return L"";
    wchar_t* buffer = new wchar_t[length+1];
    SendMessage(hwnd,WM_GETTEXT,length+1,(LPARAM)buffer);
    std::wstring str(buffer);
    delete[] buffer;

    return str;
}

これを使用しようとするコードは次のとおりです。

std::wostringstream oss;

while(window->isRunning)
{

    oss.str(L"");

    oss<<window->getTitle()<<" FPS : "<<100<<" Frame Time"<<100;
    window->setText(oss.str());
}

ウィンドウ タイトルに加えて frs とフレーム時間を表示する代わりに、ウィンドウ タイトルを表示し、FPS とフレーム時間のテキストを複数回繰り返します。バッファの最後に「\ 0」を追加してみました:

buffer[length] = '\0';

これは問題を解決しませんでした。getTitle から L"some title" を返すと、すべてが正しく機能するため、問題は getTitle 関数内にあると考えられます。

4

1 に答える 1

3

もちろん、文字列は繰り返されます。ウィンドウ テキストを取得し、FPS とフレーム時間を追加してから、ウィンドウ テキストを変更された文字列に設定します。次に を呼び出すとgetTitle、変更された文字列が返されます。

したがって、ウィンドウ タイトルを で開始すると、fooループの最初の 2 回の繰り返しの結果は次のようになると思います。

foo FPS : 100 Frame Time100
foo FPS : 100 Frame Time100 FPS : 100 Frame Time100

から取得するときに、タイトルから FPS とフレーム時間の値を削除する必要がありますgetTitle。そうしないと、タイトルが無限に成長してしまいます。

于 2012-04-15T03:38:14.207 に答える