Windowsにおいてウインドウには親、子、オーナーが居る(もっと居るけど)
SetParentを使うと、親をセットできる。
SetParentすると、親の領域内で子のウインドウはクリッピングされる。
Zオーダーを静的に維持したいということをよく聞いたりする。
CのオーナーをB
BのオーナーをAとすると、
A→B→CというZオーダーは維持される。
通常オーナーを設定出来るのはCreateWindowExの第八引数にインスタンスを指定したときだけだ。
昔のVBでは frm.Show(vbModeless,Me) とかすると、オーナー指定でウインドウを開く事が出来る。
ところで、オーナーを後から付け替える方法として、大昔から以下のようなAPI呼び出しが使われてきた。
SetWindowLong(hWnd,GWL_HWNDPARENT,parent);
これをやると、後からオーナーの付け替えが出来る。(SPY++で確かめた)
しかし、MSDNによると、これはやってはいけないことらしいのだ。
「親の付け替えを行いたい場合、SetParentを使え」と書いてある。
そして「オーナーを付け変えるAPIはWindowsには無い」ことになっている。
つまり、SetWindowLongにGWL_HWNDPARENTを指定するのは、
サポート外の使い方という事になり、
「オーナー指定はウインドウ作成時に限る」というのが正しい解釈である。
オーナーを付け変えることによる副作用が何かあるのかもしれない。
なんだかわからないけど、使わない方がいいだろう。
0 件のコメント:
コメントを投稿