領域選択がされている部分のコピーやカット、他の画像編集ソフトへのペーストができるように機能を追加します。
まずはメニューを追加しましょう。
あとはメニューで「範囲選択」が選択されていることを確認して以下のメソッドを呼び出します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public partial class Form1 : Form { private void CopyMenuItem_Click(object sender, EventArgs e) { if(EditMode == EditMode.Selection) userControlImage1.CopySelection(); } private void CutMenuItem_Click(object sender, EventArgs e) { if(EditMode == EditMode.Selection) userControlImage1.CutSelection(); } private void PasteMenuItem_Click(object sender, EventArgs e) { if(EditMode == EditMode.Selection) userControlImage1.PasteSelection(); } } |
CopySelectionメソッドは選択されている部分をクリップボードにコピーするメソッドです。
1 2 3 4 5 6 7 8 9 10 |
public partial class UserControlImage : UserControl { public void CopySelection() { if(BitmapRectangle == null) return; Clipboard.SetImage(BitmapRectangle.Bitmap); } } |
CutSelectionメソッドは選択されている部分をカットするためのメソッドです。カットはコピーしたあと選択部分を空白にします。また範囲選択も解除します。
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 |
public partial class UserControlImage : UserControl { public void CutSelection() { if(BitmapRectangle == null) return; Clipboard.SetImage(BitmapRectangle.Bitmap); Rectangle rect = BitmapRectangle.Rectangle; // どこも選択されていない状態にする BitmapRectangle.Dispose(); BitmapRectangle = null; startPoint = new Point(-1, -1); endPoint = new Point(-1, -1); Bitmap whiteBitmap = new Bitmap(rect.Width, rect.Height); Graphics g = Graphics.FromImage(whiteBitmap); g.Clear(Color.White); g.Dispose(); Bitmap newBitmap = new Bitmap(Bitmap); g = Graphics.FromImage(newBitmap); g.DrawImage(whiteBitmap, new Rectangle(rect.X, rect.Y, rect.Width, rect.Height), new Rectangle(0, 0, whiteBitmap.Width, whiteBitmap.Height), GraphicsUnit.Pixel); g.Dispose(); whiteBitmap.Dispose(); Bitmap = newBitmap; ShowBitmap(Bitmap); } } |
PasteSelectionメソッドはクリップボード内のデータがImageの場合、ペーストします。ペーストされる場所は画像が表示されている座標の(0,0)です。またペーストされるときに範囲選択されている場合はこれをクリアしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public partial class UserControlImage : UserControl { public void PasteSelection() { if(!Clipboard.ContainsImage()) return; if(BitmapRectangle != null) UniteBitmapRectangle(new Point(0, 0)); Bitmap image = (Bitmap)Clipboard.GetDataObject().GetData("System.Drawing.Bitmap"); Bitmap bitmap = new Bitmap(image); BitmapRectangle = new BitmapRectangle(bitmap, new Rectangle(new Point(ScrollBarPosX, ScrollBarPosY), image.Size)); Bitmap newBitmap = new Bitmap(Bitmap); Graphics g = Graphics.FromImage(newBitmap); g.DrawImage(BitmapRectangle.Bitmap, BitmapRectangle.Location); g.Dispose(); Bitmap = newBitmap; ShowBitmap(DrawBoderRectangle(Bitmap)); } } |