複数の子ウィンドウに同じ処理を行うには?

[戻る]
シルクハット 2001/10/03(水) 08:21:19
第:複数の子ウィンドウに同じ処理を行うには?

 MDIで,子ウィンドウが複数出ている状態で,それらのウィンドウすべてに
同じ処理をさせたい場合(例えば,背景色をすべて同じにしたい)の簡単な方法は有るでしょうか?
たとえば,SendMessageToDescendants() なんかは,
一度に処理命令をウィンドウに送ることなどができるのでしょうか?
もしくは,ポインタなどを取得して,一つ一つ処理していくしかないのでしょうか?
お願いします.

sugar 2001/10/03(水) 09:33:41
仰る「処理命令」というのが具合的に何なのかよくわかりませんが、
SendMessageToDescendants()が送れるのは、あくまでメッセージです。
子ウィンドウの背景色を変えたいのであるなら、親と位置付けられるウィンドウが
子ウィンドウに対して任意のメッセージを送り、
それを受け取った子ウィンドウが自身の背景色を変える、という手段を取るべきではないでしょうか??

状況にもよりますが、親が直々に子を操作することはあまりしない方がいいと思います。

ku 2001/10/03(水) 10:03:52
これは背景色を全て同じにしたいでいいの?
処理の実装の仕方によりいろいろだと思うよ

たとえば、メモリDCからWM_PAINTでBitBltしている場合
新しい背景色を考慮してメモリDCを作り直して自分自身にInvalidateRectを呼ぶような
WM_USER+???を作り、対象の全てのウィンドウにWM_USER+???をSendするような
仕組みにするのではないかと思います

WM_ERASEBKGNDに処理させるなら
新しい背景色を考慮してブラシをアプリで1つ作り
Viewのウィンドウクラスに対して作成したブラシで置き換え(SetClassLong/GCL_HBRBACKGROUND)
対象のウィンドウ(全てのViewでしょう)にInvalidateRectを発行すれば良いのではないかと思います

WM_ERASEBKGNDを実装している場合は何らかの変数に背景用のブラシを保持して
FillRectなんかをしているのではないかと思うので
ブラシを作成して背景用のブラシを保持している所
(ポインタで見ているなら一カ所/メンバ変数なら全てのViewでしょう)に設定し
対象のウィンドウ(全てのViewでしょう)にInvalidateRectを発行すれば良いのではないかと思います

他にも方法はあるので、もっと良く考えた方が良いかも
実装の仕方や実際に何をやりたいかによって変わると思います
ちなみに、SendMessageToDescendantsは使ったことが無いし
上記の方法は確認してないので正しいかどうかは不明です(^^;

古いスレッドには追加発言できません。