web-dev-qa-db-ja.com

WinApiのGetClientRectとGetWindowRectの違いは何ですか?

ウィンドウを更新するには、InvalidateRectでこれらのうちどれを使用すればよいですか?なぜ?

25
Abzac

ウィンドウの四角形には、クライアント以外の領域、つまりウィンドウの境界線、キャプションバーなどが含まれます。クライアントの四角形には含まれません。

GetWindowRectは画面座標で四角形を返し、GetClientRectはクライアント座標で四角形を返します。

InvalidateRectはクライアント座標で長方形を受け取ります。クライアント領域全体を無効にする場合は、NULLInvalidateRectに渡します。 GetClientRectから返される四角形を渡すこともできますが、NULLを渡す方がはるかに簡単で明確です。

44
David Heffernan

GetClientRectは、ウィンドウのクライアント領域の座標を取得します。具体的には、これはinsidewindow chrome andexcludesヘッダーなど。 MSDNページ のコメントの1つは、非常によく要約しています。

この関数は、レンダリングできる領域のサイズを返します。

GetWindowsRectはウィンドウ全体の座標を取得します。これは、includesヘッダー、ステータスバーなどです。ただし、 MSDNページのコメントによると

WINVER = 6にリンクされていないVistaでのアプリは、ここでは誤解を招くような値のセットを受け取りますが、Vista Aeroがウィンドウに適用する「ガラス」ピクセルの余分なパディングは考慮されていません。

したがって、これがWindows 7で修正されていない限り、得られた結果を再確認し、WINVERの値が正しいことを確認してください。

11
ChrisF

非常に簡単な説明は、GetWindowRect()がウィンドウの境界を含む長方形を提供するということです。 GetClientRect()は、境界線を除外する長方形を提供します。これは、ウィンドウ固有の図面に割り当てられる領域です。

GetWindowRect()は、画面座標(画面/モニターに相対的な座標)で長方形を返すことに注意してください。 GetClientRect()は、それ自体に相対的な長方形を返します。

11

MSDNから:
GetWindowRect
指定されたウィンドウの外接する四角形の寸法を取得します。寸法は、画面の左上隅を基準にした画面座標で指定されます。

GetClientRect
ウィンドウのクライアント領域の座標を取得します。クライアント座標は、クライアント領域の左上隅と右下隅を指定します。クライアントの座標はウィンドウのクライアント領域の左上隅を基準にしているため、左上隅の座標は(0,0)です。

その他:クライアント四角形には、タイトルバー、境界線、スクロールバー、ステータスバーは含まれません...

6
Marco