編集している画像のうえで右クリックするとレイヤーを選択できるようにします。
Form1クラスでScroolPictureBoxクラスのPictureBoxMouseDownイベントを処理できるようにします。
1 2 3 4 5 6 7 8 9 10 11 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); scroolPictureBox1.BorderStyle = BorderStyle.None; scroolPictureBox1.PictureBoxMouseDown += ScroolPictureBox1_PictureBoxMouseDown; MenuItemLayers.DropDownOpening += MenuItemLayers_DropDownOpening; } } |
右ボタンがクリックされたらどのレイヤーに相当する部分かしらべてコンテキストメニューを表示します。GetLayerFromPointメソッドは座標からレイヤーを取得するためのものです。
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 |
public partial class Form1 : Form { private void ScroolPictureBox1_PictureBoxMouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { Layer layer = GetLayerFromPoint(new Point(e.X, e.Y)); if(layer != null) { // ContextMenuEx1クラスは後述 new ContextMenuEx1(this, layer); } return; } } Layer GetLayerFromPoint(Point pt) { // 複数のレイヤーが重なっている場合は最前面のものを取得したいので、 // Layersのなかで条件を満たすもののうち最後のものを取得する return Layers.LastOrDefault(x => x.Left < pt.X && pt.X < x.Right && x.Top < pt.Y && pt.Y < x.Bottom); } // 別のクラスからでもLayersを参照できるようにする public List<Layer> GetLayers() { return Layers; } } |
以下はコンテキストメニューを表示し、クリックされたときの処理をおこなうためのクラスです。これで編集用のダイアログが表示されます。
前回までのコードではShowStringLayerFormメソッドとShowImageLayerFormメソッドがprivateになっているのでpublicに変更しておいてください。
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 |
class ContextMenuEx1 { Form1 _form; public ContextMenuEx1(Form1 form, Layer layer) { _form = form; ContextMenuStrip contextMenuStrip = CreateContextMenuStrip(layer); contextMenuStrip.Show(Control.MousePosition); } ContextMenuStrip CreateContextMenuStrip(Layer layer) { ContextMenuStrip menuStrip = new ContextMenuStrip(); AddMenuEdit(menuStrip, layer); AddMenuBack(menuStrip, layer); return menuStrip; } void AddMenuEdit(ContextMenuStrip menuStrip, Layer layer) { ToolStripMenuItem item = new ToolStripMenuItem(); item.Text = "レイヤーを編集する"; item.Tag = layer; item.Click += Item_Click1; menuStrip.Items.Add(item); } void Item_Click1(object sender, EventArgs e) { ToolStripMenuItem mi = (ToolStripMenuItem)sender; Layer layer = (Layer)mi.Tag; // ShowStringLayerFormメソッドとShowImageLayerFormメソッドをpublicにすること if (layer is StringLayer) _form.ShowStringLayerForm((StringLayer)layer); else if (layer is ImageLayer) _form.ShowImageLayerForm((ImageLayer)layer); } } |
レイヤーが重なっている場合、一番上しか選択できないのはちょっと不便です。また重なり合った部分はどれを前面にして表示するかを変更できるようにします。
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 |
class ContextMenuEx1 { ContextMenuStrip CreateContextMenuStrip(Layer layer) { ContextMenuStrip menuStrip = new ContextMenuStrip(); AddMenuEdit(menuStrip, layer); AddMenuBackOne(menuStrip, layer); // これを追加 return menuStrip; } void AddMenuBackOne(ContextMenuStrip menuStrip, Layer layer) { ToolStripMenuItem item = new ToolStripMenuItem(); item.Text = "レイヤーをひとつ後ろに移動する"; item.Tag = layer; item.Click += Item_Click2; menuStrip.Items.Add(item); } void Item_Click2(object sender, EventArgs e) { ToolStripMenuItem mi = (ToolStripMenuItem)sender; Layer layer = (Layer)mi.Tag; // Layer.Zは10おきになっているので11だけ減らす。 // そのあとLayer.Zが小さい順にならべて再表示する layer.Z -= 11; _form.SetLayersZ(); _form.ShowLayers(); } } |
SetLayersZ()はLayer.Zを10おきに並べなおすメソッドです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public partial class Form1 : Form { public void SetLayersZ() { Layers = Layers.OrderBy(x => x.Z).ToList(); int i = 0; foreach (Layer layer in Layers) { layer.Z = i; i += 10; } } } |