- ベストアンサー
InvalidateRectの使い方について
InvalidateRectの使い方ですが、ヘルプを見たところ、下記のように表記されていました。 BOOL InvalidateRect( HWND hWnd, // handle of window with changed update region CONST RECT *lpRect, // address of rectangle coordinates BOOL bErase // erase-background flag ); しかし、実際、使ってみると InvalidateRect(&rct,FALSE);とするだけで、コンパイルは通ります。 ※&rctはlpRectのように再描画する領域を指定しています。 私の希望としては、指定した部分だけ再描画をかけ、指定外の部分は、再描画されず、画像がのこり、最終的には一つの絵となって欲しいのですが。 これは引数が2つだから起きているアクシデントなのでしょうか。 InvalidateRctの使い方を教えていただければと思います。よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 >>InvalidateRect(&rct,FALSE);とするだけで、コンパイルは通ります。 コンパイル出来たのは、MFCのCWndクラスのメンバ関数の方を書いたからではないでしょうか。 ::InvalidateRect(HWND, const RECT*, BOOL)を内部で呼び出しているのです。 ↓質問者様が書いたのは此れの事では? void CWnd::InvalidateRect(const RECT* lpRect, BOOL bErase) { ::InvalidateRect(m_hWnd, lpRect, bErase); } 「CWnd::InvalidateRect(MFC)」 http://msdn.microsoft.com/ja-jp/library/2f3csed3(VS.80).aspx >>私の希望としては、指定した部分だけ再描画をかけ、指定外の部分は、再描画されず、画像がのこり、最終的には一つの絵となって欲しいのですが。 要するには、特定の領域を指定し、その部分に何かを表示したいと言うことでしょうか? で、あるのでしたら BitBlt()/StretchBlt() 辺りで描写した方が手っ取り早いかもしれません。 「CDCのメンバ」 http://msdn.microsoft.com/ja-jp/library/4acfw2ha.aspx >>InvalidateRctの使い方 無理矢理再描写をさせる時位にしか使用した事が無いので、これ以上は筆舌に尽くしがたいです。 以下が参考になるかもしれません。 http://wisdom.sakura.ne.jp/system/winapi/win32/win35.html 後はMFCと言う物がどの様に構成されているかも理解しておくと、より良いと思います。 「MFCの階層図」 http://msdn.microsoft.com/ja-jp/library/ws8s10w4(VS.80).aspx
その他の回答 (2)
- titokani
- ベストアンサー率19% (341/1726)
InvalidateRectは、再描画しなくてはならない範囲をOSに指示するものです。 実際にウィンドウのどの部分を描画するかしないかはWM_PAINTハンドラの実装次第です。 ですので、残したい部分は描かないようにするか、ExcludeClipRect、ExcludeUpdateRgnといった関数を使って残したい部分をマスクするようにします。
- sha-girl
- ベストアンサー率52% (430/816)
>InvalidateRect(&rct,FALSE);とするだけで 貴方が呼び出しているのは WindowsAPIのInvalidateRectではなくMFCのCWnd::InvalidateRectだからでしょう。 http://msdn.microsoft.com/ja-jp/library/2f3csed3(VS.80).aspx 単にMFCがWindowsAPIをラップしているだけです。 ::InvalidateRect(m_hWnd,&rct,FALSE);を呼び出しているのと同じです。 >指定した部分だけ再描画をかけ、 InvalidateRectは再描画が必要な領域をOSに知らせる為のものです。 アニメーションの用途でつかうものではありません。