ダブルバッファリングを使用する必要がある場合は、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フィールドに影響します。ハンドラーは、背景自体を消去する必要があるかどうか、または既にによって行われたかどうかを確認することになっています。(実際に誰かがチェックしているのを見たことがありませんが。)ハンドルを放すと、色番号またはブラシがあり、ある場合は返されます。PAINTSTRUCTWM_PAINTBeginPaintWM_PAINTfEraseWM_ERASEBKGNDDefWindowProcWM_ERASEBKGNDTRUEFALSEhbrBackgroundNULL
hbrBackground = GetStockObject(HOLLOW_BRUSH)に設定するよりも設定する方が正しいと思いますNULL。
RaymondChenのTheOldNew Thingに関する記事は、次のように区別しています。
背景の自動描画が必要ない場合は、中空のブラシを渡します。カスタムの背景描画が必要な場合は
NULL、ブラシとして渡します。
WNDCLASSのhbrBackgroundメンバーのMSDNドキュメントには次のように書かれています。
このメンバーが
NULLの場合、アプリケーションは、クライアント領域でペイントするように要求されるたびに、独自の背景をペイントする必要があります。背景をペイントする必要があるかどうかを判断するために、アプリケーションはWM_ERASEBKGNDメッセージを処理するか、関数によって埋められた構造体のfEraseメンバーをテストすることができます。PAINTSTRUCTBeginPaint
そして、MSDNのドキュメントにWM_ERASEBKGNDは次のように書かれています。
この関数は、構造体のメンバー
DefWindowProcによって指定されたクラス背景ブラシを使用して背景を消去します。の場合、アプリケーションはメッセージを処理し、背景を消去する必要があります。hbrBackgroundWNDCLASShbrBackgroundNULLWM_ERASEBKGND
私の解釈では、処理を設定hbrBackgroundしNULLてから無視することWM_ERASEBKGNDは、厳密に合法であることを意味するものではありません(ただし、おそらく機能します)。これは、自分で処理し、nullポインタでペイントしようとしないhbrBackground = NULLことを約束します。WM_ERASEBKGNDDefWindowProc