こんばんは、WS_CLIPCHILDREN で質問があります。
ウィンドウ作成時にWS_CLIPCHILDREN を使用して
そのウィンドウを親とする子コントロールを作成したところ旨く動作しませんでした。
具体的に説明します。
ウィンドウ内の子コントロールはCreateWindowExを使って作成しています。
作成順序は
ウィンドウバックグラウンド用スタティックコントロール
↓
エディットボックス(WS_EX_CLIENTEDGE を使用)
↓
ボタン
↓
グループボックス
↓
コンボボックス&リストボックス
↓
ツリービュー(3つほどアイテム追加)
以上よような順になっています。
このような流れで子コントロールを作成すると以下の不具合がでます。
・エディットボックスで指定したはずのWS_EX_CLIENTEDGE が見た目上無効になる
・ツリービューが不完全な表示状態になる
ツリービューのアイテム1つのwidth,heightが(40,10)だったとして
3つ追加したので(40,30)にになるとします。
ツリービュー自体のwidth,heighは (200,400)だったとします。
しかし実際に表示されるのはまさにアイテムの領域(40,30)だけで
その他のツリービューの領域はバックグラウンド用に指定した
スタティックコントロールと同じグレーで塗りつぶされてしまっています。
ちなみにこの状態でバックグラウンド用のスタティックコントロールの作成をやめると
ツリービューとエディットボックスは正常になります。
どうやったらバックグラウンド用のスタティックコントロールを作成したままで
不具合がでないようにできるのでしょうか?
以上お知恵をお貸し頂ければ幸いです。
環境を忘れていました。
VC7 & PlatformSDK Win32を使用です
ウィンドウは、先に作ったものが上になります。
スタティックを最後に作ってみてください。
えっと先につくったものが下になってるのですが・・
なにか別のやりかたがあるのでしょうか?
上記であげていた作成順をすべて逆にしてみました。
最後にウィンドウと同サイズのスタティックが作成されると
最前面にくるので、子コントロールはぬりつぶされて何も表示されていませんでした。
ウィンドウは、先に作ったものが上ですが、
全てのメッセージ処理は上から順に行われますので、
描画も、先に作ったものから行われ、
下にあるコントロールの描画によってどんどん上塗りされてしまいます。
(コントロールは基本的に重ねることを想定していません)
重ねる場合は、その子にWS_CLIPSIBLINGS(兄弟の描画を邪魔しない)をつけます。
上記方法により解決しました。
WS_CLIPSIBLINGSについては知っていたのですが
描画順などの不理解により旨く使えていませんでした。
ありがとうございました。