ダブルバッファリングを使用する必要がある場合は、WM_ERASEBKGND
メッセージを抑制する必要があります。
WM_ERASEBKGND
すぐに対応して返却できます。しかし、WNDCLASS
/WNDCLASSEX
をに設定してメッセージを処理hbrBackground
しNULL
ないことはできますか?WM_ERASEBKGND
これは正しい方法ですか?
ダブルバッファリングを使用する必要がある場合は、WM_ERASEBKGND
メッセージを抑制する必要があります。
WM_ERASEBKGND
すぐに対応して返却できます。しかし、WNDCLASS
/WNDCLASSEX
をに設定してメッセージを処理hbrBackground
しNULL
ないことはできますか?WM_ERASEBKGND
これは正しい方法ですか?
はい、に設定hbrBackground
することNULL
は、no-opWM_ERASEBKGND
ハンドラーの実装を回避するための適切な方法です。
に渡すWM_ERASEBKGND
とDefWindowProc
、ウィンドウのクラスの背景ブラシがチェックされます。ある場合は、ダーティ領域を埋めます。背景ブラシがnullの場合、何もせずに戻ります。これは、基本的に、独自の何もしないWM_ERASEBKGND
ハンドラーを持つことと同じです。
WM_ERASEBKGND
ハンドラーからの戻り値は、呼び出し時に取得するfErase
フィールドに影響します。ハンドラーは、背景自体を消去する必要があるかどうか、または既にによって行われたかどうかを確認することになっています。(実際に誰かがチェックしているのを見たことがありませんが。)ハンドルを放すと、色番号またはブラシがあり、ある場合は返されます。PAINTSTRUCT
WM_PAINT
BeginPaint
WM_PAINT
fErase
WM_ERASEBKGND
DefWindowProc
WM_ERASEBKGND
TRUE
FALSE
hbrBackground
NULL
hbrBackground = GetStockObject(HOLLOW_BRUSH)
に設定するよりも設定する方が正しいと思いますNULL
。
RaymondChenのTheOldNew Thingに関する記事は、次のように区別しています。
背景の自動描画が必要ない場合は、中空のブラシを渡します。カスタムの背景描画が必要な場合は
NULL
、ブラシとして渡します。
WNDCLASS
のhbrBackground
メンバーのMSDNドキュメントには次のように書かれています。
このメンバーが
NULL
の場合、アプリケーションは、クライアント領域でペイントするように要求されるたびに、独自の背景をペイントする必要があります。背景をペイントする必要があるかどうかを判断するために、アプリケーションはWM_ERASEBKGND
メッセージを処理するか、関数によって埋められた構造体のfErase
メンバーをテストすることができます。PAINTSTRUCT
BeginPaint
そして、MSDNのドキュメントにWM_ERASEBKGND
は次のように書かれています。
この関数は、構造体のメンバー
DefWindowProc
によって指定されたクラス背景ブラシを使用して背景を消去します。の場合、アプリケーションはメッセージを処理し、背景を消去する必要があります。hbrBackground
WNDCLASS
hbrBackground
NULL
WM_ERASEBKGND
私の解釈では、処理を設定hbrBackground
しNULL
てから無視することWM_ERASEBKGND
は、厳密に合法であることを意味するものではありません(ただし、おそらく機能します)。これは、自分で処理し、nullポインタでペイントしようとしないhbrBackground = NULL
ことを約束します。WM_ERASEBKGND
DefWindowProc