前回はレイヤーをつかった画像作成をやりました。今回はレイヤーの上下関係を変更します。レイヤーが重なっている場合は手前にあるレイヤーに描画されているものが表示されます。

ではさっそくやってみましょう。

まずデザイナでレイヤーを管理するためのダイアログを作成します。クラス名はLayerOrderFormです。リストボックスにレイヤーの一覧が表示され、選択するととなりのピクチャーボックスに画像が表示されます。

それから順序はドラッグ&ドロップで入れ替えます。

ではコードをみてみましょう。

ドラッグ&ドロップの操作ができるようにするためにはDragOverイベントとDragDropイベントを処理することになります。また両イベントが発生するようにするためにはListBox.AllowDropプロパティをtrueにする必要があります。

フィールド変数のLayersはレイヤーが格納されたリストをうけとるためのものです。

Loadイベントではフィールド変数Layersの情報から現在存在するレイヤーの名前をリストボックスに表示させます。

リストボックスの項目のうえでクリックされたら、項目の順番を入れ替えるためのドラッグが開始されたかもしれないことを意味してします。そしてそのままマウスボタンがおされたままMouseMoveイベントが発生したらドラッグの開始です。

ドラッグが開始されたらリストボックスの項目が選択されているかどうか調べて項目のうえであればListBox.DoDragDropメソッドをよびます。

DoDragDropメソッドにはクリックされた場所にある項目のインデックスをわたします。

ドラッグがおこなわれているときに e.Data.GetDataPresent(typeof(int)) == true;であれば項目がドラッグされていることになります。ドロップ先が適切な場所であればマウスカーソルの形状を「移動」にします。

ドロップされたら項目の順番を並べ替えます。Layersに格納されている要素の順番を変更したあと、いったんリストボックスの項目を全部削除して再挿入しています。

つぎにForm1側の処理を考えます。

メニューの[レイヤーの順番を変更する]が選択されたらLayerOrderFormオブジェクトを作成してForm1.Layersのコピーを渡します。あとはShowDialog()メソッドを呼び出せばダイアログが表示されます。

次にダイアログが[OK]をクリックされることで終了した場合の処理です。LayerOrderFormクラスから順番が変更されたLayersをうけとります。そしてPictureBox.Invalidate()メソッドを呼び出してピクチャーボックスを再描画させます。

レイヤーの上下関係から画像を描画します。下にあるレイヤーから描画していきます。