選択領域を拡大したり縮小することができるようにします。また拡大縮小ができることを示すグリッパーも表示させます。

isMouseDownフラグがfalseのときマウスがクリックされるとIsPointInRectangleメソッドによって選択されている矩形内部でのクリックが判定されます。

矩形内部でのクリックである場合、OnMouseDownInBitmapRectangleメソッドのなかで以下のような処理がおこなわれます。IsMouseOnGriperメソッドはグリッパーがクリックされたかどうかを調べます。

グリッパーがクリックされた場合、フィールド変数dragGriperにその値が格納されます。またOnMouseDownForSizeChangeSelectionメソッドがよばれ、isMouseDownForSizeChangeフラグがセットされます。

列挙体GriperはGriper.Outは選択範囲の外、Griper.Inは選択範囲の内部であるけれどもグリッパーがある場所ではないことを示します。それ以外のときはグリッパーが選択されていることを示します。

IsMouseOnGriperメソッドは以下のようになっています。矩形の隅や各辺の中点であればグリッパーであると判断します。

マウスが移動したときはisMouseDownForSizeChangeフラグがセットされている場合はBitmapRectangle_MouseMoveForSizeChangeメソッドを呼びます。

まずはイベントハンドラPictureBox1_MouseMoveの追加部分を示します。

OnMouseMoveForSizeChangeSelectionメソッドはisMouseDownForSizeChangeフラグがセットされているとき(=選択範囲のサイズが変更されているとき)に呼び出されます。

注意することとして、どのグリッドをドラッグしているか、どの方向にドラッグしているかによってはBitmapRectangleのサイズがゼロになってしまうことがあります。そこでサイズと位置を変更したときにサイズがゼロにならないことを確認してからサイズ変更をおこなっています。

もしサイズがゼロになってしまう場合はサイズ変更を中止してstartPointとendPointに適切な座標を代入するとともに BitmapRectangle.UpdatePositionメソッドを呼ぶことでBitmapRectangleの位置とサイズを保存しています。

次に選択領域のサイズ変更中にマウスボタンが離されたときの処理です。

このときはOnMouseUpForSizeChangeSelectionメソッドが呼ばれてisMouseDownForSizeChangeフラグがクリアされます。またBitmapRectangle.UpdatePositionが呼ばれてBitmapRectangleの位置とサイズが保存されます。

そして次に選択領域外でクリックされたときにUniteBitmapRectangleメソッドが呼ばれて一体化されます。

これで選択領域を拡大縮小ができるようになりました。しかし表示されている内容は拡大縮小されません。これを可能とするためにはBitmapRectangleクラスに手をいれる必要があります。長くなったので次回に続きます。

選択領域と表示内容を拡大縮小させる C#で簡易画像編集ソフトをつくる(その14)