• ベストアンサー

TextOut( ) が動かない

LRESULT CALLBACK WndProc( HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam){ PAINTSTRUCT ps; HDC hdc; switch(msg){ case WM_KEYDOWN:  if( wParam == VK_ESCAPE ){   hdc = BeginPaint(hWnd, &ps);   TextOut(hdc,0,0,str,strlen(str));   EndPaint(hWnd, &ps);  }  break; case WM_PAINT:  break; エスケープキーで文字表示をやりたいけど TextOut( ) が動作していないみたいでした。 switch(msg){ case WM_KEYDOWN:  if( wParam == VK_ESCAPE ){   hdc = BeginPaint(hWnd, &ps);   TextOut(hdc,0,0,str,strlen(str));   EndPaint(hWnd, &ps);  }  break; case WM_PAINT:  hdc = BeginPaint(hWnd, &ps);  TextOut(hdc,0,0,str,strlen(str));  EndPaint(hWnd, &ps);  break; とすると、常に文字が表示されたから、やっぱり case WM_KEYDOWN: の中の TextOut( ) が 動作していないんだと思いました。 TextOut( ) は case WM_PAINT: からのつながりが ある場合でないと実行されないんですか? ソースのおかしいところがあったら教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

BeginPaint(),EndPaint() が使えるのは WM_PAINT メッセージの時だけですよ。それ以外の時には GetDC() と ReleaseDC()を使わないとなりません。

A__
質問者

お礼

ありがとうございます。 そんなことはないだろうと思っていたのに case WM_PAINT でしか使えなかったんですね。

その他の回答 (2)

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.3

> InvalidateRect(hWnd,NULL,TRUE); > で、なぜか > case WM_PAINT: > が動作しました。 「なぜか」ではなく、InvalidateRect() が、そういう目的で使うために用意されて いる API だから、です。別の質問であった ValidateRect() の逆ですね。 では、頑張って下さい。

A__
質問者

お礼

InvalidateRect(hWnd,NULL,TRUE); UINT に WM_PAINT を代入。 ValidateRect(hWnd,NULL); UINT から WM_PAINT を消す。 という感じで覚えておくことにしました。 ありがとうございます。

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.2

> エスケープキーで文字表示をやりたいけど こういう時には、キーが押されたときに文字表示をするように作るのではなく、 再描画を促すように作る方が良いです。 InvalidateRect() だったかな。 このソースで描画されない理由は、No.1 の回答の通りです。

A__
質問者

お礼

InvalidateRect(hWnd,NULL,TRUE); で、なぜか case WM_PAINT: が動作しました。 ありがとうございます。

関連するQ&A