範囲選択はマウスをつかって指定していましたが、ダイアログを表示させて数値を入力することでできるようにします。またすでに選択されている位置を修正することもできるようにします。
範囲選択の座標を数値で指定できるようにする
まず範囲選択したい部分を指定する場合について考えます。
デザイナで以下のようなフォームを作成します。
範囲選択をするためのメソッド
つぎに座標を指定したら範囲選択をすることができるメソッドを作成します。
2点を指定したらあとはOnMouseUpForSelectRectangle()と同じような処理になります。同じような処理なのでそのためのメソッドを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
public UserControlImage() { void SelectRectangle() { // すでにstartPoint, endPointの2点は確定している。 isMouseDown = false; Rectangle rect = GetRectangle(startPoint, endPoint); if(rect.IsEmpty || rect.Width == 0 || rect.Height == 0) { startPoint = new Point(-1, -1); endPoint = new Point(-1, -1); return; } Bitmap bitmap = new Bitmap(rect.Width, rect.Height); Graphics g = Graphics.FromImage(bitmap); Rectangle destRect = new Rectangle(0, 0, rect.Width, rect.Height); g.DrawImage(Bitmap, destRect, rect, GraphicsUnit.Pixel); g.Dispose(); BitmapRectangle = new BitmapRectangle(new Bitmap(bitmap), rect); g.Dispose(); if(blankBitmap == null) CreateBlankBitmap(BitmapRectangle.Rectangle); } void OnMouseUpForSelectRectangle() { SelectRectangle(); } public void SelectRectangle(int x, int y, int width, int height) { if(BitmapRectangle != null) UniteBitmapRectangle(new Point(0, 0)); startPoint = new Point(x, y); endPoint = new Point(x + width, y + height); SelectRectangle(); // 境界線を描画するために必要 InvalidatePictureBox(); } } |
SelectRectangleFormクラスの作成
つぎにダイアログの処理を考えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
public partial class SelectRectangleForm : Form { public SelectRectangleForm() { InitializeComponent(); numericUpDownSelectionX.ValueChanged += NumericUpDownSelectionX_ValueChanged; numericUpDownSelectionY.ValueChanged += NumericUpDownSelectionY_ValueChanged; numericUpDownSelectionWidth.ValueChanged += NumericUpDownSelectionWidth_ValueChanged; numericUpDownSelectionHeight.ValueChanged += NumericUpDownSelectionHeight_ValueChanged; } public UserControlImage userControlImage = null; public int SelectionX { get; set; } = 0; public int SelectionY { get; set; } = 0; public int SelectionWidth { get; set; } = 0; public int SelectionHeight { get; set; } = 0; private void NumericUpDownSelectionX_ValueChanged(object sender, EventArgs e) { SelectionX = (int)numericUpDownSelectionX.Value; if(SelectionWidth != 0 && SelectionHeight != 0) userControlImage.SelectRectangle(SelectionX, SelectionY, SelectionWidth, SelectionHeight); } private void NumericUpDownSelectionY_ValueChanged(object sender, EventArgs e) { SelectionY = (int)numericUpDownSelectionY.Value; if(SelectionWidth != 0 && SelectionHeight != 0) userControlImage.SelectRectangle(SelectionX, SelectionY, SelectionWidth, SelectionHeight); } private void NumericUpDownSelectionWidth_ValueChanged(object sender, EventArgs e) { SelectionWidth = (int)numericUpDownSelectionWidth.Value; if(SelectionWidth != 0 && SelectionHeight != 0) userControlImage.SelectRectangle(SelectionX, SelectionY, SelectionWidth, SelectionHeight); } private void NumericUpDownSelectionHeight_ValueChanged(object sender, EventArgs e) { SelectionHeight = (int)numericUpDownSelectionHeight.Value; if(SelectionWidth != 0 && SelectionHeight != 0) userControlImage.SelectRectangle(SelectionX, SelectionY, SelectionWidth, SelectionHeight); } } |
あとはメニューを選択したらダイアログを表示させて処理をおこなわせるだけです。
1 2 3 4 5 6 7 8 9 |
public partial class Form1 : Form { private void SelectRectangleFromDialogMenuItem_Click(object sender, EventArgs e) { SelectRectangleForm form = new SelectRectangleForm(); form.userControlImage = this.userControlImage1; form.ShowDialog(); } } |