hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。 |
HSP2.61 HSP3.0
|
クライアント領域内に他のウィンドウを所有しているウィンドウを親ウィンドウと呼ぶ。
またその所有されているウィンドウを子ウィンドウと呼ぶ。
他のウィンドウに所有されているウィンドウを子ウィンドウと呼ぶ。
HSP標準オブジェクトである input / button / chkbox / listbox / combox / mesbox などは子ウィンドウである。(Windowsでは子コントロールと呼ぶことが多い。)
他のウィンドウを所有しているウィンドウをオーナーウィンドウと呼ぶ。
親ウィンドウに所有されている子ウィンドウは親ウィンドウのクライアント領域外には出られず、親ウィンドウの背後に回ることも出来ません。
またアクティブにもなれません。子ウィンドウをクリックしたときにアクティブになるのは親ウィンドウです。
一方のオーナーウィンドウに所有されている子ウィンドウ――という呼び方は一般的ではありません。
一般的にはオーナー付きウィンドウと呼び、子ウィンドウと区別をしています。
――オーナー付きウィンドウはオーナーウィンドウのクライアント領域に限らず画面を自由に移動できます。
アクティブにもなることができます。
ただし、所有関係からは脱することが出来ずにオーナーウィンドウの背後に回ることが出来ません。
Win32 API関数にはウィンドウの親子関係を動的に変更するための関数が用意されています。
SetParent?()関数とSetWindowLong?()関数です。しかし両者は似ているようで若干動作が異なります。
ウィンドウスタイルを変更するときに良く使うのがSetWindowLong?()関数です。
SetWindowLong?()を使って親ウィンドウを変更することが出来ます。
1 2 3 4 |
|
1 2 3 |
|
呼び名で紹介した子ウィンドウの動作と違いますね。アクティブになりますし、クライアント外に移動できますし。
結論から言うとSetWindowParent?()はオーナーを変更するときに使います。つまりオーナー付きウィンドウを動的に設定するときに使います。(多分)
親ウィンドウを変更する場合はSetParent?()関数を使います。つまり子ウィンドウを動的に設定するときに使います。
1 2 3 |
|
1 2 |
|
またまた子ウィンドウの動作と違いましたね。
クライアント領域外には出られませんがアクティブになります。(これはこれでMDIっぽいですが・・・本来の子ウィンドウではありません。)
子ウィンドウを作るときはウィンドウスタイルにWS_CHILD(0x40000000)を含めなければなりません。
失敗したのはHSPのscreenで作られるウィンドウにこのスタイルが含まれていないためです。
子ウィンドウ(コントロール)を配置する際にはWS_CHILDを含めてください。
ということでscreenで作ったウィンドウを子ウィンドウに出来ました。SAMPLE3
ウィンドウの作成順が逆なのはウィンドウスタイルや親ウィンドウを変更してもすぐさまそれが反映されるわけではないからです。
screen 2を作った時点ではscreen 2がアクティブになるため子ウィンドウにしてもアクティブになってしまうからです。(gsel 0で解決)
また子ウィンドウはWS_POPUP(0x80000000)とは併用できません。
これは子ウィンドウ(WS_CHILD)には自分自身を所有している親ウィンドウにメッセージを処理したことを伝えるという仕事も行っているからです。
というわけでWS_CHILDの有る無しで何が変わってくるのか、という動作をボタンを使って示します。SAMPLE4
ボタンが押されると親ウィンドウにWM_COMMANDが送られます。
ここで初めて指定したラベルにジャンプしてカウンタがインクリメントされますが、WS_CHILDを外すと子ウィンドウではなくなるので親がいません。
親は子からWM_COMMANDが送られてこないのでラベルにはジャンプしないため止まったままです。
・ツール ・キャンバス ・レイヤー ・パレットGIMPにはツールウィンドウ(メインウィンドウ)、キャンバスウィンドウ、レイヤーウィンドウ、パレットウィンドウなどがあります。
・メイン┬・プレイリスト ├・イコライザ └・ライブラリwinampには再生ボタンなどを配置したメインウィンドウにプレイリストウィンドウ、イコライザウィンドウ、ライブラリウィンドウなどがあります。
SAMPLE6をWS_CHILDをセットしないでSetParent?()を使うとMDIちっくな外見になりますがMDIと動作が違うのは当たり前です。SAMPLE7
[・オーナー]┬・トップ ├・ツリー ├・インスペクタ ├・フォーム └・エディット統合開発環境Delphiではメインとなるフォームウィンドウ、ソース編集を行うエディットウィンドウの他にオブジェクインスペクタ、オブジェクトツリーウィンドウなどがあり、最上部には各種ツールバーを備えたトップウィンドウから成っています。
次の点に注目してください。