ダイアログを使用していません。登録してからCreateWindow
呼び出しを使用して作成した独自のカスタムクラスを使用しています。登録時に背景色を赤にプリセットしました。
_WNDCLASSEX wc;
wc.hbrBackground = CreateSolidBrush(RGB(255, 0, 0));
_
しかし今、私は実行時に背景色を変更したいと思います。ボタンをクリックして青色に変更します。
_WM_Paint
_でSetBkColor()
呼び出しを使用しようとしましたが、_WM_CTLCOLORDLG
_メッセージからブラシを返そうとしましたが、機能しません。
何か助けは?
...システムは、ウィンドウの背景をペイントするか、アプリケーションがBeginPaintを呼び出すときに、ウィンドウにWM_ERASEBKGNDメッセージを送信することによってウィンドウにその機会を与えます。アプリケーションがメッセージを処理せずにDefWindowProcに渡す場合、システムはウィンドウのクラスで指定された背景ブラシのパターンでメッセージを塗りつぶして背景を消去します。
......クラスバックグラウンドブラシが定義されていても、アプリケーションはWM_ERASEBKGNDメッセージを処理できます。これは、ユーザーがクラス内の他のウィンドウに影響を与えることなく、指定されたウィンドウのウィンドウの背景色またはパターンを変更できるようにするアプリケーションでは一般的です。このような場合、アプリケーションはメッセージをDefWindowProcに渡してはなりません。 .....
したがって、WM_ERASEBKGNDメッセージのwParamを使用してDCを取得し、背景をペイントします。
以下を試すことができます:
HBRUSH brush = CreateSolidBrush(RGB(0, 0, 255));
SetClassLongPtr(hwnd, GCLP_HBRBACKGROUND, (LONG_PTR)brush);
短い答え:WM_ERASEBKGND
を処理します。
より長い答え:
WNDCLASSを登録すると、そのクラスのすべてのウィンドウに関する情報が提供されます。したがって、ウィンドウの1つのインスタンスのみの色を変更したい場合は、自分で処理する必要があります。
ウィンドウを再描画する時間になると、システムはwndprocにWM_ERASEBKGND
メッセージを送信します。処理しない場合、DefWindowProc
はウィンドウクラスの色でクライアント領域を消去します。しかし、メッセージを直接処理して、好きな色(または背景パターン)をペイントできます。