web-dev-qa-db-ja.com

登録後にウィンドウの背景色を設定するにはどうすればよいですか?

ダイアログを使用していません。登録してからCreateWindow呼び出しを使用して作成した独自のカスタムクラスを使用しています。登録時に背景色を赤にプリセットしました。

_WNDCLASSEX wc;
wc.hbrBackground = CreateSolidBrush(RGB(255, 0, 0));
_

しかし今、私は実行時に背景色を変更したいと思います。ボタンをクリックして青色に変更します。

_WM_Paint_でSetBkColor()呼び出しを使用しようとしましたが、_WM_CTLCOLORDLG_メッセージからブラシを返そうとしましたが、機能しません。

何か助けは?

25
Kaije

Window Background から:

...システムは、ウィンドウの背景をペイントするか、アプリケーションがBeginPaintを呼び出すときに、ウィンドウにWM_ERASEBKGNDメッセージを送信することによってウィンドウにその機会を与えます。アプリケーションがメッセージを処理せずにDefWindowProcに渡す場合、システムはウィンドウのクラスで指定された背景ブラシのパターンでメッセージを塗りつぶして背景を消去します。

......クラスバックグラウンドブラシが定義されていても、アプリケーションはWM_ERASEBKGNDメッセージを処理できます。これは、ユーザーがクラス内の他のウィンドウに影響を与えることなく、指定されたウィンドウのウィンドウの背景色またはパターンを変更できるようにするアプリケーションでは一般的です。このような場合、アプリケーションはメッセージをDefWindowProcに渡してはなりません。 .....

したがって、WM_ERASEBKGNDメッセージのwParamを使用してDCを取得し、背景をペイントします。

22
Zabba

以下を試すことができます:

HBRUSH brush = CreateSolidBrush(RGB(0, 0, 255));
SetClassLongPtr(hwnd, GCLP_HBRBACKGROUND, (LONG_PTR)brush);
13
Tassos

短い答え:WM_ERASEBKGNDを処理します。

より長い答え:

WNDCLASSを登録すると、そのクラスのすべてのウィンドウに関する情報が提供されます。したがって、ウィンドウの1つのインスタンスのみの色を変更したい場合は、自分で処理する必要があります。

ウィンドウを再描画する時間になると、システムはwndprocにWM_ERASEBKGNDメッセージを送信します。処理しない場合、DefWindowProcはウィンドウクラスの色でクライアント領域を消去します。しかし、メッセージを直接処理して、好きな色(または背景パターン)をペイントできます。

4
Adrian McCarthy