前回は矩形を挿入するために必要なレイヤーのクラスを作成しました。今回はダイアログを表示させて編集中の画像のなかに矩形を表示させる処理をおこないます。

まずダイアログのなかで発生するイベントはこれまでと同じです。

アップダウンコントロールがたくさんあります。矩形そのものの幅、高さ、回転角、それから実際にこのレイヤーを全体のどの部分にセットするか、そのときレイヤーは縦横に伸縮するのかを設定する必要があります。

ひとつのアップダウンコントロールの値が変化することで別のアップダウンコントロールの値が変更される場合があります。このとき値の変更がエンドレスでおきることを防ぐためにアップダウンコントロールがダイアログ内でアクティブコントロールなのかで処理をわけています。

まずダイアログが生成されたら仮のレイヤーを作成します。これをつかって確定前の図形を表示させます。確定ボタンがおされたら仮のレイヤーのもつデータを真のレイヤーにコピーしてデータを反映させます。

RectangleLayer.Bitmapプロパティを取得しようとすると、RectangleLayer内のプロパティからBitmapが生成されます。そこでその前に適切な値をセットする必要があります。そのための処理をしているのがOnBitmapChanging()メソッドです。

OnBitmapChanging()メソッドはチェックボックスやアップダウンコントロールの値を取得してRectangleLayer.BitmapプロパティからBitmapを取得できるようにするためのものです。またOnBitmapChanged()はRectangleLayer.BitmapプロパティからBitmapを取得したあと、アップダウンコントロールの値を設定したり、仮のBitmapを表示するためのものです。もしIsSetLayer == trueのときはメインフォームのScroolPictureBoxにもデータを反映させます。

ここから下はアップダウンコントロールの値が変更されたら新しく作成されたBitmapを表示します。

ここからは表示位置や表示サイズや変更されたときに仮のレイヤーであるTempLayer.Bitmapを適切な位置やサイズに変更して表示させる処理をおこなうものです。

GetExtendBitmap(Bitmap bitmap, int width, int height)メソッドはTempLayer.Bitmapを適切なサイズに変更するためのものです。

表示させたい矩形には色を設定することができます。境界線だけでなかは透明とか境界線と内部の色を変えることもできます。これもSelectedColorプロパティやSelectedInnerColorプロパティを変えることで新しくBitmapが生成されます。

checkBox1は内部を塗りつぶすか、checkBox1はオリジナルサイズで表示するかです。checkBox1がチェックされたらSelectedInnerColorを調べます。もし透明であれば境界線と同じ色が設定されます。そうでないならすでに設定されている色で内部が塗りつぶされます。チェックされていないのであれば内部は透明になります。

checkBox2はTempLayer.Bitmapで返された画像をnumericUpDownWidthの値とnumericUpDownHeightの値で拡大縮小するのか、それともTempLayer.Bitmapで返された画像にnumericUpDownWidthの値とnumericUpDownHeightの値を合わせるのかを設定します。実際の処理としてはチェックが入ったときにオリジナルサイズの値と画像に戻す処理をしています。

[仮止め]をクリックするとIsSetLayerプロパティがtrueにかわります。これ以降はアップダウンコントロールの値などを変化させることでメインフォームのScroolPictureBoxに画像が反映されます。そして[レイヤーの位置を確定する]をクリックすると確定します。単に「×」をクリックしてダイアログを閉じると反映された変更は破棄され、もとの画像に戻ります。

ダイアログを閉じようとしたときの処理です。これまでならこのようにしていたのですが・・・・

上記の方法だとダイアログを閉じようとすると毎回確認のダイアログが表示されます。しかも親ウィンドウを閉じようとしたときも同じような現象がおきます。ちょっとうっとうしいので単純に以下のようにします。

メニューから[レイヤーの追加] ⇒ [矩形を追加する]を選択したときはフィールド変数 Layerはnullです。もし既存のレイヤーを編集するときはLayerは非nullです。この場合、現在のデータをダイアログに読み込む必要があります。そのための処理はダイアログがロードされたときです。

あとはメインフォームからダイアログを表示して追加したいレイヤーを編集できるようにするだけです。

コンテキストメニューからも編集できるように以下を追加します。

またシリアル化できるように以下の処理も必要です。