プロが教えるわが家の防犯対策術!

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

A 回答 (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 …

>>私の希望としては、指定した部分だけ再描画をかけ、指定外の部分は、再描画されず、画像がのこり、最終的には一つの絵となって欲しいのですが。
 要するには、特定の領域を指定し、その部分に何かを表示したいと言うことでしょうか?
 で、あるのでしたら BitBlt()/StretchBlt() 辺りで描写した方が手っ取り早いかもしれません。

 「CDCのメンバ」
 http://msdn.microsoft.com/ja-jp/library/4acfw2ha …

>>InvalidateRctの使い方
 無理矢理再描写をさせる時位にしか使用した事が無いので、これ以上は筆舌に尽くしがたいです。

 以下が参考になるかもしれません。
 http://wisdom.sakura.ne.jp/system/winapi/win32/w …

 後はMFCと言う物がどの様に構成されているかも理解しておくと、より良いと思います。

 「MFCの階層図」
 http://msdn.microsoft.com/ja-jp/library/ws8s10w4 …
    • good
    • 0

InvalidateRectは、再描画しなくてはならない範囲をOSに指示するものです。



実際にウィンドウのどの部分を描画するかしないかはWM_PAINTハンドラの実装次第です。

ですので、残したい部分は描かないようにするか、ExcludeClipRect、ExcludeUpdateRgnといった関数を使って残したい部分をマスクするようにします。
    • good
    • 0

>InvalidateRect(&rct,FALSE);とするだけで


貴方が呼び出しているのは
WindowsAPIのInvalidateRectではなくMFCのCWnd::InvalidateRectだからでしょう。
http://msdn.microsoft.com/ja-jp/library/2f3csed3 …
単にMFCがWindowsAPIをラップしているだけです。
::InvalidateRect(m_hWnd,&rct,FALSE);を呼び出しているのと同じです。

>指定した部分だけ再描画をかけ、
InvalidateRectは再描画が必要な領域をOSに知らせる為のものです。
アニメーションの用途でつかうものではありません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A