ウィンドウフレームの実装
Step-1
とりあえず、見た目から入ろう(笑。WindowsのコントロールBOXにあたる部分および最小化/閉じるボタンを描画してみた。ちなみにrapperは最大化があまり好きではないので、最大化ボタンは描画しなかった。あとはアクティブ/非アクティブの切り替え部分を修正しておしまい。この部分はタイトルバーの色を変えただけなので、特に難しいところはなかった。まあ、少し見た目が変わっただけなんだけど、ずいぶん印象が変わるもんだなぁと。今日のところはこれで満足。
アクティブと非アクティブの2つを表示。なかなかいいデキかも。
Step-2
無事見た目の変更がうまくいったところで、「閉じるボタン」の機能実装に入ろう。といっても、既に本編で実装自体はされているのだが、ボタンの境界が斜めになってしまった(!?)ので、クリックの判定条件を変更する、というのが正確な表現だ。この斜め境界の判定条件だが、特に難しい計算は必要ない。なぜなら、この境界は斜め45°になっているのだ。つまり、一次元方程式(y
= -x + a)で正確に座標を表すことができてしまうのだ。ああ、描画のとき45°にしておいて本当に良かった(笑。注意すべき点は、数学なんかで扱う座標系とは、y座標の符号が逆(下方向がプラス)になっていることくらいだ。判定条件の数(「&&」で結ばれる条件の数)も4つで変更前と変わらないので、処理速度にもさほど影響はないはずだ。さて、ボタンをクリック・・・うし、閉じた。(まあ、当たり前なんですが・・・)
端っこをクリックしてみます・・・ぉぉ、コンソールが閉じました!!
Step-3
次は〜〜「最小化ボタン」です。曲線、ゆるやかな斜め線は乗り換えです・・・。うう、判定条件は「閉じるボタン」と同様なので簡単なんだけど、本編では最小化の概念がでてこなかったので、そこから考えねば。とりあえずウィンドウ表示を消そうと思ったんだけど、現状、ウィンドウを消してしまったら二度と復活できないのだ。これじゃ「閉じるボタン」と見た目上一緒だあ。いくら横着なrapperでも「メモリに残ってるから安心してね、復活はできないけどいいよね」とは言うのは気が引けるので、アイコン化やタスクバーの制御なんかは後にするとしても、せめて復活機能くらいはつけておきたい。と、まずはウィンドウを非表示にするところから実装しよう。これを実現するためには、ウィンドウが描かれているシートの高さ(z方向の順序の意)を上下する関数を使う。この高さに負の値を指定すれば良い。この場合「-1」が高さの値となる。通常はシートが割り当てられた直後やクローズする直前にこの値をとる。そこで、新たに最小化を意味する値「-100」を保持できる様に関数を変更した。ウィンドウを復活させるための布石なのだ。実は非表示のための変更はこれで完了。意外に簡単だ、むははは。
最小化ボタンをクリック・・・むむ消えた。が、閉じたのと区別がつかない・・・。
Step-4
さ、続きを作りますよ。え〜となんだっけ? そうです、復活機能ですヨ。先にも書いた通り、ここではタスクバー制御なんかは後回しにして、とりあえず復活できる様にするのが先決。この機能は本編にはないので(最小化がないので当然ですね)、「F12」キーを押したときに、シートの高さが「-100」のシートを一番上に持ってくる関数を追加することにした。最小化しているウィンドウが1つずつ復活するので、複数最小化している場合は、その数分「F12」キーを押せば良い。逆に最小化ウィンドウが1つもない場合は何もしないので、ちょっとくらい押しすぎても安心だ。それでは安心してビビビビ・・・やりました、復活です!! と、ここでちょっと気になった。復活したときにウィンドウがアクティブにならない場合があるのだ。「F12」キーを押す前の状態がそのまま残っているので、当然といえば当然なのだが、ちょっと違和感があるので修正しておこう。作成した関数から復活したウィンドウのシートへのポインタを返す様にして・・・戻り値が0じゃなかったら(復活するウィンドウがあったら)、アクティブ化する・・・と。これで違和感がなくなりました。めでたいな。
F12キーを押して・・・見事ふっか〜つ!!
おまけ
せっかくなので、アプリのウィンドウもみせちゃいます。どーん。
こんな感じです。はりぼてOS代表アプリの揃い踏みです(笑。
|