- ベストアンサー
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: からのつながりが ある場合でないと実行されないんですか? ソースのおかしいところがあったら教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
BeginPaint(),EndPaint() が使えるのは WM_PAINT メッセージの時だけですよ。それ以外の時には GetDC() と ReleaseDC()を使わないとなりません。
その他の回答 (2)
- a-kuma
- ベストアンサー率50% (1122/2211)
> InvalidateRect(hWnd,NULL,TRUE); > で、なぜか > case WM_PAINT: > が動作しました。 「なぜか」ではなく、InvalidateRect() が、そういう目的で使うために用意されて いる API だから、です。別の質問であった ValidateRect() の逆ですね。 では、頑張って下さい。
お礼
InvalidateRect(hWnd,NULL,TRUE); UINT に WM_PAINT を代入。 ValidateRect(hWnd,NULL); UINT から WM_PAINT を消す。 という感じで覚えておくことにしました。 ありがとうございます。
- a-kuma
- ベストアンサー率50% (1122/2211)
> エスケープキーで文字表示をやりたいけど こういう時には、キーが押されたときに文字表示をするように作るのではなく、 再描画を促すように作る方が良いです。 InvalidateRect() だったかな。 このソースで描画されない理由は、No.1 の回答の通りです。
お礼
InvalidateRect(hWnd,NULL,TRUE); で、なぜか case WM_PAINT: が動作しました。 ありがとうございます。
お礼
ありがとうございます。 そんなことはないだろうと思っていたのに case WM_PAINT でしか使えなかったんですね。