今回はレイヤーに読み込まれた画像を拡大したり縮小できるようにします。実際にビットマップを縮小してからもう一度拡大すると劣化した画像しか表示されないのでLayerクラスのBitmapプロパティは最初のオリジナル画像を保存しておき、表示サイズだけ変更するようにします。

こうなるとLayerクラスの既存のプロパティを変更するか新しいプロパティを作成する必要がありそうです。

前回、LayerクラスにWidthプロパティとHeightプロパティを作成しましたが、これはビットマップの幅と高さをそのまま返しているだけです。

レイヤーをつかった画像を保存する

最初はこれでいいとしてレイヤーのサイズを変更したときは別の値を設定できるようにしたほうがよさそうです。

BitmapプロパティがセットされたときはWidthプロパティとHeightプロパティはビットマップの幅と高さを返しますが、あとで任意の値に変更することができます。

レイヤーを管理するためにFormManagementLayerクラスとダイアログを作成します。左側にあるのはツリービューです。右にあるのはピクチャーボックスです。

ここでも選択されたものがなにかわかるようにイメージをとなりのピクチャーボックスに表示させています。また左上の座標と幅、高さを変更することができるようにしました。

ダイアログが表示されるときにツリービューにレイヤーの名前を挿入します。またアイテムが選択されたときにどのレイヤーが選択されているのかわかるようにTreeNode.Tagプロパティにレイヤーに関する情報をセットしています。

LayerInfoクラスを作成しているのは縦横の比率を維持したままサイズを変更することができるようにするためです。

ツリービューのアイテムが選択されたら対応するレイヤーの画像を表示させるとともにX座標とY座標、幅、高さを表示させます。またこれまで選択されていたレイヤーにはNumericUpDownコントロールで設定された値をセットします。

縦横の比を維持したままサイズ変更をするためにはnumericUpDownWidthとnumericUpDownHeightのValueプロパティが変化したときに適切な値を設定します。

また縦横の比を維持したままサイズ変更する場合は片方のNumericUpDownコントロールを無効にする必要があります。そこでラジオボタンの状態が変更されたらNumericUpDownコントロールの有効無効を切り替えます。

メニューで[レイヤーの情報を編集する]が選択されたらダイアログを表示させます。[OK]がクリックされたらFormManagementLayer.Layersの値をForm1.Layersにセットします。最後にPictureBox.Invalidate()メソッドを呼んで再描画させます。

PictureBox.Invalidate()メソッドが呼ばれるとイベントハンドラpictureBox1_Paintが実行されます。pictureBox1_Paintのなかでは変更されたレイヤーの情報を参照して再描画をしています。