- ベストアンサー
BeginPaintの使い方
現在windowsプログラミングを勉強しています。 まだまだはじめたばかりでwindowsプログラミングの把握できていない部分が多々あるので、何か使い方が根本的に間違えているところがあるかもしれませんが、ご容赦ください。 case WM_PAINT: hdc=BeginPaint(hdc,&ps);/*rc,hdc等は宣言済み*/ TextOut(hdc,0,0,szStr,(int)strlen(szStr));/*szStr="文字列"代入済み*/ EndPaint(hWnd,&ps);/*hWnd等は宣言済み*/ break; において、 1.ダブルクリックしたら表示させよう!と思いまして、 WM_PAINT→WM_RBUTTONDBLCLKSと変更したところ表示されなくなりました。 しかし、hdc取得をGetDCで行うとうまくいきました。この違いがよくわかりません。 2.次はダブルクリックすると文字を右に動かそう!と思いまして、 TextOut(hdc,i,0,・・・・)などといたしましてiを増やしたところ更新前の画像が残りました。そこでInvalidateRectによって背景消去しようとおもいまして、TextOutの前に挿入しましたがこれによっても初めから、クリック後も何も表示されなくなりました。 1と2の2点に関して、どなたかご教授いただけないでしょうか。よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
これは、 case WM_PAINT: hdc=BeginPaint(hdc,&ps); TextOut(hdc,0,0,szStr,(int)strlen(szStr)); EndPaint(hWnd,&ps); break; 1.ダブルクリックしたら表示させよう! case WM_RBUTTONDBLCLK: hdc=GetDC(hdc); // GetDC()はWM_PAINT以外で使う TextOut(hdc,0,0,szStr,(int)strlen(szStr)); ReleaseDC(hWnd, hdc); break; 2.ダブルクリックすると文字を右に動かそう! case WM_RBUTTONDBLCLK: hdc=GetDC(hdc); // GetDC()はWM_PAINT以外で使う TextOut(hdc,i+=10,0,szStr,(int)strlen(szStr)); ReleaseDC(hWnd, hdc); break; ただし、ここまででは最小化等すると消える。 1.ダブルクリックしたら表示させよう! case WM_RBUTTONDBLCLK: InvalidateRect(hWnd, NULL, TRUE); // WM_PAINTで再描画 break; case WM_PAINT: hdc=BeginPaint(hdc,&ps); // BeginPain()はWM_PAINT のみで使う TextOut(hdc,0,0,szStr,(int)strlen(szStr)); EndPaint(hWnd,&ps); break; 2.ダブルクリックすると文字を右に動かそう! case WM_RBUTTONDBLCLK: InvalidateRect(hWnd, NULL, TRUE); // WM_PAINTで再描画 break; case WM_PAINT: hdc=BeginPaint(hdc,&ps); // BeginPain()はWM_PAINT のみで使う TextOut(hdc,i+=10,0,szStr,(int)strlen(szStr)); EndPaint(hWnd,&ps); break; 最小化等した場合は、WM_PAINTが自動的に呼ばれる。
その他の回答 (2)
- m-take0220
- ベストアンサー率60% (477/782)
2.の原因も分かったかも。 まず、ウィンドウの描画は基本的にWM_PAINTの中で行うべきです。そうしないと、別のウィンドウが重なった場合などに、表示が消えてしまいます。 InvalidateRectは、背景を消去するのではなく、ウィンドウに無効な領域(再描画が必要な領域)があることをWindowsに知らせます。Windowsはその部分を描画させるために、WM_PAINTメッセージを送信してきます。 なので、TextOutで描画したとしても、後からWM_PAINTの処理によって上書きされてしまいます。
- m-take0220
- ベストアンサー率60% (477/782)
1.については、BeginPaintのリファレンスに書かれています。 > アプリケーションがこの関数を呼び出せるのは、WM_PAINT メッセージに応答するときだけです。 http://msdn.microsoft.com/ja-jp/library/cc428337.aspx 2.については、どのようにコードを加えたのかが分からないと答えようがありません。