• ベストアンサー

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の使い方を教えていただければと思います。よろしくお願いします。

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

  • ベストアンサー
回答No.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)
回答No.2

InvalidateRectは、再描画しなくてはならない範囲をOSに指示するものです。 実際にウィンドウのどの部分を描画するかしないかはWM_PAINTハンドラの実装次第です。 ですので、残したい部分は描かないようにするか、ExcludeClipRect、ExcludeUpdateRgnといった関数を使って残したい部分をマスクするようにします。

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

>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に知らせる為のものです。 アニメーションの用途でつかうものではありません。