-1
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{

HDC             hdc;
PAINTSTRUCT     ps;
TCHAR           szBuffer[1];



switch (message)
{
case WM_CHAR:
    szBuffer[1] = (TCHAR) wParam;
    cout << wParam << " " << szBuffer[1] << " ";

    break;

case WM_PAINT:
    InvalidateRect(hwnd, NULL, TRUE);
    hdc = BeginPaint(hwnd, &ps);
    SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));
    TextOut(hdc, 1, 1, szBuffer, 1);
    EndPaint(hwnd, &ps);
    return 0;

こんにちは、私は上記のコードを実行して、一度に 1 文字ずつウィンドウに出力しようとしています。ただし、TextOut関数を使用してウィンドウに文字を表示できないようですが、ターミナルウィンドウに文字を表示することはできます。私は WinApi を初めて使用し、迷っています。

前もって感謝します!

4

1 に答える 1

3

YourszBufferはローカルでWndProc()あり、デフォルトでは C のローカル変数には自動ストレージWndProc()szBufferあります。outside などの別の場所に保存するか、 として宣言する必要があります。これにより、バッファーが保持されます (ただし、静的ストレージは再帰に対して安全ではないことに注意してください)。WM_PAINTWM_CHARszBufferWndProc()static

また、C では、配列の最初の要素のインデックスは 1 ではなく 0 です。行は、あなたがやりたいことをするszBuffer[1] = (TCHAR) wParam;必要があります。szBuffer[0] = (TCHAR) wParam;


私はあなたが C に慣れていないという前提で実行しているので、Jonathan Potter のコメントを参照してください。値がゼロの余分な文字が文字列に含まれていることについてです (数字のゼロの文字コードではなく、数値の 0 または'\0'またはL'\0')。TextOut()およびその他の GDI テキスト描画関数はこれらのnull で終わる文字列を使用しませんが、C の他のすべての関数は使用します。気を付けて。


また、Joe Willcoxson のコメントも正しいです。InvalidateRect()指定された長方形を再描画が必要なものとしてキューに入れます。WM_PAINTハンドラーでこれを使用すると、常にWM_PAINT何度も何度もメッセージを受け取ることになり、プログラムが大きくなるにつれてパフォーマンスに悪影響を及ぼします。

于 2014-11-18T22:57:08.897 に答える