ワープロやドローイングソフトなどの編集ソフトを作る上での一般的な考え方を考える「一般的な編集ソフトの作り方」です。
ここでは、主に、
・メモリ上に、要素をもつ
・イベント発生時の動き
・画面の構成
ということで、現在、「イベント発生時の動き」をやっています。
その機能には、
・印刷
・保存
・読み込み
・カット(切り取り)
・ペースト(貼り込み)
・プロパティ(属性設定・変更)
・表示
・要素の選択
・(要素の)移動
とあると前回書いたのですが、まず初めに、要素が選択できないとしょーがないので、「要素の選択」からいきます。
■要素の選択
画面に表示されている図形、枠とか四角形とか写真とか、これらを、選択します。
普通たいていのソフトは、クリックしただけで、選択できるはずです(ダブルクリックとかもあるかもしれないけど)
そうすると、イベントとしては、画面のウィンドウの(X,Y)がクリックされたという情報が、プログラムにつたわります。
ということは、画面の位置X,Yが、どの要素か、あるいはまったくなにも書かれていないところかが分かればいいわけです。
■ウィンドウの位置X,Y→要素への簡単な変換法
これが、四角形とかなら、いいんです。
問題は、それらの要素は重なり合っていたり、複雑な図形(多角形、曲線など)になっているのに、どーしてクリックしただけでわかるかということです。
これは、複雑な方法を使っているものもありますが、超簡単に分かる方法もあります。
■画面表示以外にIDのバッファを持つ
1.画面表示用のグラフィックコンテキスト以外に、もうひとつ、画面に表示しないグラフィックコンテキスト(画面表示領域)をもちます。
→はじめ、このグラフィックコンテキストをrgb=(0,0,0)で初期化します。
2.オブジェクト(=各要素)には、常に一意のIDが、数字でついているとし、これは256X256X256以下の数とします(たいていそうです)
3.オブジェクトを画面に表示すると同時に、idを
256で割って、その商をrg、あまりをbとします。
rgをさらに256で割って、その商をr、あまりをgとします。
4.その結果得られたrgbで、1の画面に表示しない
グラフィックコンテキストに、
3で画面表示したのと同じ図形を、そのrgbの色で塗りつぶして書きます。
そうしておいて、クリックされてイベントがきたら、
5.受け取った(X,Y)座標から、4で書いたグラフィックコンテキストを
getPixelして、そこの色rgbを取得します。
6.idはr*256*256+g*256+bです。
そのIDの図形が選択されたことになります。
0なら、選択されていません。
インデックスカラーしか使えない場合は、rgbのところがそのインデックスになります。その場合の最大の要素数は、そのインデックスの最大値-1(初期値を除く)となります。
■IDから要素へ
IDから、要素を割り出すには、ファイル書き出しのところでやった、IDごとの配列を持っていると楽だったりします。
まあ、ループで全部のIDを調べてもわけないかもしれませんけどね。
と、こんなかんじで、要素の選択はおしまい