hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。 |
ウィンドウの中に仕切りを作り、その仕切りを動かすと片方が大きくなりもう一方は小さくなるというウィンドウを、 コントロールのサイズ変更と合わせて作ります。
スプリットウィンドウの実現方法はいくつか考えられます。
中でも一番簡単なのが下地ウィンドウを用いて境界を作り出し、ヒットテストを処理してリサイズさせるというものだと思います。
左の図がサンプル1の各ウィンドウとオブジェクトの配置関係です。
トップレベルのウィンドウのクライアント領域に3つのウィンドウを隙間無く配置します。
ハッチング部分はオブジェクトを表しています。
右側のオブジェクトは右側のウィンドウのクライアント領域いっぱいに配置しています。
ですが左側と下端のオブジェクトはそれぞれのクライアント領域にわずかに隙間を残しています。
これがフレームになります。
左側と下端のウィンドウはまずWM_NCHITTESTメッセージを監視します。
そしてこのメッセージを受け取ったウィンドウに応じてヒットテストの結果を返します。
そうすることであたかもサイズ変更可能なウィンドウの上にマウスが来ているかのような動作を起こすことができます。
このメッセージを受け取ることができるのはオブジェクトの重なっていない部分――つまり残された細い部分です。
フレームを左右上下に動かしてサイズを変更すると変更されたウィンドウにWM_SIZEが送られます。
ただし一つのウィンドウのサイズが変更されるとそれに応じて別のウィンドウのサイズも変更しなければなりません。
サンプル1でサイズ変更可能なウィンドウはトップレベルのウィンドウと左側、下端のウィンドウなので処理を3つ分書いています。
サンプル1は左側のオブジェクトの親ウィンドウがフレームの一部でした。
サンプル2ではフレーム用のウィンドウを余計に使うことでSleipnirのエクスプローラバーやTerapadの分割画面のように、スプリッターをスライドさせるときに棒状の影が表示されるように作ってみました。(実装は同じかどうか分からないですが何事も工夫が大事ということで・・・)
ただしカーソルに関してはシステムに用意されている左右両開き矢印を使っています。
ここでのポイントはフレーム用ウィンドウを非表示にしていること、というのが実装してみての感想です。