領域が選択されているときに[コピー]を選択すればクリップボードに転送します。これによって複数起動した場合、同時並行的に作業が進められるので効率的だと思います。
選択されているかどうかは、Form1クラスのフィールド変数(リスト)SelectionXYsの要素数が0かどうかでわかります。0でなければ選択されています。
まずSelectionXYs内の要素を調べて、XY.XとXY.Yのそれぞれ最大であるものと最小であるものを調べます。これでパネルを選択している矩形の座標とサイズがわかります。それがわかったら矩形内のパネルの色をしらべてビットマップをつくります。
ビットマップが作成されたらこれをクリップボードのなかに格納します。
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 |
public partial class Form1 : Form { private void CopyPanelsToolStripMenuItem_Click(object sender, EventArgs e) { CopySelectedPart(); } void CopySelectedPart() { if(SelectionXYs.Count == 0) { MessageBox.Show("どこも選択されていません", "エラー"); return; } int minX = SelectionXYs.Min(x => x.X); int maxX = SelectionXYs.Max(x => x.X); int minY = SelectionXYs.Min(x => x.Y); int maxY = SelectionXYs.Max(x => x.Y); int x1 = minX; int y1 = minY; int width = maxX - minX + 1; int height = maxY - minY + 1; Bitmap bitmap = new Bitmap(width, height); ClearSelectionForSaveUndobuf(); for(int colum = 0; colum < width; colum++) { for(int row = 0; row < height; row++) { bitmap.SetPixel(colum, row, panels[colum + x1, row + y1].BackColor); } } RestoreSelectionAfterSaveUndobuf(); Clipboard.SetData(DataFormats.Bitmap, bitmap); } } |
メニューの[ペースト]が選択されたら、クリップボード内のデータがBitmapであるかどうか調べます。クリップボード内のデータがBitmapであるなら、今度はマウスポインタがどのパネルの上にあるのか調べます。
1 |
Control.MousePosition; |
これでマウスポインタの位置(スクリーン座標)がわかるので、親のパネル(32×32のパネルの親パネル)における座標を調べます。各パネルのサイズは14ピクセルなので、割り算をして整数部分をとりだせば、マウスポインタがどのパネルの上にあるかがわかります。
別の32×32ピクセルのビットマップを作成して、現在の全パネルの色をBitmap.SetPixelメソッドでセットします。次にその32×32ピクセルのビットマップにさきほどクリップボードから得られたビットマップを描画します。描画位置はマウスポインタのある位置、サイズは取得されたサイズでです。
あとは32×32ピクセルのビットマップがどうなっているかGetPixelメソッドで調べて、全パネルに反映させます。
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 |
public partial class Form1 : Form { private void PastePanelsToolStripMenuItem_Click(object sender, EventArgs e) { PasteSelectedPart(); } void PasteSelectedPart() { // クリップボードのデータはBitmapか? if(Clipboard.ContainsData(DataFormats.Bitmap)) { Bitmap bitmap = (Bitmap)Clipboard.GetData(DataFormats.Bitmap); // マウスポインタがどのパネルの上にあるかを調べる Point pt = Control.MousePosition; pt = panel1.PointToClient(pt); int x = pt.X / 14; int y = pt.Y / 14; // 別に32×32ピクセルのビットマップを作成 Bitmap bitmapAll = new Bitmap(32, 32); for(int colum = 0; colum < 32; colum++) { for(int row = 0; row < 32; row++) { bitmapAll.SetPixel(colum, row, panels[colum, row].BackColor); } } // クリップボードから取得したビットマップデータを描画する Graphics g = Graphics.FromImage(bitmapAll); g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; g.DrawImage(bitmap, new Rectangle(x, y, bitmap.Width, bitmap.Height)); g.Dispose(); // ビットマップデータをパネルに反映させる for(int colum = 0; colum < 32; colum++) { for(int row = 0; row < 32; row++) { panels[colum, row].BackColor = bitmapAll.GetPixel(colum, row); } } bitmapAll.Dispose(); } } } |