0

WinAPI プログラミングを学習しようとしていますが、この問題に行き詰まりました。キーを押して表示したいのです。私はこのコードを持っています

LRESULT CALLBACK WndProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam){
    switch(Msg){
    case WM_CREATE:
        break;


    case WM_CHAR:
        char ascii_code = wParam;
        unsigned int key_state = lParam;
        SetWindowText(hwndStatic, TEXT("You pressed key "+ascii_code));

        break;

    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    }
    return DefWindowProc(hwnd, Msg, wParam, lParam);
}

しかし、出力は奇妙です...ランダムなメッセージが表示されます(キーごとに異なります)。私は何を間違っていますか?

私はそれを(段階的に)デバッグしようとしましたが、ascii_codeには押されたキーが含まれていますが、TEXT()には表示されません。

4

2 に答える 2

1

次のように文字を一緒に追加することはできません。

"You pressed key "+ascii_code;

"You pressed key "これは、例えばのアドレスを取得し、1000それに ASCII コード値を追加します (例えば 95)。

この関数は、メモリ アドレス で文字列を出力しようとします1095。null 文字 (ゼロ) に到達するまで、すべてのメモリを出力します。これは何でもかまいません。

C関数を使用して文字列を作成するか、タグ付けされているC++useを使用する必要がありますstd::string

std::string message = "You pressed key ";
message += ascii_code;

SetWindowText(hwndStatic, TEXT(message.c_str()))
于 2013-02-21T08:20:53.620 に答える
-1
"You pressed key "+ascii_code

そのような文字列を連結することはできません。実際のタイプは"foo bar"const char[8]Cのような生の文字配列です。+を適用すると、最初の要素へのポインターに減衰し、ポインターで操作が実行されます。これは、このポインタが最後に指している場所に基づいて、ランダムなデータを出力することになることを意味します。

文字を文字列に連結する場合は、次のようなよりインテリジェントな文字列表現を使用する必要がありますstd::string

(std::string("you pressed key ") + ascii_code).c_str();
于 2013-02-21T08:25:08.827 に答える